**Billing** is where you define the plans *your* application sells: _"Manage plans, features, and subscriptions."_ It is not your Authdog invoice — that is set per organization. This module lets Authdog issue tokens that carry a user's entitlements, so your app can gate features without maintaining its own subscription store.

![Billing plans](/content/console/billing.plans.png)

## Prerequisite: connect Stripe

The page states the dependency up front: plans are billed through the Stripe connection configured under **Authentication → Add-ons → Stripe**. Connect Stripe there first — see [Authentication > Add-ons](/docs/console/authentication).

That single connection does three things: it charges the subscriptions defined here, it syncs seat counts for per-seat billing, and it lets Authdog stamp entitlements into access tokens.

## Plans

`?tab=plans` — the plan catalog. Click **"New plan"** to create one. Empty environments read _"No plans yet. Create one to start billing."_

A plan carries:

- A **name** and identifier your app can reference
- Its **Stripe price** mapping
- The **features** (entitlements) it grants

Features are the part your application code cares about. Once a user is subscribed, their entitlements are available from the session, so a feature check is a local read rather than a round trip to Stripe.

## Checkout

Authdog ships embedded Stripe Elements checkout components in the React elements package, plus REST endpoints on the identity service, so the subscribe flow can live inside your own UI. See [Billing](/docs/billing) for the client-side integration.

## Scope

Plans are defined per environment, so a `dev` environment can carry test-mode prices while `prod` carries live ones — the same separation Stripe itself uses for test and live keys.

Subscriptions in the current version are **user-level**: a subscription belongs to an individual user rather than to an organization.

> **Tip**
>
> Model features generously. Adding a feature flag to a plan later is cheap;
> re-plumbing your app because a plan only exposed a plan *name* is not.

## Related

| Read | To learn how to |
|------|-----------------|
| [Authentication](/docs/console/authentication) | Connect Stripe under Add-ons |
| [Organizations](/docs/console/organizations) | Where your own Authdog subscription tier lives |
| [Users](/docs/console/users) | See which users hold a subscription |
| [Billing](/docs/billing) | Build the checkout and entitlement checks in your app |
| [JWT claims](/docs/jwt-claims) | Read entitlements from the access token |
