Billing integrations
Point your billing provider's webhook at Runearc. Purchases, subscriptions and refunds become events that sequences and goals can use, and each contact's revenue stays up to date.
Connect a provider
In Settings, Integrations, connect a provider, or call POST /v1/integrations/billing. You get a webhook URL of the form /v1/hooks/billing/{provider}/{token}. Paste it into the provider. Every request is checked against the signing secret, which is stored encrypted and never shown again.
runearc integrations connect stripe --secret whsec_...
runearc integrations events bil_...| Provider | Secret | Verification |
|---|---|---|
| stripe | Paste the endpoint signing secret (whsec_...) | Stripe-Signature, HMAC-SHA256 with a 5 minute tolerance |
| paddle | Paste the notification endpoint secret | Paddle-Signature, HMAC-SHA256 with a 5 minute tolerance |
| lemonsqueezy | Leave the secret empty; copy the generated one into Lemon Squeezy | X-Signature, HMAC-SHA256 of the body |
| polar | Paste the webhook secret | Standard Webhooks, 5 minute tolerance |
| revenuecat | Set the Authorization header value to your secret | Shared header value |
| adapty | Set the Authorization header value to your secret | Shared header value |
| shopify | Paste the app client secret | X-Shopify-Hmac-Sha256, base64 HMAC-SHA256 of the body |
Events
Each payload becomes one of these events with the properties provider, amount_cents, currency, plan and external_customer_id.
| purchase | A one-time payment. |
| subscription_started | A subscription began and the first invoice was paid. |
| renewed | A later billing cycle was paid. |
| cancelled | Renewal was switched off; access continues until the period ends. |
| churned | The subscription ended. |
| refunded | Money was returned. |
| trial_started | A free trial began. |
Revenue rules
Purchases, started subscriptions and renewals add to the contact's revenue; refunds subtract, never below zero. Amounts are summed in minor units and the currency is not converted. A buyer who is not yet a contact is created with source billing:{provider} and their email status is never changed. A redelivered event is ignored, and an event with no email (and no earlier event that taught the customer id) is logged as unmatched.
401 billing_signature_invalid. Check that the secret in Runearc is the provider's current one.