PostHog Handbook Library / Growth

1,408 words. Estimated reading time: 7 min.

Shipping a pricing change

Auto TL;DR

At a Glance

This long page covers these main areas. The list is generated from the article headings, so it updates with every handbook rebuild.

  1. RFC
  2. Do the analysis first
  3. Format
  4. Constraints
  5. Write it
  6. Reviewers
  7. Review process
  8. Implementation

Pricing principles covers what we charge for and the principles we hold ourselves to. This page covers the actual work: what you analyze and write, who reviews, who you communicate changes to, and in what order.

Budget roughly six weeks from the first draft of your RFC to migration/launch day. This is definitely a cross-team effort, so communicate changes openly and early to get it across the line effectively.

RFC

Do the analysis first

The RFC is where you show your work and your thinking, so do the work before you open the PR. This often contains:

  1. New prices, modeled against old prices and competitors, with real usage data. A single "they charge $X" comparison isn't enough. Ideally show this with either modeled scenarios or real user data, so you can see how a customer's bill compares against competitors and how it will change.
  2. Revenue changes. Will we make more or less money? How much will it change by?
  3. Unit economics. What does it cost us to serve, and what's the margin at each tier?
  4. Revenue dynamics. For example, how does the change shift the revenue concentration on your biggest customers?
  5. At-risk revenue. We can't always be the cheapest if competitors use different pricing models. If price changes include an increase and may cause churn risk, model it.

This isn't an exhaustive list. If something here is irrelevant, remove it. If something else is relevant, add it.

Format

This should be formatted in a way that is easy to read and review. A spreadsheet is the common way and can be linked to in the RFC (Example spreadsheet).

Constraints

Your pricing is also constrained by the product architectures billing supports. Check the product definition guide in the billing repo while working through your pricing.

Write it

Open an RFC in requests-for-comments-internal. Include the breakdown above, what this does to existing customers, and your analysis / spreadsheet, and be explicit about what you're not changing. Deferring a decision is fine but mention it and why you've decided to defer. We don't want to be changing prices too often so there should be a reason why we're not bundling the changes together.

For existing customers, grandfather the old pricing. For beta-to-GA price changes, the grandfathering period is usually 1 month. For changes to existing GA pricing, it's usually 2 months.

Reviewers

Get a mix. At minimum:

Review process

You do not need full consensus. You are ultimately the driver but each reasonable objection should be resolved or answered. A good RFC will have discussion around it, so buffer in time for answering questions, additional research, and a possible revision or two.

Implementation

Once you've decided to move ahead with your new pricing scheme, you can begin implementing. Implementing a pricing change can often feel like juggling because you're working across a few teams with a single launch date. Communicating publicly and early helps.

The moment you have a launch date (mentioned below), tell everyone who has to do work:

Giving at least two weeks' notice is ideal. If billing hands you a date less than two weeks out, which happens because they move fast, tell everyone ASAP. Below covers how to work with each team.

To make this a smooth process, it helps to start with a new "Grandfathering" tab in the spreadsheet with the following data for the orgs you are grandfathering:

This can be created with the building-usage-and-revenue-dataset skill and is used across billing changes, customer outreach, the email blast, etc., so it will let you easily work with all the necessary teams as you implement the changes.

You can also add large customers (of other products) who are close to crossing the free tier even though they aren't paying yet.

Billing

Kick off with the billing-pricing-changes skill in the billing repo. It generates the pricing PR, then billing takes it from there.

Billing then gives you migration date options based on their capacity and what else is queued. This date is your launch date. It's when new customers get the new price and when the grandfathering clock starts for everyone else.

The first thing they'll need is that "Grandfathering" tab as they use the list of org IDs to grandfather accounts when the pricing changes go into effect.

Notifying

Split by whether the account is managed.

Managed accounts

TAMs, AEs, and CSMs handle these. Post the spreadsheet in #group-cs-sales-support with an overview of the changes and the reason why.

This is where the old bill, estimated new bill, and account owner become useful. Everyone can communicate the pricing changes clearly to their respective accounts.

Non-managed accounts

PMMs typically write the emails but if your product doesn't have one, #team-marketing will help. Start from a recent pricing-change email (ask the PMs) rather than a blank page.

If the price is going up, the email should say so plainly. Don't talk around it.

Build it in Workflows: an email step, a static cohort of the grandfathered orgs' owners and admins, and a batch trigger filtered on that cohort. Exclude managed accounts. Those customers are getting a conversation instead.

You can schedule the send or send it manually on the day, once you know the migration went fine.

The email should come from you or the PMM, not a generic address.

Start the sender permission on day one. Being added as an approved sender needs project 2 admin, and finding someone who can do it can take days. It's the longest-lead item on this whole list, and a two-minute job for the right person. Ask in #team-workflows.

Marketing

Docs, blogs, and the pricing page

The pricing page calculator updates from the billing migration, but double-check it renders. Most product page calculators pull from the same billing API, so they update too. The exception is a product with a custom pricing logic (like /replay-vision/pricing for a launch promo). Check that's not the case for your product. Additionally, have an agent comb the posthog.com repo for the old price. It shows up in more places than you'd expect: product docs, comparison blog posts, "best X tools" roundups with worked cost examples, and SEO descriptions. Some pages carry a "pricing current as of" date that needs bumping too.

The paid ads team runs ads with your price in them, on Google, LinkedIn, Reddit, and more. Give them the date with the same two weeks' notice as everyone else, and tell them you've already handled docs and blogs so they only need to worry about ad copy.

Launch day

Internal. Post in #tell-posthog-anything with the before and after tables, the grandfathering terms, and a link to the RFC. Add any other important information, like whether the change is margin positive.

External. Check with billing that the migration went through and confirm the email went out.

Launch checklist

After launch checklist

Canonical URL: https://posthog.com/handbook/growth/shipping-a-pricing-change

GitHub source: contents/handbook/growth/shipping-a-pricing-change.md

Content hash: ea508e514e8a6bbe

Static reader notes
  • MDX_COMPONENT_STATIC_ADAPTER: Adapted interactive MDX components for static reading: PrivateLink.