Skip to content

feat(billing): raise Pro to $9/mo or $72/yr (grandfather $5/$48) - #37

Merged
mapzimus merged 1 commit into
masterfrom
cursor/pro-price-raise-92b4
Aug 1, 2026
Merged

feat(billing): raise Pro to $9/mo or $72/yr (grandfather $5/$48)#37
mapzimus merged 1 commit into
masterfrom
cursor/pro-price-raise-92b4

Conversation

@mapzimus

@mapzimus mapzimus commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Why

A1 (spreadsheet → map) and A2 (cloud My Maps) are live on master. Per the monetization sequence, new Pro is now $9/mo or $72/yr. Existing $5/$48 subscribers stay on their Stripe Price (grandfathered).

What

  • Checkout accepts plan: "monthly" | "annual" and resolves live price IDs from STRIPE_PRO_MONTHLY_PRICE_ID / STRIPE_PRO_ANNUAL_PRICE_ID
  • Legacy price_1THabF… ($5 / $48) IDs are rejected for new checkouts so nobody new can buy the old rate
  • Existing subscriptions keep billing at their original Stripe Price automatically (no migration / no cancel)
  • UI: /pricing, upgrade modal buttons, banner, SEO meta → $9 / $72 (save 33%)
  • Upgrade feature grid highlights spreadsheet → map + cloud My Maps
  • npm run smoke:checkout covers wiring; npm run validate PASS

Manual steps for Max (required before checkout works at the new price)

  1. In Stripe Dashboard → Product (Tappymaps Pro) create two new Prices:
    • $9 USD / month recurring
    • $72 USD / year recurring
      Leave the old $5 / $48 Prices active (do not delete — grandfathered subscribers use them).
  2. In Vercel → Environment Variables set:
    • STRIPE_PRO_MONTHLY_PRICE_ID=price_… (new $9)
    • STRIPE_PRO_ANNUAL_PRICE_ID=price_… (new $72)
  3. Redeploy (or merge this PR, which redeploys). Confirm a test checkout shows $9 / $72.
  4. Optional: confirm an existing $5 subscriber still shows active via verify-subscription (webhook already stores whatever price_id Stripe sends).

Out of scope (next)

  • Classroom tier at $12/mo (class code + worksheet PNG pack)
Open in Web Open in Cursor 

New checkouts use plan keys (monthly|annual) resolved from
STRIPE_PRO_*_PRICE_ID env vars. Legacy $5/$48 Stripe price IDs stay on
existing subscribers and are rejected for new checkouts. UI, pricing
page, and upgrade modal updated; feature grid highlights spreadsheet
import + cloud My Maps.

Co-authored-by: Max <mhowe.gis@gmail.com>
@vercel

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mapparatus Ready Ready Preview Aug 1, 2026 5:08am
tappymaps Ready Ready Preview Aug 1, 2026 5:08am

@mapzimus
mapzimus marked this pull request as ready for review August 1, 2026 21:53
@mapzimus
mapzimus merged commit ddefaad into master Aug 1, 2026
4 checks passed
cursor Bot pushed a commit that referenced this pull request Aug 1, 2026
Master landed the $9/$72 Pro raise while this branch already contained
that work plus Classroom. All conflicts were same-file supersession —
kept Classroom (HEAD) versions and folded in master's Cancel-anytime
pricing note.

Co-authored-by: Max <mhowe.gis@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants