Pricing & plans
Scope: the plan ladder as shipped — prices, per-plan features and quotas.
This is a product-facing summary of plans.config.ts; the enforcement mechanics
(quota counting, overrides, 402/403/428 bodies) live in
Entitlements enforcement and are linked,
not repeated.
Source-checked against optolink-backend @ 29f8589, 2026-10-07:
src/entitlements/plans.config.ts(features/quotas/overage rates) andprisma/seed.tsPLAN_CONFIG_ROWS(prices, 5 plans × 2 currencies).
The ladder
Five plans (STARTER → SOLO → GROWTH → SCALE → ENTERPRISE). Two
gateways, currency-routed: USD → Stripe, EGP → Paymob. EGP prices follow the
repo's consistent 50 EGP/USD ratio.
| Starter (free) | Solo | Growth | Scale | Enterprise | |
|---|---|---|---|---|---|
| Price USD/mo | $0 | $19 | $49 | $150 | custom |
| Price EGP/mo | 0 | 950 | 2,450 | 7,500 | custom |
| Links | 10 | 50 | 200 | 1,000 | unlimited |
| Clicks / month | 1,000 | 10,000 | 50,000 | 200,000 | unlimited |
| Custom domains | —¹ | 3 | 5 | 25 | unlimited |
| Team seats | 1² | 2 | 5 | 15 | unlimited |
| Link templates | 3 | 5 | 10 | 50 | unlimited |
| API access | — | — | ✓ | ✓ | ✓ |
| Analytics export | — | — | — | ✓ | ✓ |
| Click overage | hard stop | $0.06 / EGP 3.0 per click | $0.05 / EGP 2.5 | $0.04 / EGP 2.0 | never exhausts |
| Downgrade policy | immediate | end of period | end of period | end of period | immediate |
¹ Starter has no custom_domains feature — the 1-domain quota covers the
managed OptoLink subdomain.
² The owner occupies the single seat; free orgs cannot invite (locked decision,
2026-08-09 — see Product definition).
The overage model
The differentiator vs the direct competitor is never hard-block on paid tiers: paid plans meter clicks past the limit to the usage ledger and bill the overage when the subscription period ends (the overage sweep). Only the free Starter tier hard-stops. Quota enforcement never breaks link resolution — see Entitlements enforcement.
Feature unlocks, in ladder order: custom_domains + team_members at Solo
(the classic first-paid perks), api_access at Growth (Solo has no key surface
at all), analytics_export at Scale. Enterprise is admin-set with no
self-serve checkout — effectively unlimited sentinels, nothing ever billed.
Divergences from the legacy pricing research
The legacy doc (docs/research/optolink-pricing.md, 2026-07-30) predates the
billing port. The code wins on every conflict:
- Scale is $150, not the doc's $149 (
seed.tsPLAN_CONFIG_ROWS). - Overage is per click — $0.06/$0.05/$0.04 per click (Solo/Growth/Scale), not the doc's per-1K-click rates.
- The tier meter is clicks/month, not MAU. The doc's MAU-based quotas (5K/50K/150K/500K) were never built — MAU is backlog B-026.
- Seats are 1/2/5/15, not the doc's "1 developer" — team seats are a quota
(
team_members), unlocking as a feature at Solo. - The doc's "free quota" framing survives as the free Starter tier: full-featured core, hard stop on click exhaustion.
The market free-tier survey that informed the model lives in research/platform/what-is-free.md.