Migrating from Adyen
A practical guide for travel businesses migrating from Adyen to Felloh. This covers concept mapping, code migration patterns, and a step-by-step migration plan so you can move with confidence.
Adyen is a powerful payment platform used by large enterprises, but its complexity and general-purpose design mean travel businesses spend significant effort building travel-specific workflows on top of it. Felloh replaces the gateway and adds the travel layer — bookings, trust accounts, installment scheduling, and supplier disbursements — so you can focus on your product instead of payment infrastructure.
Concept mapping
Understand how Adyen concepts translate to Felloh before writing any code.
Direct equivalents
| Adyen | Felloh | Notes |
|---|---|---|
| Shopper | Customer | Felloh customers have name, email, and address — scoped to an organisation. |
| Refund (modification) | Refund | Felloh uses a two-stage process — refunds require separate authorisation. |
| Webhook / Notification | Webhook | Same concept. Adyen uses HMAC-SHA256 on specific fields; Felloh signs the full request body. |
| Pay by Link | Payment Link | Both generate hosted payment page URLs. Felloh payment links are tied to a booking. |
Different concepts
| Adyen | Felloh | How it differs |
|---|---|---|
Payment session / /payments | Payment Link / Ecommerce / Scheduled Payment | Adyen's /payments endpoint handles all payment scenarios. Felloh splits collection into three tools — see choosing a payment method. |
| Authorisation + Capture | Transaction | Adyen separates authorisation and capture. Felloh transactions represent completed payments — capture is handled automatically. |
Recurring / Tokenisation (storedPaymentMethod) | Tokenised Card | In Adyen, you store a recurringDetailReference or storedPaymentMethodId. In Felloh, cards are automatically tokenised when a customer pays. |
| Drop-in / Components | Ecommerce + Felloh SDK | Adyen's Drop-in and Components provide embedded payment UIs. Felloh's ecommerce sessions serve the same purpose with the Felloh SDK. |
| Platforms / Marketplace (for Platforms) | Disbursements + Beneficiaries | Adyen for Platforms handles marketplace splits and payouts. Felloh disbursements pay travel suppliers from trust accounts — a different model built for travel supply chains. |
| RevenueProtect (risk management) | Fraud Shield | Adyen RevenueProtect provides risk scoring and rules. Felloh Fraud Shield provides configurable rule-based fraud prevention — 3DS, card, customer, device, location, and velocity checks. Configure via the Dashboard. |
| Terminal / POS (Adyen Terminal API) | Terminal | Felloh supports in-person payments via terminals. Speak to your account manager to get set up. |
Felloh concepts with no Adyen 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 Adyen. |
| Scheduled Payment | Charge a tokenised card on a specific future date. Replaces custom scheduling code and cron jobs. |
| Disbursements | Pay suppliers directly from trust accounts. Replaces manual bank transfers or custom payout 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. |
No Felloh equivalent
These Adyen features don't have a Felloh counterpart.
| Adyen feature | What to do |
|---|---|
Product / Line items | Felloh doesn't have a product catalog. Your booking system holds trip details. Pass the total as the booking gross_amount. |
| Multi-currency conversion (DCC) | Handle currency conversion in your own system. Felloh supports GBX, USX, and EUX. |
| Gift cards | Use a separate gift card provider if required. |
| Klarna / AfterPay (BNPL) | Felloh's scheduled payments cover installment plans. For third-party BNPL, use a separate provider. |
The booking model
The biggest conceptual shift is that every payment in Felloh is tied to a Booking. In Adyen, you submit a payment with a merchantReference — the gateway has no concept of what the payment is for. In Felloh, you create a booking first, then collect payments against it.
Adyen flow:
Shopper → /payments (merchantReference) → Authorisation → Capture
(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 Adyen payment references to your booking system. Felloh handles this relationship natively.
If you currently use Adyen's merchantReference or metadata 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 linked automatically.
Choosing a payment method
In Adyen, you call the /payments or /sessions endpoint for most scenarios. In Felloh, you choose based on the scenario:
| Scenario | Adyen | Felloh |
|---|---|---|
| Send customer a link to pay | Pay by Link / /paymentLinks | create-payment-link |
| Embed payment in your app | Drop-in / Components + /sessions | create-ecommerce + Felloh SDK |
| Charge a saved card later | /payments with storedPaymentMethodId | create-scheduled-payment |
| Charge a saved card now | /payments with shopperInteraction: ContAuth | create-scheduled-payment with today's date |
Code migration
Authentication
Adyen uses an API key passed as a header. Felloh uses a public/private key pair to generate a bearer token.
Authentication
import { Client, CheckoutAPI } from '@adyen/api-library';
const client = new Client({
apiKey: 'AQEjhmfuXNWTK...',
environment: 'LIVE',
liveEndpointUrlPrefix: 'your-prefix',
});
const checkout = new CheckoutAPI(client);
Felloh tokens are valid for a limited time. Cache and refresh them as needed. See the Authentication guide for full details.
Creating a customer
Adyen doesn't have a dedicated customer creation API — shopper details are passed with each payment. Felloh has a dedicated customer resource.
Create a customer
// Adyen — shopper details are embedded in the payment request
const paymentRequest = {
merchantAccount: 'YOUR_MERCHANT_ACCOUNT',
amount: { value: 50000, currency: 'GBP' },
reference: 'TRIP-2026-001',
shopperEmail: 'sarah@example.com',
shopperName: {
firstName: 'Sarah',
lastName: 'Jones',
},
billingAddress: {
street: '10 Downing Street',
city: 'London',
postalCode: 'SW1A 2AA',
country: 'GB',
},
// ... payment method details ...
};
Creating a booking (new concept)
This has no Adyen 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
// Create a payment session for Drop-in / Components
const session = await checkout.PaymentsApi.sessions({
merchantAccount: 'YOUR_MERCHANT_ACCOUNT',
amount: { value: 50000, currency: 'GBP' },
reference: 'TRIP-2026-001-DEP',
returnUrl: 'https://example.com/checkout/result',
shopperEmail: 'sarah@example.com',
shopperReference: 'SHOPPER-001',
metadata: {
bookingRef: 'TRIP-2026-001', // Stored as metadata
},
});
// Use session.id and session.sessionData with Adyen Drop-in on frontend
Processing a refund
Process a refund
// Adyen refunds are asynchronous — you submit a modification
// and receive the result via webhook
const refund = await checkout.ModificationsApi.refundCapturedPayment(
pspReference,
{
merchantAccount: 'YOUR_MERCHANT_ACCOUNT',
amount: { value: 20000, currency: 'GBP' },
reference: 'REFUND-001',
}
);
// Result comes asynchronously via REFUND notification
Both Adyen and Felloh process refunds asynchronously. The difference is that Felloh adds an explicit authorisation step — this prevents accidental refunds and supports compliance workflows. If you want to auto-authorise, call both endpoints sequentially.
Scheduling a future payment
Adyen supports tokenised recurring payments, but you schedule the timing yourself. Felloh handles scheduling natively.
Schedule a future payment
// Save the card on first payment
const initialPayment = await checkout.PaymentsApi.payments({
merchantAccount: 'YOUR_MERCHANT_ACCOUNT',
amount: { value: 50000, currency: 'GBP' },
reference: 'TRIP-2026-001-DEP',
shopperReference: 'SHOPPER-001',
shopperInteraction: 'Ecommerce',
recurringProcessingModel: 'CardOnFile',
storePaymentMethod: true,
// ... payment method details ...
});
// Later, charge the saved card (you schedule this via your own cron)
const recurringPayment = await checkout.PaymentsApi.payments({
merchantAccount: 'YOUR_MERCHANT_ACCOUNT',
amount: { value: 100000, currency: 'GBP' },
reference: 'TRIP-2026-001-BAL',
shopperReference: 'SHOPPER-001',
shopperInteraction: 'ContAuth',
recurringProcessingModel: 'CardOnFile',
paymentMethod: {
storedPaymentMethodId: 'stored-payment-method-id',
},
});
Currency mapping
Adyen uses standard ISO 4217 currency codes with amounts in minor units. Felloh uses minor-unit currency codes. The numeric values are the same — only the code changes.
| Adyen | Felloh | Unit |
|---|---|---|
GBP | GBX | Pence |
USD | USX | Cents |
EUR | EUX | Euro cents |
Currency conversion helper
const ADYEN_TO_FELLOH_CURRENCY = {
GBP: 'GBX',
USD: 'USX',
EUR: 'EUX',
};
function convertCurrency(adyenCurrency) {
const fellohCurrency = ADYEN_TO_FELLOH_CURRENCY[adyenCurrency.toUpperCase()];
if (!fellohCurrency) {
throw new Error(`Unsupported currency: ${adyenCurrency}`);
}
return fellohCurrency;
}
// Amount values stay the same — both use minor units
// Adyen: { value: 150000, currency: 'GBP' }
// Felloh: { amount: 150000, currency: 'GBX' }
Webhook event mapping
Adyen uses webhook notifications with HMAC-SHA256 signatures. Felloh uses the same signing approach but with different event types and payload structures.
Adyen notification (eventCode) | Felloh event | Notes |
|---|---|---|
AUTHORISATION (success: true) | — | Felloh handles authorisation internally |
CAPTURE | transaction.completed | Payment has been captured |
AUTHORISATION (success: false) | transaction.failed | Payment was declined |
REFUND | refund.completed | Refund has been processed |
CHARGEBACK | chargeback.created | Customer disputed the charge |
CANCELLATION | — | No direct equivalent — payment links can be deleted via the API |
RECURRING_CONTRACT | — | Felloh tokenises automatically — no separate event |
Migrating a notification handler
Notification handler migration
import { hmacValidator } from '@adyen/api-library';
app.post('/webhooks/adyen', express.json(), (req, res) => {
const validator = new hmacValidator();
const notifications = req.body.notificationItems;
for (const item of notifications) {
const notification = item.NotificationRequestItem;
// Validate HMAC signature
if (!validator.validateHMAC(notification, hmacKey)) {
continue;
}
switch (notification.eventCode) {
case 'AUTHORISATION':
if (notification.success === 'true') {
handlePaymentSuccess(notification);
} else {
handlePaymentFailure(notification);
}
break;
case 'REFUND':
handleRefund(notification);
break;
case 'CHARGEBACK':
handleChargeback(notification);
break;
}
}
res.send('[accepted]');
});
Adyen sends notifications in batches as an array of notificationItems. Felloh sends individual webhook events — one HTTP request per event. This simplifies your handler code.
What you can remove
Migrating from Adyen to Felloh lets you remove significant custom code.
| Custom code you built | Felloh replacement |
|---|---|
| Booking-to-payment mapping (merchantReference tracking, reconciliation) | Felloh bookings link payments automatically |
| Settlement reconciliation (Customer Area reports, manual matching of batches 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, recurring payment triggers, retry logic) | Felloh scheduled payments |
| Shopper reference management and token storage | Felloh automatic card tokenisation |
| Drop-in / Components frontend integration | Felloh SDK or payment links (no frontend needed) |
| Capture logic (manual or delayed capture handling) | Felloh handles capture automatically |
| Trust account management and reconciliation | Felloh managed trust accounts |
| Supplier payment processing | Felloh disbursements |
| RevenueProtect configuration | Felloh Fraud Shield (included) |
| Notification batch processing and deduplication | Felloh single-event webhooks |
Migration plan
A step-by-step approach to moving from Adyen 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 Adyen integration — identify all payment flows (sessions, Drop-in, direct API, recurring, Pay by Link)
- Create customers in Felloh — Adyen 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 Adyen sessions / Drop-in with Felloh payment links or ecommerce sessions
- Replace Pay by Link with Felloh payment links
- Replace recurring / ContAuth payments with Felloh scheduled payments
- Replace refund modifications with Felloh's two-stage refund process
- Replace Adyen notification handlers with Felloh webhook handlers
- Remove capture logic — Felloh handles capture automatically
- Remove shopper reference management — Felloh tokenises cards automatically
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 Adyen and Felloh in parallel for a transition period — new bookings go through Felloh, existing Adyen recurring payments settle naturally
- Monitor the Felloh Dashboard for transaction status
- Decommission Adyen integration and remove legacy code
- Cancel Adyen RevenueProtect add-on (now covered by Fraud Shield)
You don't need to migrate historical transaction data. Adyen retains your historical records via the Customer Area. Felloh starts fresh with new bookings.
Common migration questions
Can I run Adyen and Felloh in parallel? Yes. Route new bookings to Felloh and let existing Adyen recurring payments complete. There's no conflict between the two.
Do I need to re-collect card details? Yes, for new payments. Adyen stored payment methods 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 Adyen's Drop-in or Components, the Felloh SDK provides equivalent security.
I use Adyen's manual capture flow. How does that translate? Felloh handles capture automatically. There's no separate capture step — when a customer completes a payment, it's captured immediately. This simplifies your code and removes the risk of forgetting to capture authorised payments.
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 challenges are triggered.
I use Adyen for Platforms. What's the Felloh equivalent? Felloh's equivalent is Disbursements with Beneficiaries. The model is designed for paying travel suppliers from trust accounts rather than marketplace-style splits. Speak to your Felloh account manager for guidance on migrating platform payouts.
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.
