Make line item quantities adjustable
Enable your customers to adjust the quantity of items during checkout.
The line items for each Checkout Session keep track of what your customer is purchasing. You can configure the Checkout Session so customers can adjust line item quantities during checkout.
Create a Checkout Session with an adjustable quantity
Set adjustable_ on your line_ when creating a Checkout Session to enable your customers to update the quantity of an item during checkout.
You can customize the default settings for the minimum and maximum quantities allowed by setting adjustable_ and adjustable_. By default, an item’s minimum adjustable quantity is 0 and the maximum adjustable quantity is 99. You can specify a value of up to 999999 for adjustable_.
When using adjustable quantities with a line_ value greater than 99 (the default adjustable maximum), set adjustable_ to be greater than or equal to that item’s quantity.
If you use adjustable quantities, change your configuration so that it uses adjustable_ when creating the Checkout Session to reserve inventory quantity instead of the line_ quantity.
Checkout prevents the customer from removing an item if it’s the only item remaining.
curl https://api.stripe.com/v1/checkout/sessions \ -u ":" \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][price_data][tax_behavior]=exclusive" \ -d "line_items[0][adjustable_quantity][enabled]=true" \ -d "line_items[0][adjustable_quantity][minimum]=1" \ -d "line_items[0][adjustable_quantity][maximum]=10" \ -d "line_items[0][quantity]=1" \ -d "automatic_tax[enabled]=true" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/success"sk_test_BQokikJOvBiI2HlWgH4olfQ2
Handle completed transactions
After the payment completes, you can make a request for the finalized line items and their quantities. If your customer removes a line item, it’s also removed from the line items response. See the Fulfillment guide to learn how to create an event handler to handle completed Checkout Sessions.
Note
To test your event handler, install the Stripe CLI and use stripe listen --forward-to localhost:4242/webhook to forward events to your local server.
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/apikeys require 'stripe' # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. client = Stripe::StripeClient.new() require 'sinatra' # You can find your endpoint's secret in your webhook settings endpoint_secret = 'whsec_...' post '/webhook' do event = nil # Verify webhook signature and extract the event # See https://stripe.com/docs/webhooks#verify-events for more information. begin sig_header = request.env['HTTP_STRIPE_SIGNATURE'] payload = request.body.read event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret) rescue JSON::ParserError => e # Invalid payload return status 400 rescue Stripe::SignatureVerificationError => e # Invalid signature return status 400 end if event['type'] == 'checkout.session.completed' checkout_session = event['data']['object'] line_items = client.v1.checkout.sessions.line_items.list(checkout_session['id'], {limit: 100}) # Fulfill the purchase... begin fulfill_order(checkout_session, line_items) rescue NotImplementedError => e return status 400 end end status 200 end def fulfill_order(checkout_session, line_items) # TODO: Remove error and implement... raise NotImplementedError.new(<<~MSG) Given the Checkout Session "#{checkout_session.id}" load your internal order from the database here. Then you can reconcile your order's quantities with the final line item quantity purchased. You can use `checkout_session.metadata` and `price.metadata` to store and later reference your internal order and item ids. MSG end'sk_test_BQokikJOvBiI2HlWgH4olfQ2'