Pricing Compare
block / payments
A feature-comparison matrix whose columns are derived from the pricing config, with a pinned feature column, a sticky header row and the tier CTAs repeated at the bottom.
- type
- block
- files
- 2
- registry deps
- badge, button, skeleton, @automindz/stripe-checkout, @automindz/render-link
- npm deps
- lucide-react
installs
- lib/automindz/compare.ts
- components/automindz/pricing-compare.tsx
- Columns derived from lib/automindz/pricing.ts — no second tier list
- null is “not applicable”, and never renders as a cross
- A real <table>: scope=col/row, one rowgroup header per group
- Narrow, the feature column pins; wide, the header row does
- Config/matrix drift is named on the page, in development only
Edit the feature matrix in lib/automindz/compare.ts. It holds only the matrix: the tiers, names, prices and Price IDs come from lib/automindz/pricing.ts (installed by @automindz/stripe-checkout), and the columns are derived from it at render time — never restate a tier list here. Keys in values are tier ids from that config; in development the component names any that have drifted apart. null means *not applicable to this tier* and renders as a dash, which is not the same as false and must not be used for it. Pass interval from the same toggle that drives your pricing cards. If your page has a sticky nav, set stickyOffset (or --automindz-compare-top) to its height or the tier names park under it. onSelect overrides the checkout call; renderLink swaps in next/link for a contact-sales tier.
Variations
one state per section
- 01The full matrix
- 02Tick, cross, dash
- 03Yearly interval
- 04Loading
- 05A tier switched off
- 06Drift, in development
- 07Empty matrix
The full matrix
Twenty-four rows across five groups, and every column — name, price, badge, Price ID, which tier is promoted — read from lib/automindz/pricing.ts. Scroll the page and the tier names pin; narrow the window and the feature column pins instead while the tiers scroll under it.
| Feature | Starter $19 / month | GrowthMost popular $49 / month | Enterprise Custom pricing |
|---|---|---|---|
| Usage | |||
| Seats | Up to 3 | Up to 20 | Unlimited |
| Projects | 1 | Unlimited | Unlimited |
| Price per extra project | $9 / month | Not applicable | Not applicable |
| API requests | 50,000 / month | 1,000,000 / month | Custom |
| Overage rateCharged once the monthly request allowance is used. | $2 per 10,000 | $1 per 10,000 | Not applicable |
| Collaboration | |||
| Roles | Owner and member | Owner, admin, member | Custom roles |
| Guest accessRead-only collaborators who do not take a paid seat. | Not included | Included | Included |
| Comments and mentions | Included | Included | Included |
| Approval workflows | Not included | Not included | Included |
| Security | |||
| Single sign-onGoogle, Microsoft and GitHub. | Not included | Included | Included |
| SAML / OIDC | Not included | Not included | Included |
| SCIM provisioning | Not included | Not included | Included |
| Audit log | Not included | 90 days | Unlimited, exportable |
| Data residency | Not included | EU or US | EU, US or self-hosted |
| Support | |||
| Support channel | Community forum | Email and chat | Dedicated Slack channel |
| First response target | Best effort | 1 business day | 1 hour, 24/7 |
| Guided onboarding | Not included | Included | Included |
| Dedicated success manager | Not included | Not included | Included |
| Uptime SLA | Not included | 99.9% | 99.99% with credits |
| Developer | |||
| REST API | Included | Included | Included |
| API rate limit | 60 / minute | 600 / minute | Custom |
| Webhooks with replay | Not included | Included | Included |
| Sandbox workspace | Not included | Included | Included |
| Terraform provider | Not included | Not included | Included |
| Choose a plan | Contact sales | ||
Tick, cross, dash
The distinction every comparison table gets wrong. A cross means withheld; a dash means there is nothing here to withhold — a price per extra project on a plan with unlimited projects. Each glyph carries sr-only text (“Included” / “Not included” / “Not applicable”), so no row reads as its label and then silence.
| Feature | Starter $19 / month | GrowthMost popular $49 / month | Enterprise Custom pricing |
|---|---|---|---|
| Included, not included, not applicable | |||
| Webhooks with replay | Not included | Included | Included |
| Seats | Up to 3 | Up to 20 | Unlimited |
| Projects | 1 | Unlimited | Unlimited |
| Price per extra projectNothing to price where projects are unlimited. | $9 / month | Not applicable | Not applicable |
| Choose a plan | Contact sales | ||
Yearly interval
The same table with interval="year". Prices change and so do the Price IDs behind the checkout buttons — nothing else in the matrix does, and no Price ID is written down twice. Pair the prop with the toggle over the pricing cards so the two can never disagree.
| Feature | Starter $190 / year | GrowthMost popular $490 / year | Enterprise Custom pricing |
|---|---|---|---|
| Usage | |||
| Seats | Up to 3 | Up to 20 | Unlimited |
| Projects | 1 | Unlimited | Unlimited |
| Price per extra project | $9 / month | Not applicable | Not applicable |
| API requests | 50,000 / month | 1,000,000 / month | Custom |
| Overage rateCharged once the monthly request allowance is used. | $2 per 10,000 | $1 per 10,000 | Not applicable |
| Collaboration | |||
| Roles | Owner and member | Owner, admin, member | Custom roles |
| Guest accessRead-only collaborators who do not take a paid seat. | Not included | Included | Included |
| Comments and mentions | Included | Included | Included |
| Approval workflows | Not included | Not included | Included |
| Choose a plan | Contact sales | ||
Loading
Skeletons at the real row count, computed from the matrix rather than guessed, so the page does not jump when the prices land. The group headings and the row structure are already correct; only the values are pending.
| Feature | Starter | GrowthMost popular | Enterprise |
|---|---|---|---|
| Usage | |||
| Collaboration | |||
| Choose a plan | |||
Loading 11 comparison rows.
A tier switched off
enabled: false on Growth. PricingTable drops that tier — you cannot buy it. This one keeps the column and blocks the CTA instead, because removing a column silently changes what the other two are being compared against.
| Feature | Starter $19 / month | GrowthNot available $49 / month | Enterprise Custom pricing |
|---|---|---|---|
| Usage | |||
| Seats | Up to 3 | Up to 20 | Unlimited |
| Projects | 1 | Unlimited | Unlimited |
| Price per extra project | $9 / month | Not applicable | Not applicable |
| API requests | 50,000 / month | 1,000,000 / month | Custom |
| Overage rateCharged once the monthly request allowance is used. | $2 per 10,000 | $1 per 10,000 | Not applicable |
| Collaboration | |||
| Roles | Owner and member | Owner, admin, member | Custom roles |
| Guest accessRead-only collaborators who do not take a paid seat. | Not included | Included | Included |
| Comments and mentions | Included | Included | Included |
| Approval workflows | Not included | Not included | Included |
| Choose a plan | Closed to new sign-ups. | Contact sales | |
Drift, in development
Two failures at once: a Scale tier in the pricing config that the matrix never mentions, and legacy values left behind by a tier that was deleted from it. The panel is development-only — process.env.NODE_ENV is inlined, so it is dead code in a client's production build — and the empty Scale column is exactly what it warns about.
| Feature | Starter $19 / month | GrowthMost popular $49 / month | Scale $199 / month | Enterprise Custom pricing |
|---|---|---|---|---|
| Usage | ||||
| Seats | Up to 3 | Up to 20 | Not applicable | Unlimited |
| Projects | 1 | Unlimited | Not applicable | Unlimited |
| Price per extra project | $9 / month | Not applicable | Not applicable | Not applicable |
| API requests | 50,000 / month | 1,000,000 / month | Not applicable | Custom |
| Overage rateCharged once the monthly request allowance is used. | $2 per 10,000 | $1 per 10,000 | Not applicable | Not applicable |
| Collaboration | ||||
| Roles | Owner and member | Owner, admin, member | Not applicable | Custom roles |
| Guest accessRead-only collaborators who do not take a paid seat. | Not included | Included | Not applicable | Included |
| Comments and mentions | Included | Included | Not applicable | Included |
| Approval workflows | Not included | Not included | Not applicable | Included |
| Choose a plan | Contact sales | |||
Empty matrix
No groups, so nothing renders — not a headed table with no rows under it, which reads as a load that failed. The frame below is empty on purpose.
