AutoBlocks is paid from day one after your trial — with a 14-day free trial and no card required to explore via marketing CTAs. Two plans: Starter and Plus, each with monthly or annual billing.
Compare on autoblocks.pro/pricing; manage subscription on autoblocks.run/billing.
Source: packages/billing/src/plans.ts, apps/api/src/modules/billing/routes.ts, apps/product-web/src/app/(dashboard)/billing/page.tsx.
Plans and display prices
| Plan | Monthly | Annual (per month) | Best for |
|---|---|---|---|
| Trial | Free for 14 days | — | Evaluation |
| Starter | $12 | $10 | Light personal automation |
| Plus | $24 | $20 | Higher volume and webhooks |
Display prices are in USD (PLAN_DISPLAY_PRICES). Stripe price IDs are configured in production env (STRIPE_PRICE_* in render.yaml).
Usage limits
| Limit | Trial | Starter | Plus |
|---|---|---|---|
| AutoBlocks (routines) | 3 | 5 | 25 |
| Executions / month | 100 | 500 | 5,000 |
| Inbound webhook endpoints | 1 | 2 | 10 |
| Schedules | 2 | 3 | 15 |
When a limit is hit, the API returns HTTP 402 with entitlement_limit_exceeded and the current count.
Where billing happens
| Task | Site | Route |
|---|---|---|
| Compare plans | Marketing | autoblocks.pro/pricing |
| Start trial | Product | autoblocks.run/signup |
| View trial days left | Product | autoblocks.run/billing |
| Upgrade / checkout | Product | autoblocks.run/billing |
| Usage meters | Product | autoblocks.run/billing |
flowchart LR
Pricing["autoblocks.pro/pricing"]
Signup["autoblocks.run/signup"]
Trial["14-day trial"]
Billing["autoblocks.run/billing"]
Stripe["Stripe Checkout"]
Active["Paid subscription"]
Pricing --> Signup --> Trial --> Billing
Billing --> Stripe --> Active
API endpoints (billing)
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /billing/plans | No | Marketing + product plan catalog |
| GET | /tenants/:id/billing/trial | Yes | Trial status |
| GET | /tenants/:id/billing/subscription | Yes | Subscription + entitlements |
| POST | /tenants/:id/billing/checkout | Yes | Create Stripe Checkout session |
| POST | /tenants/:id/billing/portal | Yes | Customer portal (501 until launch hardening) |
| POST | /billing/webhooks/stripe | Stripe signature | Subscription lifecycle updates |
Checkout body accepts planCode (starter | plus) and interval (month | year).
Checkout flow
sequenceDiagram
participant You
participant App as product-web
participant API
participant Stripe
You->>App: Choose Starter or Plus on /billing
App->>API: POST /tenants/:id/billing/checkout
API->>Stripe: Create Checkout Session
Stripe-->>App: Redirect URL
You->>Stripe: Complete payment
Stripe->>API: POST /billing/webhooks/stripe
API->>API: Update subscription in Postgres
You->>App: Return to /billing — plan active
Trial behavior
| Property | Value |
|---|---|
| Duration | 14 days (TRIAL_DAYS) |
| Card required at signup | No (marketing CTAs) |
| Limits during trial | Lower caps — see table above |
| After trial | Upgrade via billing or features may block at limits |
Entitlement exceeded — what you see
| Resource | Symptom | Fix |
|---|---|---|
| AutoBlocks | Cannot create new | Delete unused or upgrade |
| Executions | Runs return 402 | Wait for period reset or upgrade |
| Webhooks | Cannot add inbound endpoint | Upgrade or remove endpoint |
| Schedules | Cannot add schedule | Upgrade or remove schedule |
Stripe and invoices
| Topic | Detail |
|---|---|
| Payment processor | Stripe |
| Checkout | Hosted Stripe Checkout |
| Webhooks | Update tenant subscription state |
| Customer portal | Deferred — contact support for invoice changes until portal ships |
Production secrets: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, price IDs — set in Render dashboard per render.yaml.