Skip to content

feat(classroom): $12/mo tier — class codes + worksheet PNG pack - #38

Merged
mapzimus merged 3 commits into
masterfrom
cursor/classroom-tier-92b4
Aug 1, 2026
Merged

feat(classroom): $12/mo tier — class codes + worksheet PNG pack#38
mapzimus merged 3 commits into
masterfrom
cursor/classroom-tier-92b4

Conversation

@mapzimus

@mapzimus mapzimus commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Why

Monetization sequence after A1/A2: Pro price raise, then Classroom at $12/mo for the teacher ICP — class codes + printable worksheet packs (the “classroom packs” peer paid reason).

This branch originally stacked on the Pro $9/$72 raise (#37). #37 has since merged to master; this PR is rebased via merge with conflict resolution (Classroom supersedes the Pro-only pricing surfaces).

What

Billing

  • Checkout plan: "classroom"STRIPE_CLASSROOM_MONTHLY_PRICE_ID
  • verify-subscription returns { isPro, isClassroom, tier } — Classroom includes all Pro entitlements
  • Legacy $5/$48 still grandfathered (not offered for new checkouts)

Teacher tools (Create → Upgrade panel when Classroom)

  • Class code — create/refresh a 6-char code bound to the current map hash (classroom_codes table)
  • Copy linktappymaps.com/class/<CODE>
  • Worksheet PNG pack — downloads 3 PNGs via captureMapImage():
    1. Answer key (current map)
    2. Blank outline
    3. Student worksheet (blank map + legend labels)

Join flow

  • /class/<CODE> loads the teacher’s map into Create
  • Pricing page: “Have a class code?” join field
  • Soft upsell for non-Classroom users

Pricing UI

  • Two-card grid: Pro $9 + Classroom $12
  • Upgrade modal adds Classroom CTA

Merge conflicts (resolved)

After fetching latest master (#37), conflicts were in:
.env.example, README.md, api/stripe/create-checkout.js, scripts/checkout-plan-smoke.mjs, index.html (5 hunks).

Classification: all simple — same intent (Pro $9/$72), Classroom branch is a strict superset. Kept Classroom versions; kept master’s “Cancel anytime” note on the Pro card.

Manual steps for Max

  1. Stripe Dashboard — create Prices:
  2. Vercel env
    • STRIPE_PRO_MONTHLY_PRICE_ID
    • STRIPE_PRO_ANNUAL_PRICE_ID
    • STRIPE_CLASSROOM_MONTHLY_PRICE_ID
  3. Supabase SQL (live project):
    • supabase/migrations/20260801_user_maps.sql (A2, if not applied)
    • supabase/migrations/20260801_classroom_codes.sql (this PR)
  4. Redeploy and smoke a Classroom checkout + class-code create.

Verification

  • npm run validate PASS (Block 1 unchanged at 34,471)
  • npm run smoke:checkout PASS (Pro + Classroom wiring)
Open in Web Open in Cursor 

cursoragent and others added 2 commits August 1, 2026 05:07
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>
Builds on the Pro $9/$72 price raise. Classroom checkout (plan:
classroom) includes all Pro entitlements plus teacher tools: generate a
class code bound to the current map (Supabase classroom_codes), share
/class/<CODE>, and download a 3-PNG worksheet pack (answer key, blank,
student). Pricing page gets a Pro + Classroom grid and a class-code join
field. Existing $5/$48 subscribers remain grandfathered.

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 9:56pm
tappymaps Ready Ready Preview Aug 1, 2026 9:56pm

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