Billing & Subscriptions
Manage your subscription plan, payment method, and billing history through the Stripe-powered billing portal.
Plans
| Feature | Trial | Starter | Pro |
|---|---|---|---|
| POS & orders | Yes | Yes | Yes |
| Menu management | Yes | Yes | Yes |
| Kitchen display | Yes | Yes | Yes |
| Inventory | - | Yes | Yes |
| Reports | Basic | Full | Full |
| Delivery integrations | - | - | Yes |
| Delivery intelligence | - | - | Yes |
| AI suggestions | - | - | Yes |
| Virtual brands | - | - | Yes |
| Loyalty & CRM | - | Yes | Yes |
| Custom branding | - | - | Yes |
Managing Your Subscription
Upgrading
- Go to Settings > Billing
- Select the plan you'd like to upgrade to
- You'll be redirected to Stripe Checkout
- Complete the payment
- Your plan upgrades immediately
Downgrading
- Go to Settings > Billing > Manage Subscription
- This opens the Stripe Customer Portal
- Select a lower plan
- The change takes effect at the end of your current billing period
Cancelling
- Open the Stripe Customer Portal from Settings > Billing
- Cancel your subscription
- Access continues until the end of the paid period
Payment Methods
Manage payment methods through the Stripe Customer Portal:
- Add or remove credit/debit cards
- Set a default payment method
- View upcoming invoices
Billing Events
The system handles these billing events automatically:
| Event | Action |
|---|---|
| Checkout completed | Plan activated, tenant updated |
| Subscription updated | Plan level changed |
| Subscription deleted | Reverted to trial |
| Payment failed | Notification sent, grace period starts |
Invoices
Access your complete billing history and download invoices from the Stripe Customer Portal.
Stripe Webhook
The billing system relies on a Stripe webhook to stay in sync with subscription changes.
Webhook URL: https://pos.desktop.kitchen/api/billing/webhook
Handled Events
| Event | Action |
|---|---|
checkout.session.completed | Activates the plan, links Stripe customer to tenant |
customer.subscription.updated | Updates plan level (starter/pro) |
customer.subscription.deleted | Reverts tenant to trial plan |
invoice.payment_failed | Logs failure, begins grace period |
Configuration
- In the Stripe Dashboard, create an endpoint pointing to
https://pos.desktop.kitchen/api/billing/webhook - Select the four events listed above
- Copy the signing secret and set it as the
STRIPE_WEBHOOK_SECRETenvironment variable
Raw body required
The webhook route is mounted before express.json() middleware so that Stripe can verify the raw request body signature. If you add global body-parsing middleware, ensure the webhook route is excluded.