Billing and monetization
Canonical Octonode repository documentation.
Billing and monetization
Octonode uses a hybrid model: a predictable Pro subscription pays for the hosted product, while completed workflow executions are the usage unit for allowance, capacity planning, and overage. One execution is one completed workflow run regardless of step count.
Plan catalog
| Plan | Price | Included executions | Intended use |
|---|---|---|---|
| Free | $0 | Local execution | Local Studio, CLI, code/graph sync, Git-owned config |
| Pro monthly | $29/month | 10,000/month | Production hosted execution and collaboration |
| Pro yearly | $290/year (17% discount) | 120,000/year | The same Pro product with a flexible annual pool |
| Enterprise | Custom annual contract | 100,000+ with volume rates | Governance, security, onboarding, and support |
Pro overage is $2 per additional 1,000 executions. Stripe owns the graduated metered Price: the included tier is free, then the overage tier charges at the equivalent per-execution rate. The D1 period records the included allowance as its soft threshold; an owner may add a hard stop at or above that allowance even if Stripe delivery is delayed. Enterprise is sales-led rather than self-serve because its allowance, support, and governance terms are part of the contract.
This shape follows the useful parts of the current automation market without copying its billing complexity: n8n bills by workflow execution regardless of steps and offers 10,000 on Pro; Make starts paid tiers at 10,000 action credits and offers cheaper annual billing; Zapier uses task tiers, annual discounts, and sales-led Enterprise. Octonode chooses the easier execution unit because a workflow author can predict it before publishing.
A personal workspace owns its subscription. An organization owns one subscription shared by all
of its teams. Organization owners/admins and personal owners have billing:read and
billing:manage; a team lead has read-only billing visibility.
Authority and interaction
Supabase Auth JWT
-> Cloudflare gateway verifies identity
-> D1 resolves workspace role and billable parent
-> Stripe Checkout creates the selected monthly or yearly Pro subscription
-> signed Stripe webhooks project subscription + entitlements into D1
-> Studio reads D1 summary and opens Stripe Customer Portal for mutations
Cost-bearing operation
-> entitlement check
-> append-only D1 usage ledger
-> current quota projection + alert/hard-stop trigger
-> Stripe meter delivery with a stable idempotency identifierFor workflow executions, the gateway atomically reserves one usage event before dispatch. A rejected or unavailable sandbox receives a compensating reversal; successful and failed dispatched runs keep the reservation and count as executions. The reservation ID makes retries safe.
Stripe owns customers, prices, subscriptions, invoices, metered overage, and entitlements. D1 is the local read projection, usage authority, replay inbox, and audit log. Supabase owns user identity only; billing data does not belong in Supabase user metadata or browser-visible claims.
The attachment key is the verified Supabase JWT subject. A personal checkout creates or reuses
billable_accounts.id = user:<subject>; an organization checkout uses org:<id>, and teams inherit
that organization. After every login or workspace change, Studio reads the server-owned billing
summary for that workspace. It never grants Pro from user_metadata or a stale JWT claim.
Customer flow
- The public landing page compares Free, Pro, and Enterprise.
- The user signs in through Supabase and selects the workspace in Studio.
- A billing owner opens Administration → Billing and chooses monthly or yearly Pro.
POST /api/billing/checkoutcreates/reuses the workspace Stripe Customer and returns a short-lived hosted Checkout URL. The browser never receives a Stripe secret.- Stripe subscription and entitlement webhooks update D1 and seed the matching execution period and included-usage threshold: 10,000 for monthly Pro or 120,000 for yearly Pro. Scheduled reconciliation repairs a missed or delayed event.
- Manage in Stripe opens a short-lived Customer Portal session for payment methods, invoices, plan changes, and cancellation.
Downgrades never block reads, exports, billing repair, workspace deletion, or data recovery.
Active/trialing subscriptions pass entitlement checks; past_due receives the documented 72-hour
grace period. All other states fail closed for cost-bearing operations.
Admin billing dashboard
The workspace billing owner sees the current subscription, renewal/cancellation state, 30-day metered usage, triggered budget alerts, blocked cost-bearing operations, and each active usage period. A hard stop may be changed per meter; blank removes the hard stop. Warning and soft limits remain operator-provisioned until customers demonstrate a need to edit all three thresholds.
This is tenant-scoped operational billing, not a provider revenue dashboard. Stripe Dashboard remains the provider authority for MRR, churn, failed payments, taxes, refunds, and disputes.
Stripe and Cloudflare setup
- In Stripe, create the Pro product with licensed base Prices at $29 monthly and $290 yearly.
- Create monthly and yearly graduated metered execution Prices. Their first 10,000/120,000 units
are included and additional usage is $2 per 1,000 executions. Use the meter event name
octonode_workflow_execution; the metered Price interval must match its base Price interval. - Attach a Stripe Entitlement feature with lookup key
workflow-executionto Pro and to each contracted Enterprise product. Enterprise also requires its contracted quota period in D1. - Configure only the supported webhook events:
product.*,price.*,customer.subscription.*, andentitlements.active_entitlement_summary.updated. - Point the webhook to
/hooks/stripeon the cloud API worker. - Set Worker secrets
STRIPE_API_KEYandSTRIPE_WEBHOOK_SECRET. - Set Worker variables
STRIPE_PRO_MONTHLY_PRICE_ID,STRIPE_PRO_YEARLY_PRICE_ID,STRIPE_PRO_MONTHLY_EXECUTION_PRICE_ID,STRIPE_PRO_YEARLY_EXECUTION_PRICE_ID, andOCTONODE_STUDIO_URL.STRIPE_PREMIUM_PRICE_IDremains a monthly migration fallback only. - Apply Cloudflare D1 migrations, deploy the cloud API worker, then deploy the Studio gateway.
- Complete monthly and yearly Stripe test-mode checkouts, replay each webhook once, record an execution meter event, cancel in the Portal, and verify the dashboard converges after scheduled reconciliation.
Expansion gates
- Review the $2 per 1,000 execution overage after 30 days of production cost data; change it by creating a new Stripe Price rather than mutating historical billing records.
- Add self-serve Enterprise checkout only after its contract terms become standardized.
- Add a provider revenue dashboard only when Stripe's built-in reporting no longer answers the operator's questions.
- Add taxes, coupons, trials, and dunning policy in Stripe before advertising them on the landing page; avoid duplicating those rules in Octonode.