Skip to main content
Pick one source of payments. Either your billing integration sends them, or your backend does.

A. Billing integration

Stripe

Paddle

Chargebee

With a billing integration connected, don’t also call POST /v2/transactions. Each charge would be counted twice and pay two commissions.

B. Record a charge with the API

Call this wherever you confirm a successful charge. amount is an integer in the smallest currency unit (4900 = $49.00). customer_id is Tolt’s cus_... id, not yours.
Your billingcharge
Your serverbackend
Tolt/v2 API
1ch_3Qf8… succeeded
2POST /v2/transactions
3201 txn_Hc5d…
4flows → comm_2nV8…
Tolt credits the customer’s partner and marks the customer active. Your commission flows run in the background, so the commission can appear a moment after the response; recording a payment doesn’t pay anyone by itself:
Jane’s payment txn_Hc5d…
Transaction API12:15
Customer Active12:15
Commission Pending12:15
Approvedcomm_2nV8… Approved+30d
Paid Paid+45d

Immediate approval skips pending. See commission lifecycle for rejections and refunds.

Send a charge_id with every payment. A customer can have only one transaction per charge_id, so a retried webhook that posts the same charge again gets a 409 already_exists instead of a second transaction; treat that 409 as already handled. That also makes SDK retries safe, so the samples above keep them on. Without a charge_id (or with an empty one) nothing is deduplicated. Give each renewal its own id, such as the invoice or charge id, not the subscription id.

Find the customer id

Best: store the cus_... id when you track the signup. Otherwise, look it up:
No match means the customer wasn’t referred. Skip the transaction.

Refunds

Refund the transaction by its txn_... id. Unpaid commissions become refunded. Already paid ones get a negative commission that nets against the next payout.