Plans and quotas

Embed
Preview of the card
<a href="https://forumulate.com/guides/plans-and-quotas"><img src="https://forumulate.com/guides/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/36aa4df0-1e95-4cef-8ae9-795169441345/pages/5021e57b-46de-43fe-b886-94e77263d3e6/social-card.svg?v=3e7ae33eec8b" alt="Plans and quotas" width="600" height="315"></a>

This page is about amounts. All three surfaces — docs, community and blog — are in every plan, with the same unified search, the same identity and the same API, and the tables below are the only thing a tier changes about them.

Three things are sold by tier rather than metered, and they are the one part of the product this page does not govern: a custom domain from Starter, SSO/SAML/SCIM from Business, and org-wide MFA, audit and priority support from Enterprise. The pricing page is where they are listed, a column each.

This page used to open with a blanket promise that no tier could reach less of the product than any other, over a pricing table that names those three by tier. A customer read the two together and called it a bait (Crossly D-11), and they were right to. Naming the tier each one starts at is the fix — it is still the claim that sells, and it is the one that survives being checked.

The quota table was missing from this page: it promised "Plans differ by these quotas" and then listed nothing. Here it is.

The limits

Unlimited means there is no cap.

Free

Starter

Business

Enterprise

Staff seats

2

5

15

Unlimited

Forum categories (per community)

10

Unlimited

Unlimited

Unlimited

Translation languages

2

Unlimited

Unlimited

Unlimited

File storage

5 GB

20 GB

100 GB

200 GB

Emails per month

20,000

100,000

300,000

1,500,000

Page views per month

500,000

500,000

500,000

1,000,000

AI credits per day

100,000

500,000

1,000,000

5,000,000

API requests per minute

300

600

1,800

6,000

A few notes on individual rows, because each one is measured differently.

Staff seats count people who can edit. Readers are not seats, however many of them you have, and a reader who signs in to a gated space is still not a seat.

Translation languages are unlimited on every paid plan. On Free you can publish in two languages besides your source language, in docs and content spaces alike.

Forum categories, translation languages, storage and staff seats are counted live from their own tables, so a deletion frees the quota immediately. Forum categories are counted per community space: each forum on the Free plan holds 10, however many forums you run. GET /orgs/{orgId}/plan reports the fullest space as used and every space under bySpace.

Emails, page views and AI credits are metered into counters — monthly for the first two, daily for AI. A monthly counter rolls over on your billing period, not on the first of the month.

AI credits only apply to AI features you have enabled, and those run on your provider key. See AI features and bring-your-own-key. A credit is a unit of our orchestration, not a charge from your provider — your provider bills you separately for the tokens.

API requests per minute is per organization for an authenticated caller. An anonymous caller is limited to 120 a minute per IP, on every plan, because a per-IP bucket is the wrong place to sell capacity. A handful of public endpoints are tighter still and declare their own limit in RateLimit-Policy.

Content spaces (headless CMS)

A content space serves structured content to your own website through the delivery API. Its amounts are on the same plan, and media uses the same file storage as everything else.

Free

Starter

Business

Enterprise

Content entries (per organization)

1,000

10,000

100,000

Unlimited

Content types (per space)

10

25

100

Unlimited

Delivery API requests per month

100,000

1,000,000

5,000,000

50,000,000

Reference depth per delivery request

2

3

5

10

Versions kept per entry

10

50

200

Unlimited

Redirect rules (per content space)

50

500

5,000

Unlimited

Webhook endpoints (per content space)

2

5

20

100

Delivery keys (per content space)

3

10

50

Unlimited

Delivery requests count requests made with a delivery key. Requests your site's CDN answers from its cache never reach us and are not counted.

Reference depth is how many levels of references one request may expand. It is finite on every plan, Enterprise included, because each level multiplies the work a single request can cause.

Entries count each entry once, whatever number of languages it is translated into, and an entry in the trash does not count.

Some content-space features are included from a given plan, and each later plan includes everything in the plans before it:

Feature

Included from

Delivery API, publishable keys, draft preview, routes and catch-all pages, importers

Free

Live preview, computed fields, hosted output, AI for content

Starter

Visual editing and click-to-edit encoding, releases, review workflow, per-locale grants

Business

Environments

Enterprise

Using a feature your plan does not include returns 402 with the code quota.exceeded, the same error as a limit. details.feature names the feature and details.requiredPlan names the plan that includes it.

