One webhook link.
Every product gets it.

Most payment processors only give your account one webhook URL. ScaleBills turns that one URL into as many destinations as you need, so every product you run hears about every payment.

1 URL
you give your processor
No limit
on destinations per relay
Metered
usage billing via SDK, in minutes
dashboard.yourprovider.com/settings/webhooks
Webhook URL
https://relay.scalebills.com/in/ing_k93vXqL0mZ|
!This is the only URL field your payment provider gives one account — one project, forever.
ScaleBills sits behind that one URL and splits it
relay ing_k93vXqL0mZ → 3 destinations
Main store checkout
checkout-api.mystore.com
receiving
Subscriptions app
subs.myapp.io/hooks
receiving
NGO donation page
donate.ngo/hooks
receiving
Works with any processor that sends webhooks
PaystackFlutterwaveStripeInterswitchMonnify

This is the wall every builder running more than one thing hits.

Say you use one payment provider account for a store, a subscription product, and a small donation page for a side project. It sends payment events to exactly one place. So the moment you wire it up for the store, the subscription app and the donation page stop hearing about payments at all — unless you're willing to build and babysit your own forwarding service for something that should be this simple.

Main store checkout
Webhook URL registered
connected
Subscriptions app
No events — URL slot already taken
blocked
NGO donation page
No events — URL slot already taken
blocked

Register once. Everything downstream just works.

01

Create a relay, get one URL

ScaleBills gives you a single ingress URL. This is the only thing you paste into your payment provider's dashboard, wherever it asks for a webhook.

POST /relays
{ "name": "Payment provider — main account" }

← ingress_url:
  relay.scalebills.com/in/ing_k93vXqL0mZ
02

Add a destination per product

Each product you run gets its own destination on that same relay — your store's API, your subscriptions app, whatever needs the event.

POST /relays/ing_k93vXqL0mZ/destinations
{ "url": "https://subs.myapp.io/hooks" }

← 3 destinations active
03

Every event reaches every destination

One event in from your processor goes out to all of them, in parallel, with retries on failure and a delivery log you can inspect or replay.

→ checkout-api.mystore.com   200  9ms
→ subs.myapp.io/hooks        200 14ms
→ donate.ngo/hooks           200 11ms

Move to usage-based billing in minutes, not a quarter.

Metering is a separate, standalone piece — it doesn't need a relay to work. Define a meter, choose what you're measuring, and start sending events to it from anywhere in your code. ScaleBills aggregates them as they arrive, so usage numbers are ready to plug into your billing the same day you start sending events.

1
Define a meter
Give it a name and pick the unit you bill on — API calls, minutes, seats, gigabytes, whatever fits the product.
2
Send it events
Drop the SDK into your code and report usage as it happens. No batch jobs, no nightly export.
3
Read the usage
Pull live totals per customer, per meter, and wire them straight into your own billing logic.
ingest.ts
// once — define what you're measuring
const meter = await scalebills.meters.create({
  name: "API requests",
  unit: "request",
})
// → mtr_7pQxL2vNwK

// on every call, from your own code
await scalebills.meters.ingest("mtr_7pQxL2vNwK", {
  customer_id: "cus_4f2a",
  value: 1,
})
API requests — this cyclemtr_7pQxL2vNwK
cus_4f2a18,204 requests
cus_88bd4,910 requests
cus_9c31312 requests

Everything in the console is one API call away.

Provision a relay, attach destinations, rotate keys — script your entire setup if you're standing up a new product and don't want to click through a dashboard for it.

Dedicated ingress URL, generated instantly
Add or remove destinations without touching your provider's dashboard
Delivery retries with exponential backoff
Replay any past event to any destination
add-destination.sh
curl -X POST \
  https://relay-wi5f.onrender.com/relays/ing_k93vXqL0mZ/destinations \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Subscriptions app",
    "url": "https://subs.myapp.io/hooks"
  }'
201 Created · 76ms
{
  "destination_id": "dst_qN3vLp",
  "url": "https://subs.myapp.io/hooks",
  "enabled": true
}

Stop choosing which product gets the webhook.

One relay URL, handed to your processor once. Every product you run after that just needs a destination added — no card required to try it.