Replace Cloud tiered pricing with the v3 single-plan model - #87
Merged
Conversation
The 13 tiered plans metered in "resource units" are gone. Cloud is now one plan: a $29 platform fee plus $5 per driver, vehicle and storefront beyond the first, with three genuinely usage-based meters on top. No tiers, no allowances, no overages, no top-up packs. Rebuilds /pricing around the single plan and replaces the order-volume calculator, whose premise — that price scales with orders — is now false. - src/lib/pricing/v3.ts ports meteredAmount/licensedAmount/build from packages/billing V3Statement.php, with the plans_v3 rate table. Amounts in cents; API and webhook blocks round DOWN, so the first 100,000 of each per period are free and the site never quotes more than we charge. - src/lib/pricing/v3.test.ts ports V3StatementTest.php case for case and adds assertions for the claims the page makes (first storefront free, annual exactly 20% off recurring, identical usage rates on both intervals, no order line on the statement at all). `npm test` runs them on node:test. - The calculator shows a line-by-line statement rather than one number, with the three usage inputs behind a collapsed disclosure and an orders input that is priced at $0.00 to make the per-delivery contrast concrete. - Plan bullets are the four strings from plans_v3 highlight_features verbatim, so site and checkout cannot disagree. Site-wide sweep beyond /pricing: removed resource-unit, overage and top-up copy from the compare, platform, solutions, developers, contact and docs FAQ pages; corrected "no per-driver fees" (now false — drivers are $5) to "never a per-delivery fee" on the homepage, hero, OG images and Fleet-Ops page; refreshed JSON-LD Offer pricing from $25 to $29 with a description covering the per-resource lines; and rewrote the Terms billing clauses and the Privacy usage-data sentence in terms of billable resources and metered usage. Also renames FleetOps to Fleet-Ops in display text across the marketing pages and docs, leaving code identifiers, namespaces, package names and repo slugs untouched, and updates the contributor glossary that declared the opposite convention. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces the 13 tiered "resource unit" Cloud plans with the v3 single-plan model across the whole site, rebuilds
/pricingaround it, and replaces the order-volume calculator.Numbers are taken from the billing implementation, not from the brief's prose:
packages/billing/server/src/Support/V3Statement.phpandconfig/plans.php→plans_v3. I checked every figure against those files and they agree.Important
Do not merge/deploy before the product cutover.
plans_v3currently ships with'is_visible' => false, with a comment saying Phase 6 flips it in the same release as the console build. So this pricing is not live in the product yet. See Open questions below.The pricing page
Rebuilt around one plan, reusing the existing design system rather than inventing a new one. The "Which one are you?" chooser, self-hosted/professional-services cards, support tiers and commercial-licence callout are structurally unchanged.
plans_v3→highlight_features, plus an "Unlimited, at no cost" chip listRemoved: all 13 tiers, "Most Popular", "Show all 13 plans", the overage and top-up pack tables, and the "How resource units work" disclosure.
Deliberately not built: the competitor comparison table. The brief made it optional and required date-stamped, signed-off, publicly published competitor pricing. I had no way to verify current Onfleet/Tookan/Route4Me pricing, and inventing numbers is exactly the published-wrong-number risk the brief warns about. The existing per-competitor comparison pages already carry their own competitor figures — see Open questions.
How the calculator works
src/lib/pricing/v3.tsis a direct port ofV3Statement.php—meteredAmount(),licensedAmount()andbuild(), with theplans_v3rate table. All arithmetic is in cents, formatted only for display.$0.00 — orders are always free, however many you run. It demonstrates the Onfleet contrast far better than a sentence does.3 storefronts, first included · 2 × $5.00.Verified
V3StatementTest.phpis ported case for case intosrc/lib/pricing/v3.test.ts, plus assertions pinning the claims the page makes.npm test(node's built-in runner, no new dependencies) — 12 passing.I also drove the deployed calculator in a browser rather than trusting the unit tests alone:
Everything else touched
Pricing model copy
compare/(index, vs-onfleet, vs-tookan, vs-route4me) — resource-unit framing → the per-delivery contrast; vs-onfleet's Fleetbase pricing card $25/100 units → $29 + $5; three stale$50/mo"Pricing Model" rows (the old Lite tier) correctedplatform/fleetops(page + content + JSON-LD Offer),platform/storefront(commission FAQ),solutions/trucking,solutions/roles/executives,partners,company/investorscontact/sales,developers— trial "capped at 50 resource units" removed; API FAQ now states the real 100k free allowance and $0.25/100k ratecomponents/sections/deployment-options— "From $25/mo" → "$29/mo + $5 per driver or vehicle"content/docs/community/faq.mdx— Cloud pricing answer and the self-hosted/Cloud comparison tableNow-false claims removed. "No per-seat pricing" is still true (users are unlimited and free) and was left alone, but "no per-driver fees" is now false — drivers are $5. Corrected to "never a per-delivery fee" on the homepage metadata/OG,
sections/hero,sections/seo-content, and the Fleet-Ops page.SEO / structured data
seo/json-ld.tsx—SoftwareApplicationSchemadefault price25→29, with anOffer.descriptioncovering the per-resource lines so a single number isn't presented as the whole price. No page overrode the default, so every staleOfferon the site moved with it./pricingmetadata, OG and Twitter descriptions rewritten; OG image subtitle regenerated. Added an explicitSoftwareApplicationSchemato/pricing.no%20per-driver%20fees) were carrying the old claim past plain-text greps — fixed.Legal — needs review. Terms §1 and §6 defined and priced Resource Units, so leaving them would have published a contract for a billing model that no longer exists. Rewritten factually in terms of Billable Resources and Metered Usage, keeping the existing structure and register; §5's "20% discount (equivalent to two months free)" corrected to ~ten months' charges for twelve months. Privacy's "Resource Unit consumption" → metered usage and billable resource counts. I am not a lawyer — please have these reviewed.
Fleet-Ops rename. 28 display strings in
src/, 88 incontent/docs/. Code is untouched: fenced code blocks, inline code spans,Fleetbase\FleetOps\…namespaces, thefleetbase/fleetopsrepo slug,getModelPackage('FleetOps')and component identifiers all stay. Applied with a script that skips code contexts, then hand-checked the 32 remaining occurrences — all genuinely code.Verification
npm test— 12/12resource unit/overage/top-up/Micro/Starter/Scaleremains as Cloud plan pricing (remaining "overage" hits are the substring in "coverage";$200/mohits are the installation Maintenance Plan, a separate product, left alone)tsc --noEmit— 0 errors in changed files. 48 pre-existing errors remain, allPageDatain thedocs/[[...slug]]route templatesoverflow-x-autocontainer by designconsole.fleetbase.io/onboardmainfails on the same 83. Diffed both: this branch introduces zero new violations. Mostlysimple-import-sortand unescaped entities; worth a separate autofix PR/blog/[slug]—Ghost Content API request failed with status 402. I builtmainin a clean worktree and it fails identically, so this is a pre-existing expired/unpaid Ghost credential, not this changeTwo unrelated things in the working tree were left uncommitted: the modified
vendor/postmansubmodule pointer, and an untrackedpnpm-workspace.yaml. That file makes everypnpm runscript fail withERROR packages field missing or empty, which is why verification here usednpm.Open questions — please confirm before this ships
plans_v3isis_visible => falsepending the Phase 6 console build. What is the cutover date, and should this PR be held or merged-but-not-deployed?billing.trial-durationdefault. That setting is operator-editable andplans.phpexplicitly warns against copying it into plan config — so this figure can go stale. Worth confirming, or softening to "free trial" with no number./platform/pallet,solutions/roles/warehouse-managersand avs-route4merow ("Pallet WMS included"). Rewriting those is well outside this change — flagging it since Pallet is not released.content/docs/contributing/translations/glossary.mdxpreviously declared the opposite convention — thatFleetOpsis canonical and "hyphenatedFleet-Opsmay appear in older copy". I flipped it to match the brief and noted that code keeps the unhyphenated form. Please confirm that's the intended direction.Screenshots
Before/after of
/pricing, captured full-page via CDP at identical device metrics frommainand this branch.(Attaching below — desktop 1440px, tablet 834px, mobile 390px.)