Subscription Plans
The four ZapAPI subscription tiers — one plan covers the whole platform, paid in sats.
One subscription covers the whole platform — not just the API. A user pays one sats invoice per period and unlocks a tier across every product: Payments API, Address Marketplace, App Directory, wallet, bio pages and merchant tools.
| Product | Free tier | Premium tiers unlock |
|---|---|---|
| Payments API (invoices, webhooks, providers, projects) | 1k calls/mo | higher quotas, retention, projects, connections |
| Address Marketplace | 1 free address on zapapi.app | extra addresses, provider discounts, priority search |
| App Directory | 1 listing, organic rank | more listings, monthly boost, featured eligibility |
| Wallet + bio + merchant tools | basic limits | more wallets, more links, custom bio themes |
Pricing philosophy: flat subscription in sats (our native unit), capability-based not usage-based. No cut of payments ever — that's the marketplace trust story, and we don't break it anywhere.
2. The four tiers (sats/month, annual = 10× monthly ≈ 17% off)
2. The four tiers (sats/month, annual = 10× monthly ≈ 17% off)
| Free | Zap (consumer) | Pro (builder) | Business (team) | |
|---|---|---|---|---|
| Price | 0 | 2,100 sats/mo (~$2) | 21,000 sats/mo (~$19) | 69,000 sats/mo (~$63) |
| Annual | — | 21,000 sats/yr | 210,000 sats/yr | 690,000 sats/yr |
| Anchor | — | Primal $7 / Alby $3 — we undercut | our old $19, repriced in sats | our old $79, repriced |
2.1 Free — "get started, stay forever"
- API: 1,000 calls/mo, 1 project, 1 provider connection, 7-day logs
- Addresses: 1 free
you@zapapi.app - Directory: 1 app listing (organic rank, no boosts bundled)
- Wallet: 1 wallet
- Merchant: 5 payment links, 1 bio page, 1 creator plan
- Community support
2.2 Zap — 2,100 sats/mo — "the consumer upgrade" (Primal-killer)
Everything in Free, plus:
- Addresses: 3 first-party addresses on zapapi.app + 5% discount on any provider domain (discount funded by us — we rebate the buyer from plan revenue; providers still get 100% of their price)
- Directory: 3 app listings + 1 free boost/mo (1k sats value) (does not roll over)
- Wallet: 3 wallets
- Merchant: 25 payment links, 3 bio pages, 3 creator plans
- API: 5,000 calls/mo (incidental API use — Zap is not for builders)
- Zap badge on your directory listings + bio page
2.3 Pro — 21,000 sats/mo — "the builder tier" (our old $19)
Everything in Zap, plus:
- API: 100k calls/mo, 10 projects, 5 provider connections, 30-day logs, webhook replay, custom webhook secrets, advanced analytics
- Addresses: 10 first-party addresses + 10% provider-domain discount
- Directory: 10 listings + 1 free 5k boost/mo + featured-review fast lane
- Wallet: 10 wallets
- Merchant: unlimited payment links, 10 bio pages, 10 creator plans, paid bio links enabled
- Priority support
2.4 Business — 69,000 sats/mo — "teams & high volume" (our old $79)
Everything in Pro, plus:
- API: 1M calls/mo, unlimited projects, unlimited connections, 90-day logs, audit logs, team access (RBAC seats × 5), SLA
- Addresses: unlimited first-party + 20% provider-domain discount + reserved premium names pool
- Directory: unlimited listings + 1 free 20k boost/mo
- Wallet: 25 wallets
- 24/7 support, custom integrations
2.5 Enterprise (not self-serve)
Custom SLA, dedicated instance, SSO — contact. Not in the sats flow.
3. Payment flow (sats-only, reuses creator-plans patterns)
User picks tier BillingService.createCheckout(tier, period: month|year)
invoice minted on the PLATFORM wallet (ZapAPI revenue — same place as
directory boosts and marketplace commission, via LNBITS_PLATFORM_* keys)
buyer pays (wallet balance "Pay now" OR external QR)
settlement detected (poll on read + 5-min cron sweeper, same pattern
as marketplace orders and directory boosts)
SubscriptionPlan row: status active, currentPeriodEnd = now + period
entitlements effective immediatelyRenewal: 24h before currentPeriodEnd, we create the next period's
invoice and email/toast the user. No auto-charge in v1 (user pays each
period manually — honest, no dark patterns). If unpaid at expiry:
graceUntil = +3 days, then tier reverts to free. Paid boosts/addresses/
listings already owned NEVER get revoked — entitlements only gate new
creations and new renewals.
Annual: one invoice for 10× monthly price (12 months of service).
4. Data model
UserPlan (new entity — REPLACES the dead `subscriptions` Stripe skeleton)
id, userId (unique),
tier: 'free' | 'zap' | 'pro' | 'business',
status: 'active' | 'expired' | 'cancelled',
billingPeriod: 'month' | 'year' (null for free),
currentPeriodStart, currentPeriodEnd, graceUntil,
createdAt, updatedAt
PlanInvoice (per period, audit trail)
id, userId, tier, period: 'month'|'year',
amountSats, paymentHash, bolt11,
status: 'pending' | 'paid' | 'expired',
periodStart, periodEnd (what this payment buys),
createdAt, paidAtThe existing subscriptions table (Stripe skeleton, unused) gets dropped;
billing.controller's unauthenticated updatePlan is removed and replaced
by the checkout flow below.
5. Entitlement checks (where the plan actually bites)
One resolver, PlansService.getEntitlements(userId), returning an object with:
tier, apiQuota, maxProjects, maxConnections, logRetentionDays,
firstPartyAddresses, providerDiscountPct, directoryListings,
freeBoostSatsPerMonth, maxWallets, maxPaymentLinks, maxBioPages,
maxCreatorPlans and teamSeats.
Enforcement points (incremental, not big-bang):
- Claim address (LnurlModule) — count first-party claims vs tier cap
- Directory submit — count active listings vs cap; monthly free-boost credit auto-applies at boost checkout (first N sats free per month)
- Marketplace checkout — apply
providerDiscountPctat reservation: provider still gets their FULL price; we mint the buyer a reduced invoice and cover the delta from the platform wallet (documented as "plan rebate" on the order) - Wallet create — wallet count cap
- API keys guard (later phase) — monthly API quota via UsageService (needs the usage interceptor wired — separate track)
Everything else keeps working as free until its enforcement lands.
6. API surface
GET /plans the 4 tiers + features (public)
GET /billing/plan my current plan + entitlements + usage
POST /billing/checkout { tier, period } { invoice, planInvoice }
POST /billing/invoices/:id/check poll settlement activate
GET /billing/invoices my payment history
POST /billing/cancel cancel renewal (keeps tier till period end)Dashboard: /dashboard/billing rebuilt around the tiers (current plan,
entitlement usage bars, upgrade buttons with sats prices, invoice history,
"Pay now from wallet" + QR flows). Landing /pricing section reads the same
/plans endpoint — one source of truth, no more hardcoded drift.
7. Rollout
- Phase 1 (this doc): entities + checkout + settlement + plan resolver + billing UI + landing pricing from API. Enforcement: claims + directory listings + boost credit + provider discount.
- Phase 2: renewal reminder emails, annual invoices, grace cron.
- Phase 3: API quota enforcement (usage interceptor + monthly windows), team seats UI, premium names pool.