How the pieces map to Pipecat
| Ringup piece | On Pipecat |
|---|---|
create_checkout | An HTTP POST from a function your LLM calls when the order is confirmed |
| The transfer target | The transfer_to SIP URI the Checkout Session returns |
| The transfer | A <Dial><Sip> on your telephony transport to the Ringup SIP URI |
| The result | A checkout.completed webhook to your server |
Prerequisites
- A running Pipecat pipeline with telephony (a Twilio/Telnyx/Plivo/Exotel WebSocket serializer, or Daily PSTN/SIP dial-in).
- The telephony account that owns the inbound call leg.
- A Ringup account and API key. Test mode works out of the box on a shared sandbox. See Testing.
Step 1: Create a Checkout Session when the order is confirmed
Register a function on your LLM (FunctionSchema) that the model calls once the order is
confirmed, and in its handler POST to Ringup with your API key. There is nothing to register
with Ringup; this is a plain HTTP call from your handler.
payment_required is none, do not transfer: finish the call normally. Otherwise transfer.
Step 2: Transfer on your transport
Have the agent speak one short bridge line (“One moment, connecting you to secure payment”), then transfer the caller on your telephony. On a Twilio transport, redirect the call to TwiML that dials the Ringup SIP URI, carrying the Checkout Sessionid:
Step 3: The return, and the result (the webhook)
Ringup answers the transferred call, recognizes the Caller, charges the saved Card, and texts a receipt. A first-time caller with no saved card is texted a secure pay link instead. Then the call ends one of three ways, from what you passed in Step 1:return_toset: Ringup transfers the caller back to your transport with the outcome in SIP headers (X-Payment-Status,X-Confirmation), so your agent resumes and closes the call.success_message/failure_messageset (noreturn_to): Ringup reads your line and ends.- Neither: Ringup reads a short default and ends. The receipt is the proof.
return_to that cannot connect falls back to reading your success_message (or the default),
so a failed return never strands the caller. Either way, your server reconciles from a webhook:
order_id you passed, store the payment_id, and flip your order to paid. See
Webhooks for the full catalog, statuses, signature verification, and
idempotency.
Validation status
Because your transport owns the telephony, the transfer is standard<Dial><Sip> (or the Daily
SIP equivalent) on your provider. Ringup’s hosted transfer endpoint is rolling out; confirm access
in your Ringup dashboard before relying on this in production. The recognition, charge, receipt,
and webhook behavior is the same payment path Ringup runs everywhere.