Selling it as SaaS
Plans and allowances, how usage is metered and enforced, Stripe Checkout and the customer portal, cost tracking, and which licence you need to charge customers.
4 min readUpdated Oct 17, 2026Applies to Reception AI 1.0.0
On this page
Reception AI can run as a multi-tenant service: businesses sign up, each gets their own workspace, and you bill them through Stripe. Everything on this page is optional for a single-business install.
Important
Check your licence first. On CodeCanyon, the Regular License covers one end product whose end users are not charged. If your customers pay to use what you build with Reception AI (a subscription, a setup fee, any paid plan), you need the Extended License. Read Envato's licence terms for the authoritative wording; this note is a summary, not legal advice.
Plans
New workspaces start on Studio. Three plans are created by the migrations:
| Plan | Price label | Minutes per month | Receptionists | Phone numbers |
|---|---|---|---|---|
| Studio | Free | 15 | 1 | 1 |
| Scale | $89 / seat / month | 2,000 | 25 | 25 |
| Enterprise | Custom | Unlimited | Unlimited | Unlimited |
Super-admins edit plans at Admin → Plans: name, price label, allowances, whether the plan is public, and its Stripe price ID.
- Minutes are a monthly allowance of plan minutes (see metering below).
- Receptionists caps both how many a workspace can create (drafts included) and how many can be live.
- Phone numbers counts real carrier numbers; test numbers are free.
- An empty allowance means unlimited.
- A plan marked not public keeps working for workspaces already on it but cannot be bought. A plan cannot be deleted while any workspace uses it, and Studio can never be deleted.
Note
The price label is display text only. "Per seat" pricing is not implemented: checkout always sells a quantity of one, and a workspace has one user.
How usage is metered
Every billable event is converted into plan minutes and summed per calendar month:
| Event | Plan minutes (default) | Rate setting |
|---|---|---|
| One minute of a live call (rounded up, at least 1 per call) | 1 | RATE_VOICE_MINUTE |
| One exchange on the turn-based phone path | 0.25 | RATE_PHONE_TURN |
| One website-widget chat message | 0.025 | RATE_TEXT_MESSAGE |
| Twilio outbound call | Duration reported by Twilio, rounded up (0 if unanswered) | RATE_VOICE_MINUTE |
| Vonage or Telnyx outbound call | 1 per call | RATE_VOICE_MINUTE |
Change the rates under Configuration → Billing rates. Workspace chat in the dashboard is not metered.
Plan enforcement
| Check | Behaviour |
|---|---|
| Creating or publishing a receptionist over the limit | Refused with a message naming the allowance |
| Adding a real number over the limit | Refused |
| Inbound Twilio or Plivo call when minutes are used up | Caller hears that the line has used its included minutes; the call ends before any minutes are spent |
| Widget message when minutes are used up | Visitor sees "This assistant is unavailable right now." |
Not gated in 1.0.0: SIP-trunk calls, outbound calls and campaigns. If the minutes check itself fails (for example, the database is briefly unreachable), the call or message is allowed rather than refused.
Stripe setup
Metering and limits work without Stripe. Stripe adds self-serve upgrades.
- Create a product and a recurring price in Stripe for each paid plan. Copy each price ID (
price_…). - Paste each price ID into the matching plan under Admin → Plans. A plan without a price ID shows "Talk to us" instead of a checkout button.
- Add a webhook endpoint in Stripe:
https://<APP_URL>/api/billing/stripe, with these events:checkout.session.completedcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_failed
- Set the keys under Configuration → Payments:
STRIPE_SECRET_KEYandSTRIPE_WEBHOOK_SECRET(the endpoint's signing secret). - Enable the customer portal in Stripe (Settings → Billing → Customer portal) so Manage billing can change cards and cancel.
- Make sure
APP_URLis set; checkout needs it to send customers back.
Use test keys (sk_test_…) first; card 4242 4242 4242 4242 completes a test checkout.
What happens next
- Customers upgrade from Settings → Billing in their workspace. Checkout is a Stripe subscription and accepts promotion codes.
- The plan switches as soon as the customer returns from checkout, and the webhook keeps it in sync afterwards.
- Cancelled subscriptions move the workspace back to Studio.
- A failed payment marks the workspace past due. The paid plan stays active; nothing is restricted automatically, so follow up from Stripe.
- The webhook verifies Stripe's signature (with five minutes of tolerance) and answers
503if Stripe keys are not configured.
Note
Changing a workspace's plan under Admin → Accounts does not change anything in Stripe, and a later subscription update from Stripe will overwrite it. Use it for free or custom arrangements, not for paying Stripe customers.
PayPal fields appear on the Configuration screen but PayPal checkout is not implemented in 1.0.0.
Costs and margins
Admin → Finance (super-admin only) brings together:
- Provider costs recorded per live call and per speech synthesis, priced from a rate table you maintain (seeded with estimates).
- Fixed costs you enter, such as hosting.
- Revenue you record. Stripe payments are not imported automatically.
Margins are only as good as those inputs; see AI models and providers for what is and is not recorded.
Before you launch a SaaS
- Buy the right licence (see the top of this page).
- Set
ADMIN_EMAILS, verify your admin, and considerFEATURE_SIGNUPSoff until you are ready. - Fill in
SUPPORT_EMAIL,TERMS_URL,PRIVACY_URLandCOMPANY_NAME. - Put spending limits on your OpenAI and xAI accounts.
- Use Twilio for customer numbers: Plivo on a shared install works with a single Plivo account only (see Phone numbers).
- Read Known limitations so your own sales pages promise only what the product does.