Appearance
Pricing and Paddle setup (cloud edition)
Plans apply only to the hosted cloud (RD_CLOUD_MODE). Self-hosted instances ignore them. Limits live in packages/shared/src/plans.ts; keep the landing pricing page in sync. Plan limits saved through the admin console override these defaults. Update any saved plan definitions separately when rolling out new allowances.
Plans
| Plan | Monthly | Yearly | Best for |
|---|---|---|---|
| Starter | $9 | $90 | A single app in production |
| Pro | $19 | $190 | Products in production |
| Team | $79 | $790 | Growing teams |
| Enterprise | Custom | Custom | Regulated organizations |
Yearly billing is 10x monthly ("2 months free"). Every paid plan starts with a 7-day trial (TRIAL_DAYS), configured on the Paddle price. Prices exclude tax (Paddle adds VAT/sales tax as merchant of record).
Limits
| Limit | Starter | Pro | Team | Enterprise |
|---|---|---|---|---|
| Apps | 2 | 10 | Unlimited | Unlimited |
| Members | 3 | 10 | 50 | Unlimited |
| Storage | 5 GB | 50 GB | 250 GB | Custom |
| Max upload | 1 GB | 2 GB | 5 GB | Custom |
| Egress and downloads | Free, unlimited | Free, unlimited | Free, unlimited | Free, unlimited |
| Testers | 100 | 2,000 | 10,000 | Unlimited |
| Releases per channel | 5 | 10 | 50 | Unlimited |
| Statistics retention | 90 days | 365 days | 400 days | Custom |
| Analytics exports / month | 2 | 10 | 30 | Unlimited |
| API / CI tokens | 1 | Unlimited | Unlimited | Unlimited |
Features
| Feature | Starter | Pro | Team | Enterprise |
|---|---|---|---|---|
| Channels, staged rollouts, signed feeds | yes | yes | yes | yes |
| Custom branding | yes | yes | yes | |
| Custom download domain | yes | yes | yes | |
| Webhooks, App Store Connect, Google Play | yes | yes | yes | |
| GitHub org and team sync | yes | yes | ||
| SLA and signed DPA | yes | |||
| Support | Community | Email, 2 business days | Priority, 1 business day | Dedicated |
Descriptions (for the pricing page)
- Starter: Everything needed to ship one or two apps to real users: channels, staged rollouts and signed update feeds, with community support.
- Pro: For products with paying customers. Adds your branding and domain on public download pages, webhooks and CI tokens, store integrations, and a year of statistics.
- Team: For organizations with several contributors. Adds GitHub org/team sync, larger uploads, longer retention, and priority support.
- Enterprise: Annual contract with custom limits and retention, SLA, signed DPA, and dedicated support.
Egress
Egress is free on every plan: there is no bandwidth cap, download allowance or overage charge. Usage is still recorded for statistics and the admin console. Only storage (including container image layers) is limited.
Without a subscription
Trial over or payment lapsed: data stays readable and served, nothing new can be added (LOCKED_LIMITS).
Paddle setup
For sandbox testing see Paddle local setup. Production steps:
1. Account
- Create and verify a Paddle Billing account (business verification, payout details, approved website with pricing, terms, privacy and refund pages, which exist at
/legal/*on the landing site). - Set default payment methods and currency (USD).
2. Catalog
Catalog > Products: create three products, Starter, Pro, Team. Give each a name, the description above, and a tax category of SaaS. Add two prices per product:
| Price | Amount (USD) | Billing cycle | Trial | Tax mode |
|---|---|---|---|---|
| Monthly | 9 / 19 / 79 | 1 month | 7 days | exclusive |
| Yearly | 90 / 190 / 790 | 1 year | 7 days | exclusive |
Price fields
Checkout quantity is always 1 for plans (the app sends quantity: 1), so lock it to avoid accidental multi-seat purchases.
| Price name (customer-facing) | Internal description | Pricing model | Billing period | Base price (USD) | Sales tax | Trial | Min qty | Max qty |
|---|---|---|---|---|---|---|---|---|
| Starter Monthly | Starter plan, monthly, 7d trial | Recurring | Every 1 month | 9.00 | Exclusive | 7 days | 1 | 1 |
| Starter Yearly | Starter plan, yearly, 7d trial | Recurring | Every 1 year | 90.00 | Exclusive | 7 days | 1 | 1 |
| Pro Monthly | Pro plan, monthly, 7d trial | Recurring | Every 1 month | 19.00 | Exclusive | 7 days | 1 | 1 |
| Pro Yearly | Pro plan, yearly, 7d trial | Recurring | Every 1 year | 190.00 | Exclusive | 7 days | 1 | 1 |
| Team Monthly | Team plan, monthly, 7d trial | Recurring | Every 1 month | 79.00 | Exclusive | 7 days | 1 | 1 |
| Team Yearly | Team plan, yearly, 7d trial | Recurring | Every 1 year | 790.00 | Exclusive | 7 days | 1 | 1 |
Notes:
- Trial: set 7 days on all six recurring prices (
TRIAL_DAYS). Paddle starts billing automatically when the trial ends. - Sales tax: "Exclusive" shows the price without tax and Paddle adds VAT/sales tax at checkout. Use "Inclusive" only if you want tax inside the listed price.
Enable localized pricing in Checkout settings if you want local currencies.
3. API key and client token
Developer Tools > Authentication:
- API key: scopes for subscriptions, customers, transactions, portal sessions (read/write).
- Client-side token (
live_...): used by Paddle.js checkout.
4. Checkout settings
Checkout > Checkout settings: set the default payment link to https://<your-domain>/settings/plan (or your dashboard URL) and approve the domain.
5. Webhook
Developer Tools > Notifications > New destination:
- URL:
https://<your-domain>/webhooks/paddle - Events:
subscription.created,.activated,.updated,.past_due,.paused,.resumed,.canceled,.trialing - Copy the secret (
pdl_ntfset_...).
6. Environment
In deployment-prod/.env:
RD_CLOUD_MODE=true
RD_PADDLE_ENV=production
RD_PADDLE_API_KEY=pdl_live_...
RD_PADDLE_WEBHOOK_SECRET=pdl_ntfset_...
RD_PADDLE_CLIENT_TOKEN=live_...
RD_PADDLE_PRICES=pri_a:starter:month,pri_b:starter:year,pri_c:pro:month,pri_d:pro:year,pri_e:team:month,pri_f:team:yearRD_PADDLE_PRICES format is priceId:plan:interval. Unlisted price IDs are ignored by the webhook. Restart the server after changes.
7. Verify
- Repeat the sandbox test flow in production with a real card and a 100% discount code (or refund immediately).
- Confirm Notifications > Logs show 2xx and the org plan updates under Settings > Plan.
- Confirm the customer portal link opens from Settings > Plan.
Changing prices
Create a new Paddle price and swap its ID in RD_PADDLE_PRICES; do not edit amounts on prices with active subscribers. Update apps/landing/partials/pricing-cards.html and the tables above to match. Admins can also set display prices and discounts via the site admin pricing tools.