C
ChurnRecovery
Get started free
🔌

ChurnRecovery + Custom / Webhook

Running a custom billing system or an unsupported processor? ChurnRecovery's universal webhook API works with anything that can send an HTTP request.

Setup time
1 hour
Difficulty
Advanced
Avg save rate
17%
Price
Free

Overview

Not everyone uses Stripe or Chargebee. If you've built your own billing system, run on a niche processor, or have a hybrid setup, ChurnRecovery's generic webhook API has you covered.

Any event — subscription cancellation, payment failure, trial expiry — can be sent to ChurnRecovery as a JSON webhook. We'll handle the cancel flow logic, retention offers, and analytics, and send results back via webhook callback to your system.

What's included

  • Generic JSON webhook receiver
  • Bring your own subscription IDs and customer data
  • Webhook callback when save/lost decision is made
  • REST API for programmatic flow triggering
  • Custom cancel flow logic via API config
  • No dependency on specific payment processors
  • Works with Zuora, Avalara, Maxio, and more

Use cases

Custom Billing Systems

Built your own billing? Use our webhook API to add cancel flows

Multi-Processor Setup

Stripe + Paddle hybrid? One unified cancel flow for both

Zuora / Maxio Integration

Enterprise billing platforms not natively supported

Legacy System Migration

Add cancel flows to legacy billing while you migrate

Code examples

Real code for your Custom / Webhook integration. Copy and customize.

Trigger a cancel flow via REST APIbash
curl -X POST https://api.churnrecovery.com/v1/flows/trigger \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "cust_123",
    "subscription_id": "sub_456",
    "plan_name": "Pro Plan",
    "mrr": 99,
    "cancellation_reason": "user_initiated",
    "callback_url": "https://yourapp.com/webhooks/churnrecovery"
  }'
Handle callback webhookjavascript
// pages/api/churnrecovery-callback.js
export default async function handler(req, res) {
  const { event, subscription_id, outcome, offer_accepted } = req.body
  
  if (event === 'flow_completed') {
    if (outcome === 'saved') {
      // Customer retained! Apply offer to your billing system
      await applyOffer(subscription_id, offer_accepted)
    } else {
      // Customer churned — proceed with cancellation
      await processCancellation(subscription_id)
    }
  }
  
  res.json({ received: true })
}

Setup checklist

  1. 1Get your API key from the ChurnRecovery dashboard
  2. 2Send a POST to /v1/flows/trigger when cancellation is requested
  3. 3Set up a callback URL to receive the save/lost outcome
  4. 4Apply the offer outcome (discount, pause, plan change) in your system
  5. 5Optional: install @churnrecovery/react for the frontend widget
🚀

Ready to get started?

Free forever. No credit card. Set up in 1 hour.

Get early access →

Stop losing customers you could keep

Most SaaS companies recover 20–30% of would-be churners with cancel flows. ChurnRecovery makes this free for Custom / Webhook users.

Get early access — it's free