Skip to content

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 ​

PlanMonthlyYearlyBest for
Starter$9$90A single app in production
Pro$19$190Products in production
Team$79$790Growing teams
EnterpriseCustomCustomRegulated 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 ​

LimitStarterProTeamEnterprise
Apps210UnlimitedUnlimited
Members31050Unlimited
Storage5 GB50 GB250 GBCustom
Max upload1 GB2 GB5 GBCustom
Egress and downloadsFree, unlimitedFree, unlimitedFree, unlimitedFree, unlimited
Testers1002,00010,000Unlimited
Releases per channel51050Unlimited
Statistics retention90 days365 days400 daysCustom
Analytics exports / month21030Unlimited
API / CI tokens1UnlimitedUnlimitedUnlimited

Features ​

FeatureStarterProTeamEnterprise
Channels, staged rollouts, signed feedsyesyesyesyes
Custom brandingyesyesyes
Custom download domainyesyesyes
Webhooks, App Store Connect, Google Playyesyesyes
GitHub org and team syncyesyes
SLA and signed DPAyes
SupportCommunityEmail, 2 business daysPriority, 1 business dayDedicated

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 ​

  1. 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).
  2. 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:

PriceAmount (USD)Billing cycleTrialTax mode
Monthly9 / 19 / 791 month7 daysexclusive
Yearly90 / 190 / 7901 year7 daysexclusive

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 descriptionPricing modelBilling periodBase price (USD)Sales taxTrialMin qtyMax qty
Starter MonthlyStarter plan, monthly, 7d trialRecurringEvery 1 month9.00Exclusive7 days11
Starter YearlyStarter plan, yearly, 7d trialRecurringEvery 1 year90.00Exclusive7 days11
Pro MonthlyPro plan, monthly, 7d trialRecurringEvery 1 month19.00Exclusive7 days11
Pro YearlyPro plan, yearly, 7d trialRecurringEvery 1 year190.00Exclusive7 days11
Team MonthlyTeam plan, monthly, 7d trialRecurringEvery 1 month79.00Exclusive7 days11
Team YearlyTeam plan, yearly, 7d trialRecurringEvery 1 year790.00Exclusive7 days11

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:year

RD_PADDLE_PRICES format is priceId:plan:interval. Unlisted price IDs are ignored by the webhook. Restart the server after changes.

7. Verify ​

  1. Repeat the sandbox test flow in production with a real card and a 100% discount code (or refund immediately).
  2. Confirm Notifications > Logs show 2xx and the org plan updates under Settings > Plan.
  3. 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.