Skip to main content
Churn is decided weeks before you find out. By the time the cancellation email lands, the decision was made and the conversation happened without you. Keep connects your billing to your product usage, shows which paying accounts have stopped showing up, and sends the alert on Slack.

Where the revenue comes from

Stripe

Stripe Connect OAuth, read-only. Brings MRR, subscriptions, and plan changes.

AbacatePay

A read-only key, pasted in Integrations. Card or Pix subscriptions land in the same MRR and the same risk list.

Asaas

A read-only key, pasted in Integrations. Boleto, Pix, or card — the subscriptions land in the same MRR and the same risk list.
All three add up. Whoever charges through more than one sees a single MRR.

Order matters more than the signal

The list comes ordered by how much money is at stake, not by who dropped the most. A 90% drop on a R90accountcanwait.A4090 account can wait. A 40% drop on a R4,200 account cannot. Nearly every churn tool orders by signal severity, which looks good on a chart and is useless on a Monday morning, when you have time to call three people and need to know which three.

Where the usage comes from

Two sources, and they add up.

PostHog

Connects over OAuth, read-only. Keep matches each customer by email.

Your own ingestion

One HTTP call from your backend. It is the only way the match is exact, because you send the customer id instead of letting us guess by email.
In B2B, whoever pays the invoice is rarely who uses the product: billing goes to finance@ and access comes from someone else. That is why email matching has a ceiling, and why sending the customerId changes the nature of the problem instead of improving the heuristic.