Skip to main content

We’ve got a SaSS business where there are monthly subscriptions. At any time, a customer can upgrade or downgrade and we handle the changes as you’d expect even if it happens mid month.  There is fundamental questions on how to model this in amplitude, and I’m shocked there is no guidance that I can find in community or help docs.

 

It’s highly likely I’ve missed something, so if I have, happy to get pointed to definitive guides for this!

 

I see in the Node.js SDK the Revenue tracking calls:

https://www.docs.developers.amplitude.com/data/sdks/typescript-node/#revenue-tracking

This is the example:

import { Revenue, revenue } from '@amplitude/analytics-node';

const event = new Revenue()
.setProductId('com.company.productId')
.setPrice(3.99)
.setQuantity(3);

revenue(event, {
user_id: 'user@amplitude.com',
});

 

That example makes sense.. kind of.  What i’m understanding here is that you have discrete revenue event to account to help power revenue charts like the Revenue LTV.

Here are 3 scenarios that are super common in subscription businesses:

 

Scenario 1: New user subscribes to paid plan

User signs up and pays for a plan as a new subscriber.

Scenario 2: Paid user downgrades to cheaper paid plan

User downgrades mid month / mid billing cycle. How most services, including us, handles it is like this:  User retains access to their existing higher priced paid until end of month, but then at 1st day of next month, they are billed for their cheaper plan.  (e..g $20 vs $10/month).

Scenario 3: Paid user upgrades to more expensive paid plan

Same as scenario 2, except at mid month they upgrade to higher plan (so going from $10 to $20/month). We recognize the price difference, give them credit for the remaining time on old plan (so $5) and then charge them prorated price of the new plan (half of month of $20/month plan is $10). So the net price they pay is $5 for this month.  On 1st of next month they pay $20.

 

Given these scenarios, my mind is melting in how to model this.  

  • If we just do server side Revenue() calls, there is no event tracked specifically for the upgrade and downgrade and this seems to be a problem.  Even though we can see “Revenue Events” in charts, it’s so non specific what it was (e.g. Subscription Upgraded vs Subscription Downgraded vs Subscription Renewed).
  • Given this, my thought was that we fire events for the plan upgrade/downgrade/renewal but do not attach any revenue properties to the events.  Instead, we fire those events, but also fire Revenue() calls to provide the real accounting of revenue impact.
  • Assuming this is correct, can anyone advise on how specifically to model the revenue() call for Scenario 3?  It’s a mid-month upgrade, and there doesn’t seem to be an obvious “revenue_type” property to define. Is this something we cusotmize within the “properties” JSON Object?

@trevin-bc great questions, and good call out that we need to beef up content in both community and Help Center. I’ve escalated your question to our support team so they can give this more attention. They’ll reach out to you directly and I’ll post the answer back here for more members to benefit.


Hi @trevin-bc ! Welcome to the Amplitude Community 👋

I synced internally - it looks like you are on our Growth plan and therefore received a response from an Amplitude team member in regards to this inquiry! Hope the response helped and please do not hesitate to follow-up if you have any questions. 

In the meantime, I’m sharing the response here as well for posterity :) 

Based on the scenarios you described, a Revenue() event should be fired for upgrades and downgrades as well. Our Revenue events do support negative values. So in the case where someone downgrades and it's been confirmed/recognized by your payment platform, you can send another revenue event with a negative value for the "price" event property. 

 

The revenue_type" event property can track if revenue type is a refund/upgrade. For the prorated scenario, you can set "revenue_type = upgrade credit" with a negative price for the credit and then send another revenue event with "revenue_type = prorated charge" that has the remaining amount they owe.

 

And yes, to better track the upgrade/downgrade funnel, you can send in client-side events without the protected revenue properties to track when users complete the upgrade/downgrade flow. Most of our clients take this approach.


Reply