Migrating from Worldpay
A practical guide for travel businesses migrating from Worldpay to Felloh. This covers concept mapping, code migration patterns, and a step-by-step migration plan so you can move with confidence.
Worldpay is a traditional payment gateway — it processes card transactions but leaves booking management, installment scheduling, trust accounts, and supplier payments to you. Felloh replaces the gateway and adds the travel-specific layer on top, so you can remove significant amounts of custom code.
Concept mapping
Understand how Worldpay concepts translate to Felloh before writing any code.
Direct equivalents
| Worldpay | Felloh | Notes |
|---|---|---|
| Shopper (customer record) | Customer | Felloh customers have name, email, and address — scoped to an organisation. |
| Refund (modification request) | Refund | Felloh uses a two-stage process — refunds require separate authorisation. |
| Notification (webhook) | Webhook | Same concept, different event names and payload format. Felloh uses HMAC-SHA256 signatures. |
Different concepts
| Worldpay | Felloh | How it differs |
|---|---|---|
| Order (payment request) | Payment Link / Ecommerce / Scheduled Payment | Worldpay Orders are a single payment request. Felloh splits payment collection into three tools — see choosing a payment method. |
| Payment / Settlement | Transaction | A Felloh Transaction represents a completed payment. It's always linked to a Booking. |
| Token (stored card) | Tokenised Card | In Worldpay, you explicitly create a token via the tokenisation API. In Felloh, cards are automatically tokenised when a customer pays. |
| Hosted Payment Page | Payment Link | Worldpay's HPP requires configuration in the merchant admin. Felloh payment links are created via a single API call. |
| Batch processing | Scheduled Payment | Replace batch files with individual scheduled payments, each with a specific execution date. |
| Risk management (separate product) | Fraud Shield | Felloh includes configurable fraud rules — 3DS, card, customer, device, location, and velocity checks — in every account. Configure via the Dashboard. |
| Terminal / POS | Terminal | Felloh supports in-person payments via terminals. Speak to your account manager to get set up. |
Felloh concepts with no Worldpay equivalent
These are features you gain by moving to Felloh.
| Felloh feature | What it does |
|---|---|
| Booking | A container linking a customer's trip to all their payments, refunds, payment links, and scheduled payments. Replaces the custom booking-to-payment mapping you built around Worldpay. |
| Disbursements | Pay suppliers directly from trust accounts. Replaces manual bank transfers or custom disbursement code. |
| Beneficiaries | Manage supplier bank details for disbursements. |
| Credit Notes | Track credits and adjustments against bookings. |
| MCP Server | Connect AI agents and editors to Felloh for conversational payment management. |
| Trust accounts | Felloh manages ATOL/ABTA-compliant trust accounts. No separate trust account provider needed. |
| Automatic reconciliation | Every payment — cards, open banking, and bank transfers — is automatically matched to its booking using 3-point verification. Eliminates manual spreadsheet reconciliation. |
| Automatic surcharging | Detects corporate and international cards at the point of payment and applies compliant surcharges in real time. Protects margins without manual fee calculations. |
The booking model
The biggest conceptual shift is that every payment in Felloh is tied to a Booking. In Worldpay, you send a payment request with an order code and amount — the gateway has no concept of what the payment is for. In Felloh, you create a booking first, then collect payments against it.
Worldpay flow:
Order Code → Payment Request → Settlement
(you maintain the link to your booking system)
Felloh flow:
Customer → Booking → Payment Link / Ecommerce / Scheduled Payment → Transaction
(booking is a first-class object — payments are linked automatically)
This means you can remove any custom code that links Worldpay transactions to your booking system. Felloh handles this relationship natively.
If you currently use Worldpay's order code to link payments to booking references, Felloh replaces that pattern. The booking reference is a first-class field on the booking object, and all transactions are automatically linked.
Choosing a payment method
In Worldpay, you submit a payment request (often via XML) or redirect to the Hosted Payment Page. In Felloh, you choose based on the scenario:
| Scenario | Worldpay | Felloh |
|---|---|---|
| Send customer a link to pay | Hosted Payment Page | create-payment-link |
| Embed payment in your app | Direct API / CSE | create-ecommerce + Felloh SDK |
| Charge a saved card later | Token + scheduled batch / cron | create-scheduled-payment |
| Charge a saved card now | Token + direct authorisation | create-scheduled-payment with today's date |
Code migration
Authentication
Worldpay uses HTTP Basic Auth with a merchant code, XML username, and password (or an API key for newer integrations). Felloh uses a public/private key pair to generate a bearer token.
Authentication
import axios from 'axios';
// Worldpay — HTTP Basic Auth
const worldpayClient = axios.create({
baseURL: 'https://secure.worldpay.com/jsp/merchant/xml/paymentService.jsp',
auth: {
username: 'MERCHANT_CODE',
password: 'XML_PASSWORD',
},
headers: { 'Content-Type': 'application/xml' },
});
Felloh tokens are valid for a limited time. Cache and refresh them as needed. See the Authentication guide for full details.
Creating a customer
Worldpay doesn't have a dedicated customer creation API — shopper details are passed with each order. Felloh has a dedicated customer resource.
Create a customer
// Worldpay — customer details are embedded in the order XML
const orderXml = `
<paymentService version="1.4" merchantCode="MERCHANT_CODE">
<submit>
<order orderCode="ORDER-001">
<shopper>
<shopperEmailAddress>sarah@example.com</shopperEmailAddress>
</shopper>
<!-- ... payment details ... -->
</order>
</submit>
</paymentService>
`;
Creating a booking (new concept)
This has no Worldpay equivalent — it's the step that replaces your custom booking-to-payment mapping.
Create a booking
const response = await axios({
method: 'post',
url: 'https://api.felloh.com/agent/bookings',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
data: {
organisation: 'your-organisation-id',
booking_reference: 'TRIP-2026-001',
gross: 150000, // £1,500.00 in pence
currency: 'GBX',
customer_email: 'sarah@example.com',
customer_name: 'Sarah Jones',
departure_date: '2026-08-15',
return_date: '2026-08-22',
},
});
Collecting a payment
Collect a payment
<?xml version="1.0" encoding="UTF-8"?>
<paymentService version="1.4" merchantCode="MERCHANT_CODE">
<submit>
<order orderCode="TRIP-2026-001-DEP">
<description>Deposit for August trip</description>
<amount currencyCode="GBP" exponent="2" value="50000"/>
<orderContent>Deposit payment</orderContent>
<paymentMethodMask>
<include code="ALL"/>
</paymentMethodMask>
<shopper>
<shopperEmailAddress>sarah@example.com</shopperEmailAddress>
</shopper>
</order>
</submit>
</paymentService>
Processing a refund
Process a refund
<?xml version="1.0" encoding="UTF-8"?>
<paymentService version="1.4" merchantCode="MERCHANT_CODE">
<modify>
<orderModification orderCode="TRIP-2026-001-DEP">
<refund>
<amount currencyCode="GBP" exponent="2" value="20000"/>
</refund>
</orderModification>
</modify>
</paymentService>
Felloh's two-stage refund process is intentional — it prevents accidental refunds and supports compliance workflows where a manager must approve refunds. If you want to auto-authorise, call both endpoints sequentially in your code.
Scheduling a future payment
Worldpay doesn't have native payment scheduling. Most travel businesses build cron jobs that store tokenised cards and trigger payments on specific dates. Felloh replaces this entire pattern.
Schedule a future payment
// You typically build this yourself:
// 1. Store the Worldpay token after initial payment
// 2. Create a scheduled_payments table in your database
// 3. Run a cron job daily to find due payments
// 4. Submit XML payment requests for each due payment
// 5. Handle failures, retries, and notifications
// Your cron job would submit something like:
const paymentXml = `
<paymentService version="1.4" merchantCode="MERCHANT_CODE">
<submit>
<order orderCode="TRIP-2026-001-BAL">
<amount currencyCode="GBP" exponent="2" value="100000"/>
<paymentDetails>
<TOKEN-SSL tokenScope="shopper">
<paymentTokenID>token-id-from-initial-payment</paymentTokenID>
</TOKEN-SSL>
</paymentDetails>
</order>
</submit>
</paymentService>
`;
Currency mapping
Worldpay uses standard ISO 4217 currency codes with an exponent. Felloh uses minor-unit currency codes where the amount is always in the smallest unit.
| Worldpay | Felloh | Notes |
|---|---|---|
GBP (exponent 2) | GBX | Both use pence — numeric values are the same |
USD (exponent 2) | USX | Both use cents — numeric values are the same |
EUR (exponent 2) | EUX | Both use euro cents — numeric values are the same |
Currency conversion helper
const WORLDPAY_TO_FELLOH_CURRENCY = {
GBP: 'GBX',
USD: 'USX',
EUR: 'EUX',
};
function convertCurrency(worldpayCurrency) {
const fellohCurrency = WORLDPAY_TO_FELLOH_CURRENCY[worldpayCurrency.toUpperCase()];
if (!fellohCurrency) {
throw new Error(`Unsupported currency: ${worldpayCurrency}`);
}
return fellohCurrency;
}
// Amount values stay the same — both use minor units
// Worldpay: <amount currencyCode="GBP" exponent="2" value="150000"/>
// Felloh: { amount: 150000, currency: 'GBX' }
Webhook event mapping
Worldpay uses notification URLs (or the older Merchant Admin-configured callbacks). Felloh uses standard webhooks with HMAC-SHA256 signatures.
| Worldpay notification | Felloh event | Notes |
|---|---|---|
AUTHORISED | — | Felloh handles authorisation internally |
CAPTURED | transaction.completed | Payment has been captured and settled |
REFUSED | transaction.failed | Payment was declined |
REFUNDED | refund.completed | Refund has been processed |
CHARGED_BACK | chargeback.created | Customer disputed the charge |
CANCELLED | — | No direct equivalent — payment links can be deleted via the API |
Migrating a notification handler
Notification handler migration
// Worldpay sends XML notifications
app.post('/notifications/worldpay', express.text({ type: 'text/xml' }), (req, res) => {
// Parse XML notification
const xml = req.body;
// Extract order code and status
// (simplified — real implementation uses an XML parser)
if (xml.includes('<journal journalType="CAPTURED">')) {
handlePaymentSuccess(orderCode);
} else if (xml.includes('<journal journalType="REFUSED">')) {
handlePaymentFailure(orderCode);
} else if (xml.includes('<journal journalType="REFUNDED">')) {
handleRefund(orderCode);
}
res.send('[OK]');
});
Worldpay notifications are XML and typically configured in the Merchant Admin interface. Felloh webhooks are JSON, use HMAC-SHA256 signatures, and are configured via the API or Dashboard.
What you can remove
One of the biggest benefits of migrating from Worldpay to Felloh is the amount of custom code you can delete. Here's what Felloh replaces:
| Custom code you built | Felloh replacement |
|---|---|
| Booking-to-payment mapping (database tables, reconciliation logic) | Felloh bookings link payments automatically |
| Settlement reconciliation (spreadsheets, manual matching of bulk payouts to bookings) | Felloh automatic reconciliation — every payment is matched to its booking via 3-point verification |
| Manual surcharge calculations (spreadsheets, card type identification, compliance checks) | Felloh automatic surcharging — card type detected and surcharge applied in real time |
| Payment scheduling (cron jobs, retry logic, token storage) | Felloh scheduled payments |
| Hosted payment page customisation and redirect handling | Felloh payment links with redirect URLs |
| XML request/response building and parsing | JSON REST API |
| Trust account management and reconciliation | Felloh managed trust accounts |
| Supplier payment processing (bank transfers, batch files) | Felloh disbursements |
| Fraud rule configuration (separate Worldpay product) | Felloh Fraud Shield (included) |
Migration plan
A step-by-step approach to moving from Worldpay to Felloh.
Phase 1 — Set up and validate
- Create a Felloh account and generate sandbox API keys from the Sandbox Registration Form
- Set up authentication — implement token generation and caching
- Create a test booking and payment link to verify your integration works
- Connect the MCP server (optional) — useful for exploring the API interactively during migration
Phase 2 — Migrate customer and booking data
- Audit your current Worldpay integration — identify all payment flows (HPP, direct API, tokenised, batch)
- Create customers in Felloh — Worldpay doesn't have a customer database, so pull customer data from your booking system
- Create bookings for any active reservations
- Map your existing booking references to Felloh bookings using the
booking_referencefield
Phase 3 — Migrate payment flows
- Replace Hosted Payment Page redirects with Felloh payment links
- Replace direct API / CSE integration with Felloh ecommerce sessions and the Felloh SDK
- Replace token-based scheduled payments (cron jobs) with Felloh scheduled payments
- Replace XML refund modifications with Felloh's two-stage refund process
- Replace Worldpay notification handlers with Felloh webhook handlers
- Remove XML building/parsing code — Felloh is JSON throughout
Phase 4 — Test in sandbox
- Run through every payment flow in the Felloh sandbox
- Test edge cases: declined payments, partial refunds, expired tokens
- Verify webhook delivery and handling
- Confirm customer-facing payment pages work correctly
Phase 5 — Go live
- Switch to production API keys
- Run Worldpay and Felloh in parallel for a transition period — new bookings go through Felloh, existing Worldpay payments settle naturally
- Monitor the Felloh Dashboard for transaction status
- Decommission Worldpay integration and remove legacy code
- Cancel Worldpay risk management add-ons (now covered by Fraud Shield)
You don't need to migrate historical transaction data. Worldpay retains your historical records, and Felloh starts fresh with new bookings. Keep your Worldpay merchant admin access for historical reporting.
Common migration questions
Can I run Worldpay and Felloh in parallel? Yes. Route new bookings to Felloh and let existing Worldpay transactions settle naturally. There's no conflict between the two.
Do I need to re-collect card details? Yes, for new payments. Worldpay card tokens are not transferable to Felloh. Customers will enter their card details on their first Felloh payment, and the card is automatically tokenised for future use.
What about PCI compliance? Felloh handles PCI compliance the same way — card details are collected via Felloh's hosted payment pages or SDK, never touching your servers. If you were using Worldpay's direct API with CSE (Client-Side Encryption), the Felloh SDK provides equivalent security.
I use Worldpay's batch file processing. How does that translate? Replace batch files with individual Felloh scheduled payments. Each scheduled payment has a specific execution date and amount — Felloh handles the execution automatically. No batch files, no cron jobs.
What about 3DS (Strong Customer Authentication)? Felloh handles 3DS automatically on payment links and ecommerce sessions. You can configure 3DS rules in Fraud Shield — for example, setting velocity thresholds for when 3DS is triggered.
Can I use the Felloh MCP server during migration? Absolutely. Connect the MCP server to your AI editor and use it to explore the API, create test bookings, and debug your integration interactively.