Forms and payments

Forms are on every plan, the free plan included, with every field type, branching, scoring and integration. Taking payments (a paid form, and the shop's products, cart and checkout) is included from Starter. Payments go through your own Stripe account and we take no cut; the paid-plan rule is a brake on fraud, because free accounts accepting payments are a common abuse vector.

A payment your plan does not include returns 402 with the code plan.required (not quota.exceeded: nothing was used up), with details.feature: ["commerce.payments"] and details.requiredPlan: ["starter"]. Paid forms and products that existed before 20 October 2026 are grandfathered and keep working. Details in Payments and the shop.

Add-ons

A limit can be topped up individually without changing tier. An add-on adds to the plan's limit; on a tier where the limit is already unlimited it stays unlimited.

Reading your own usage

GET /orgs/{orgId}/plan

Returns your tier, current usage for each counted metric under metrics, every limit under limits (including the ones with no usage to count, such as reference depth), and under features whether your plan includes each plan feature (commerce.payments, content.releases, …). That is the call to put on your own dashboard rather than inferring from this table — the numbers here are the defaults and your organization may have add-ons.

You are warned before you hit a wall rather than at it.

Changing plan

Open Plan in the organization console. If your organization needs an invoice rather than a card, or a limit that is not on the table, write to us.

Paying by card goes through Stripe. POST /orgs/{orgId}/billing/checkout opens a checkout and POST /orgs/{orgId}/billing/portal the billing portal (both need org.manage_billing). Stripe then reports what happened to POST /billing/stripe/webhook, which accepts only events carrying a valid Stripe signature; there is nothing for you to configure. A completed checkout moves the organization to the plan it bought, a subscription that changes price moves it to that price's plan, and a subscription that is cancelled, unpaid or expired returns it to Free.

Corrections to what you may have read elsewhere

Two things on the public pricing page contradict this one, and this page is the accurate one:

  • The pricing page gates Custom domain, SSO, SAML & SCIM, Org-wide MFA & audit and Priority support by tier. The product does not enforce those four by plan. Custom domains and SSO work on every tier. The only features the product enforces by plan are the content-space features listed above.

  • The pricing page says you can "host it yourself on any tier". You cannot. Forumulate is hosted; we run it, monitor it and back it up. There is no self-hosted edition and no plan that includes one.

In the API

Every operation below is also reachable from the other surfaces without a dedicated command. forumulate api <Operation> calls it from the CLI, the JavaScript SDK has a typed method for each one (the last column names it; the Python and Go clients are generated from the same spec), and an agent reaches the organization-scoped ones through the MCP call_api tool. Where a CLI command or MCP tool exists too, the last column names it. Operation names link to the API reference.

Billing

Operation

Request

What it does

Shortcuts

Billing_view

GET /orgs/{orgId}/billing

Get the billing in an organization

client.billing.view()

Billing_checkout

POST /orgs/{orgId}/billing/checkout

Create the checkout in an organization (billing)

client.billing.checkout()

Billing_portal

POST /orgs/{orgId}/billing/portal

Create the portal in an organization

client.billing.portal()

Growth

Operation

Request

What it does

Shortcuts

Growth_conversions

GET /orgs/{orgId}/analytics/conversions

List conversions in an organization

client.analytics.growth.conversions()

Growth_settle

PUT /orgs/{orgId}/spaces/{spaceId}/pages/{pageId}/experiments/{key}

Replace the experiment

client.analytics.growth.settle()

Onboarding

Operation

Request

What it does

Shortcuts

Onboarding_surfaces

GET /onboarding/surfaces

List surfaces

client.users.onboarding.surfaces()

Onboarding_availability

GET /onboarding/availability

Get the availability

client.users.onboarding.availability()

Onboarding_provision

POST /onboarding

Create the onboarding

client.users.onboarding.provision()

Org plan

Operation

Request

What it does

Shortcuts

Org_plan

GET /orgs/{orgId}/plan

Get the plan in an organization

client.orgs.plan()

Org_setPlan

PATCH /orgs/{orgId}/plan

Update the plan in an organization

client.orgs.setPlan()

Org_setOverride

PATCH /orgs/{orgId}/plan/overrides

Update overrides in an organization

client.orgs.setOverride()

The Forumulate teamUpdated