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

WorldpayFellohNotes
Shopper (customer record)CustomerFelloh customers have name, email, and address — scoped to an organisation.
Refund (modification request)RefundFelloh uses a two-stage process — refunds require separate authorisation.
Notification (webhook)WebhookSame concept, different event names and payload format. Felloh uses HMAC-SHA256 signatures.

Different concepts

WorldpayFellohHow it differs
Order (payment request)Payment Link / Ecommerce / Scheduled PaymentWorldpay Orders are a single payment request. Felloh splits payment collection into three tools — see choosing a payment method.
Payment / SettlementTransactionA Felloh Transaction represents a completed payment. It's always linked to a Booking.
Token (stored card)Tokenised CardIn Worldpay, you explicitly create a token via the tokenisation API. In Felloh, cards are automatically tokenised when a customer pays.
Hosted Payment PagePayment LinkWorldpay's HPP requires configuration in the merchant admin. Felloh payment links are created via a single API call.
Batch processingScheduled PaymentReplace batch files with individual scheduled payments, each with a specific execution date.
Risk management (separate product)Fraud ShieldFelloh includes configurable fraud rules — 3DS, card, customer, device, location, and velocity checks — in every account. Configure via the Dashboard.
Terminal / POSTerminalFelloh 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 featureWhat it does
BookingA 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.
DisbursementsPay suppliers directly from trust accounts. Replaces manual bank transfers or custom disbursement code.
BeneficiariesManage supplier bank details for disbursements.
Credit NotesTrack credits and adjustments against bookings.
MCP ServerConnect AI agents and editors to Felloh for conversational payment management.
Trust accountsFelloh manages ATOL/ABTA-compliant trust accounts. No separate trust account provider needed.
Automatic reconciliationEvery payment — cards, open banking, and bank transfers — is automatically matched to its booking using 3-point verification. Eliminates manual spreadsheet reconciliation.
Automatic surchargingDetects 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 CodePayment RequestSettlement
  (you maintain the link to your booking system)

Felloh flow:
  CustomerBookingPayment Link / Ecommerce / Scheduled PaymentTransaction
  (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.


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:

ScenarioWorldpayFelloh
Send customer a link to payHosted Payment Pagecreate-payment-link
Embed payment in your appDirect API / CSEcreate-ecommerce + Felloh SDK
Charge a saved card laterToken + scheduled batch / croncreate-scheduled-payment
Charge a saved card nowToken + direct authorisationcreate-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' },
});

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>

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.

WorldpayFellohNotes
GBP (exponent 2)GBXBoth use pence — numeric values are the same
USD (exponent 2)USXBoth use cents — numeric values are the same
EUR (exponent 2)EUXBoth 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 notificationFelloh eventNotes
AUTHORISEDFelloh handles authorisation internally
CAPTUREDtransaction.completedPayment has been captured and settled
REFUSEDtransaction.failedPayment was declined
REFUNDEDrefund.completedRefund has been processed
CHARGED_BACKchargeback.createdCustomer disputed the charge
CANCELLEDNo 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]');
});

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 builtFelloh 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 handlingFelloh payment links with redirect URLs
XML request/response building and parsingJSON REST API
Trust account management and reconciliationFelloh 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

  1. Create a Felloh account and generate sandbox API keys from the Sandbox Registration Form
  2. Set up authentication — implement token generation and caching
  3. Create a test booking and payment link to verify your integration works
  4. Connect the MCP server (optional) — useful for exploring the API interactively during migration

Phase 2 — Migrate customer and booking data

  1. Audit your current Worldpay integration — identify all payment flows (HPP, direct API, tokenised, batch)
  2. Create customers in Felloh — Worldpay doesn't have a customer database, so pull customer data from your booking system
  3. Create bookings for any active reservations
  4. Map your existing booking references to Felloh bookings using the booking_reference field

Phase 3 — Migrate payment flows

  1. Replace Hosted Payment Page redirects with Felloh payment links
  2. Replace direct API / CSE integration with Felloh ecommerce sessions and the Felloh SDK
  3. Replace token-based scheduled payments (cron jobs) with Felloh scheduled payments
  4. Replace XML refund modifications with Felloh's two-stage refund process
  5. Replace Worldpay notification handlers with Felloh webhook handlers
  6. Remove XML building/parsing code — Felloh is JSON throughout

Phase 4 — Test in sandbox

  1. Run through every payment flow in the Felloh sandbox
  2. Test edge cases: declined payments, partial refunds, expired tokens
  3. Verify webhook delivery and handling
  4. Confirm customer-facing payment pages work correctly

Phase 5 — Go live

  1. Switch to production API keys
  2. Run Worldpay and Felloh in parallel for a transition period — new bookings go through Felloh, existing Worldpay payments settle naturally
  3. Monitor the Felloh Dashboard for transaction status
  4. Decommission Worldpay integration and remove legacy code
  5. Cancel Worldpay risk management add-ons (now covered by Fraud Shield)

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.