TheCurious
TheCurious

Reputation: 613

Stripe immediate payment on each quantity update

We are using Stripe as the payment gateway, and we have a yearly plan i.e .billing cycle of the plan is 1 year.

Within the billing cycle, the user can update opt for more seats which will result in increasing the quantity for the subscribed plan.

Subscription subscription = Subscription.retrieve(paymentDetails.getSubscriptionId());
int currentQuentity = subscription.getQuantity();
Map<String, Object> updateParams = new HashMap<String, Object>();
updateParams.put("quantity", (currentQuentity + changeInQuantity));
subscription.update(updateParams);

So for any update stripe refunds(if quantity reduces) and charges(if quantity increases) at the end of billing cycle prorated.

In our business logic, we need immediate payment (charges or refunds) on each quantity update rather then on end of billing cycle. Is there any way in the stripe to achieve so.

Upvotes: 3

Views: 2543

Answers (5)

Евгений
Евгений

Reputation: 1

You can achieve the expected behavior by setting the following parameters when creating a subscription: PaymentBehavior = "default_incomplete" ProrationBehavior = "always_invoice"

With these settings, invoices will be automatically created and charged to the default payment method when the subscription is updated.

Upvotes: 0

Frenchcooc
Frenchcooc

Reputation: 1080

You can also set proration_behavior to always_invoice and Stripe will apply both a proration and immediately invoice your customer (source).

Here's an example in curl:

curl https://api.stripe.com/v1/subscriptions/sub_HE... \
  -u "sk_test_MI...:" \
  -d "items[0][id]=si_Il3Z..." \
  -d "items[0][quantity]"=2 \
  -d "proration_behavior=always_invoice"

Upvotes: 0

Tamdim
Tamdim

Reputation: 1192

The accepted answer is the solution if you want to maintain the same billing dates for the subscription.

A simpler solution if you need to push the billing cycle forward to that of the date of the change is to simply set the 'billing_cycle_anchor' to 'now' when updating the subscription. Stripe will immediately charge the user and apply and prorations.

example in python

stripe.Subscription.modify(
  subscription_id,
  billing_cycle_anchor = 'now',
  ......
)

Upvotes: 0

dearsina
dearsina

Reputation: 5202

I spent a lot of time trying to figure this one out, I hope I can save someone else some time. To take payment for a change of quantity or subscription plan, you need to do the following:

  1. Update subscription with the new changes.
  2. Create an invoice. The thing that confused me by this is that Stripe magically knows to only invoice for the updated subscription items, and not for upcoming billing cycle items.

  3. Retrieve the newly created invoice

  4. Finalise the invoice
  5. Take payment for the invoice This assumes that your customer has a payment method stored.

Only when all of the steps have been completed, you've successfully charged for the subscription change (and charged for the change only). You can do it all of it in one go. The customer should get an invoice email from Stripe at the end of it.

What makes matters complicated for me, is that reading from the documentation, I got the impression that Stripe will automatically do all of this for me as long as the subscription is set to "billing": "charge_automatically". This is not the case, and in Stripe's defence, they mention it at the bottom of the documentation page related to upgrading and downgrading plans:

If you want the customer to immediately pay the price difference when switching to a more expensive plan on the same billing cycle, you need to generate an invoice after making the switch.

Upvotes: 6

shan kulkarni
shan kulkarni

Reputation: 855

To charge immediately after subscription update, you need to create an invoice just after the subscription update. This will result in an immediate charge

To create invoice you can simply call:

Stripe.apiKey = "sk_test_BQokikJOvBiI2HlWgH4UWQfQ2";

Map<String, Object> invoiceParams = new HashMap<String, Object>();
invoiceParams.put("customer", "cus_D2XUIsncG7YUX");

Invoice.create(invoiceParams);

Ref (https://stripe.com/docs/api#update_subscription):

enter image description here

Upvotes: 2

Related Questions