> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comforthub.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Stripe

> Subscriptions only: plans, monthly billing, and the events we listen to

Stripe bills plan customers by the month and is the source of truth for a subscription's plan, amount and status. Nothing else is sold through it: an invoice for a job is paid on the pay page; see [How payments work](/handbook/payments/how-payments-work).

## What Stripe owns

| Thing                                                          | Where it lives             | Who changes it                                      |
| -------------------------------------------------------------- | -------------------------- | --------------------------------------------------- |
| The customer's card and the monthly charge                     | Stripe                     | The customer, or the office in the Stripe dashboard |
| The plan and its price                                         | A Stripe product and price | The office in Stripe                                |
| The subscription's status (Active, Past Due, Paused, Canceled) | Stripe                     | Stripe, on payment or cancellation                  |

Our side and Zoho hold copies. The engine's plan table, kept in the backend code, maps each Stripe product to a plan name (All-Season, Heating Only, Cooling Only, Tankless) and whether it includes protection. An event naming a product missing from that table is refused: nothing is written, it is not retried, and the failure is left for a person. A new Stripe product is therefore a code change before it is sold.

## The events we listen to

The engine listens to five events: subscription created, updated and deleted, invoice paid, and invoice payment failed. Every call is checked against Stripe's signature and against a five-minute clock window, and an event seen before is stored once and ignored after. What follows each event, on our side and in Zoho, is on [Subscriptions](/handbook/payments/subscriptions).

## Keys and mode

The vault holds one Stripe secret key, a live one, and the subscription webhook's signing secret, both in the functions' secret group; see [Environments and secrets](/systems/environments-and-secrets). There is no test-mode key, so every charge Stripe makes is a real one. A webhook call the engine refuses means the signing secret in Stripe and the one the engine holds differ; rotate them together.

## Related

* [Subscriptions](/handbook/payments/subscriptions)
* [How payments work](/handbook/payments/how-payments-work)
* [Who is the source of truth](/systems/who-is-the-source-of-truth)
