Xendit doesn't natively connect to Twilio for voice payments. If you want to process Xendit card transactions during a phone call (via IVR, agent-assisted, or AI voice agent), you need a Twilio Pay Connector that bridges the two platforms.
Shuttle's Pay Connector does exactly this. It connects Xendit (and 30+ other gateways) to Twilio's <Pay> verb, so you can accept PCI-compliant card payments during any voice interaction.
This matters for two audiences in particular: businesses serving Indonesian and Philippine customers who want to take card payments over the phone, and Philippine BPOs collecting payments on behalf of their clients. This guide walks through how the integration works, how to set it up, and what to watch for.
Why Xendit + Twilio Don't Connect Directly
Xendit is one of Southeast Asia's leading payment gateways, built for online commerce across Indonesia, the Philippines, and neighbouring markets. Its APIs handle cards (Visa, Mastercard, American Express, JCB), local e-wallets such as OVO, DANA, and GCash, virtual accounts, and QR payments, with processing in IDR, PHP, and other regional currencies.
Twilio is built for voice and messaging. Its <Pay> verb captures card details during phone calls via DTMF keypad input, with tones suppressed so agents never hear them.
The problem: Twilio's <Pay> needs a Pay Connector to route captured card data to a payment gateway. Xendit isn't one of Twilio's built-in connectors, so there is no native way to send a card captured on a Twilio call to your Xendit account.
This is where Shuttle comes in. As Twilio's official payment partner, Shuttle provides a Pay Connector that accepts card data from Twilio's <Pay> verb and routes it to Xendit's API for processing. One integration connects the two platforms.
One note on scope: voice payments are card payments. E-wallets like GCash and OVO require the customer's app, so they can't be captured on a keypad. For those methods, send a payment link by SMS during the call instead. Shuttle supports both from the same account.
How It Works
`` Caller → Twilio (DTMF capture) → Shuttle (Pay Connector) → Xendit (processing) → Result ``
Caller reaches payment step. Your Twilio call flow (IVR, Studio, or custom TwiML) triggers the
<Pay>verb.Card details captured via DTMF. The caller enters their card number, expiry, and CVV on the keypad. Tones are suppressed from the agent audio and call recordings.
Shuttle receives card data. The data passes from Twilio's PCI-compliant environment directly to Shuttle's connector. It never touches your servers.
Shuttle charges the card via Xendit. The connector creates a Xendit payment request, processes the transaction through your Xendit account, and handles the response.
Result returned to your call flow. Your webhook receives the Xendit reference, last four digits, card brand, and transaction status. The call continues.
The entire flow happens in seconds. The caller stays on the line. No redirects, no "please visit our website."
Step-by-Step Setup
Prerequisites
A Twilio account with voice capability
A Xendit account with API credentials (a secret API key generated from the Xendit dashboard)
A Shuttle account (free to create: you pay per transaction)
Step 1: Install Shuttle's Pay Connector
Go to the Twilio Marketplace and install the Shuttle Pay Connector. This adds Shuttle as an available connector in your Twilio account's Pay configuration.
Step 2: Add Xendit Credentials to Shuttle
Log into the Shuttle dashboard. Navigate to Payment Profiles and create a new profile:
Gateway: Xendit
API key: Your Xendit secret API key
Currency: Set your default (IDR, PHP, etc.)
Environment: Live or Test
Save the profile. Shuttle now has a live connection to your Xendit account.
Step 3: Configure Your Twilio Call Flow
Add the <Pay> verb to your TwiML or Twilio Studio flow:
``xml <Response> <Say>Please enter your card number followed by the hash key.</Say> <Pay paymentConnector="shuttle-pay-connector" chargeAmount="1499.00" currency="PHP" description="Invoice payment" action="/payment-complete"> </Pay> </Response> ``
Key parameters:
paymentConnector: set toshuttle-pay-connectorchargeAmount: the amount to chargecurrency: ISO currency code (PHP, IDR, etc.)action: your webhook endpoint for the payment result
Step 4: Handle the Payment Result
Twilio sends a POST to your action URL with the payment result:
``json { "Result": "success", "PaymentCardNumber": "xxxx-xxxx-xxxx-1234", "PaymentCardType": "visa", "PaymentConfirmationCode": "XENDIT-REF-123...", "ProfileId": "your-shuttle-profile-id" } ``
Use the PaymentConfirmationCode to look up the transaction in Xendit if needed. Update your order, confirm to the caller, and continue the flow.
Step 5: Test
Use Xendit's test environment (your test API key) and Xendit's published test card numbers to verify the flow end-to-end before going live.
What You Can Do With Xendit + Twilio
Charge Immediately
Standard auth-and-capture. The caller pays, Xendit processes, done. Ideal for phone orders, bill payments, and bookings in IDR or PHP.
Tokenise for Future Use
Capture card details once over the phone. Shuttle tokenises the card and returns a reusable token, so you can charge future payments across any channel: web, mobile, voice, or payment links. The card data is never stored in your systems.
Multi-Client Collection for Philippine BPOs
The Philippines is a global BPO hub, and payment collection is a natural fit for contact centres already handling customer calls. With Shuttle, a BPO can collect payments on behalf of multiple clients through a single Twilio integration. Each client's transactions route to their own Xendit account (or whichever gateway that client uses), keeping funds and reporting cleanly separated.
Mix Voice and Payment Links
Not every caller wants to key in a card. Send a payment link by SMS mid-call for customers who prefer to pay by GCash, OVO, or another local method Xendit supports, while keeping card-on-call as the fast path.
Multi-PSP: Beyond Xendit
One of the key advantages of using Shuttle rather than a single-gateway connector is flexibility. Your Twilio integration stays the same even if you:
Add a second gateway: route Indonesian and Philippine transactions to Xendit and other markets to a local acquirer
**Serve enterprise customers** who mandate a specific PSP (Stripe, Adyen, Worldpay, etc.)
Need failover: if one gateway has an outage, automatically route to a backup
Expand to new markets where a different acquirer gives better authorisation rates
You configure routing rules in Shuttle's dashboard. Your Twilio call flow doesn't change. The <Pay> verb always points to shuttle-pay-connector, and Shuttle handles which gateway processes the transaction, by merchant, region, amount, or failover rules.
This is particularly important for BPOs and platforms serving multiple merchants: each merchant can use their own Xendit account (or any other gateway) through the same Twilio integration.
PCI Compliance
The Xendit + Twilio integration via Shuttle keeps you completely out of PCI scope:
Layer | PCI handled by |
|---|---|
DTMF capture & suppression | Twilio |
Card data processing | Shuttle (PCI DSS Level 1 Service Provider) |
Payment processing | Xendit |
Your systems | No card data: SAQ-A |
Card data flows from Twilio to Shuttle to Xendit. Your application only receives redacted data (last 4 digits, card brand, gateway reference). You qualify for SAQ-A, the lightest PCI self-assessment.
For the full picture on PCI compliance with Twilio, see Twilio PCI Compliance: Payments Without Handling Card Data.
FAQ
Can I connect Xendit to Twilio without Shuttle? Twilio doesn't have a built-in Xendit Pay Connector. You'd need to build a custom connector using Twilio's Generic Pay Connector framework, which means handling PCI compliance for card data processing yourself. Shuttle provides a pre-built, PCI-certified connector that handles this.
Which currencies can I charge over the phone? Whatever your Xendit account supports for card processing, including IDR and PHP. Set the currency parameter on the <Pay> verb to match.
Can callers pay with GCash or OVO over the phone? Not via DTMF: e-wallet payments happen in the customer's app, not on a keypad. The standard pattern is to send a payment link by SMS during the call, which opens Xendit's supported local methods.
**Does this work for Philippine BPOs collecting for multiple clients?** Yes. Shuttle profiles let each client's payments route to their own Xendit account (or their own gateway of choice), all through one Twilio integration. See payment collection for BPOs.
What about Xendit's test environment? Fully supported. Use your Xendit test API key in Shuttle and test the full flow with Twilio before going live.
What does it cost? Shuttle charges $0.20 per successful transaction. Xendit's standard processing fees apply on top. No Shuttle setup fees or monthly minimums.
Can I switch from Xendit to another gateway later? Yes. Change the gateway in your Shuttle payment profile. Your Twilio call flow stays exactly the same: no code changes needed.
Related Reading
Twilio Pay Connectors: How to Connect Any Payment Gateway: the complete guide to Twilio Pay Connectors and multi-PSP routing
Twilio PCI Compliance: Payments Without Handling Card Data: how to keep your PCI scope at SAQ-A
How to Connect Stripe to Twilio for Voice Payments: step-by-step Stripe + Twilio setup
How to Connect PayU to Twilio for Voice Payments: connecting the other major emerging-markets gateway
Payment Collection for BPOs: multi-client payment collection for outsourcers
Xendit: Xendit on Shuttle, supported features and channels
Twilio Pay: Connect Any Payment Gateway to Twilio: all supported gateways, pricing, and setup
*Connect Xendit to Twilio in minutes with Shuttle's Pay Connector: PCI DSS Level 1, $0.20/transaction, no setup fees. Install on Twilio or book a discovery call.*