Stripe gateway / upgrade code double-billing

Just running 1st tests of the Stripe Gateway – FYI we’ve been using PayPal for 12 years and finally switching over.

In this test we (1) made a monthly recurring sub
(2) immediately added 12 months to this using a std upgrade sc.

The result gave the user total of 12 months from today’s date.
They should’ve gotten 12 months in addition to the first month subscription.
While not technically “double billing” it is more accurately, incorrect start date of an upgrade membership.

*Note – yes did confirm the amount billed in the stripe dashboard.

Testing again with 1st, (1) a one month 12 month product non-recurring and then after login (2) immediately buying another 12 month product non-recurring – everything works as expected no double billing.

Looking into this more closely, I realized this is actually standard s2Member behavior—and in this situation, it essentially rips off the customer.

If someone switches from a monthly recurring subscription to a fixed 12-month membership mid-month, s2Member simply sets the new EOT to 12 months from the purchase date. It ignores the remaining time the customer has already paid for, so the customer effectively pays twice for those days.

I’m surprised Jason designed it this way, because it’s not difficult to account for the unused paid time. It also explains the occasional complaints I’ve received over the years from customers whose memberships ended earlier than they expected. I assumed these were glitches and simply gave them credit. Turns out, it’s by design.

FYI, guys, here’s what should be done

When monthly → 12-month Buy Now: cancel future monthly billing → determine the end of the monthly period they’ve already paid for → add 12 months from that date → write that resulting date as their EOT.ii

I have minimum 1 year, so if more than 1 month left subscription isn’t available and only fixed amount of time. The right thing would be to add it afterwards - starting say 6 months later would be problematic with payment providers. Stripe Radar or banks need first payment within a timeframe of validation. So have eot2, which is all the time that will be added to the account after expiry of the subscription. Putting say 2 years free trial and then first yearly payment would be very bad solution as payment would likely bounce.

Same for allowing customers who have a subscription pay more and then add it on once whenever their subscription expires.

Yes! The problem is an S2 member issue though I verified it using the PayPal gateway as well as stripe & it’s simply this: if you upgrade from a subscription to fixed time membership you LOSE the remaining time on your sub.

That’s why as long as it’s this way you need to show the checkout form with conditionals depending on the status if the client.
I know it’s not optimal but the best solution with it being that way.

It’s been quite often discussed already on the forum.

Ok thanks – I’m digging in to the forum now to find these discussions…

Not finding anything actionable or real dscussion about a remedy for this issue… If you happen to know of a good thread to read please post it for me :wink:

Heres how I would make the logic work:

  1. Customer currently has a recurring monthly subscription .
  2. Suppose their latest monthly payment covers them through September 8 .
  3. On August 20 , they purchase your fixed 12-month plan.
  4. The plugin detects that this is an upgrade from recurring → fixed-term.
  5. It cancels the recurring subscription so there will be no September 8 renewal.
  6. It preserves the customer’s existing paid-through date: September 8 .
  7. It changes the new EOT from the s2Member-generated date of August 20, 2027 to September 8, 2027 .

So the customer receives:

remaining monthly entitlement + 12 full months

rather than losing the unused portion of the month.