I'm using stripe for payment in my react and nodejs app. The scenario is like this:
Suppose a customer buys 1 quantity of my plan on Oct 1 (my plans have quantities).
Now, on 15 Oct, the customer decides to switch from 1 quantity to 5 quantities. Now I want to charge the customer for the new 5 quantities right now (since customer has already paid for 1). Update the subscription to prev+new quantity, i.e, 1+5=6 quantity.
Now I want the subscription to count 6 quantities and go for the remaining days as 6 quantity. Next month, the plan automatically starts with 6 quantity for the customer
What I have tried is to update the subscription like this:
const updateSubscriptionFunc = (subscriptionId, newTotalQuantity) => {
return new Promise(async (resolve, reject) => {
try {
console.log("entered in update subascription", subscriptionId, newTotalQuantity)
let subscription = await stripe.subscriptions.retrieve(
subscriptionId
);
// console.log(subscription.items.data)
// console.log("subscriptionitem id",subscription.items.data[0].id)
const subscriptionItem = await stripe.subscriptionItems.update(
subscription.items.data[0].id, { quantity: newTotalQuantity }
)
console.log("subscription item", subscriptionItem)
subscription = await stripe.subscriptions.update(
subscriptionId, { proration_behavior: "always_invoice" }
);
console.log("subscription", subscription)
resolve()
} catch (err) {
reject(err)
}
})
}
You're calling a Subscription Item update for the quantity change, then a Subscription update with
proration_behavior.This is redundant, but also,
proration_behavioronly applies to the call it's in, so it's not affecting the quantity change at all.Because you don't set
proration_behaviorin your Subscription Item update, it's defaulting tocreate_prorationsfor that call, which is not what you want.In your Subscription update, you do set
proration_behavior:'always_invoice', but since there's no quantity update in that call, there are no prorations.Here is what I would do (only this, no item update):
It's my personal preference, now you could get the same result with the SubscriptionItem update (and no sub update):
I prefer making all changes at Subscription-level and not at SubscriptionItem-level, because I find it much easier to keep control over, and to troubleshoot if something goes wrong.
This will send an Invoice right then for the prorations generated from the update, but keep your Subscription billing at the same date.