Migrating from Stripe

A practical guide for travel businesses migrating from Stripe to Felloh. This covers concept mapping, code migration patterns, and a step-by-step migration plan so you can move with confidence.

Felloh is purpose-built for travel payments. While Stripe is a general-purpose payment platform, Felloh's data model centres around bookings — the natural unit of work for travel businesses. This means some Stripe concepts map directly, some map differently, and some don't apply at all.


Concept mapping

This is the most important section. Understand how Stripe concepts translate to Felloh before writing any code.

Direct equivalents

These concepts map cleanly between the two platforms.

StripeFellohNotes
CustomerCustomerNearly identical — name, email, address. Felloh customers are scoped to an organisation.
RefundRefundSimilar, but Felloh uses a two-stage process — refunds require separate authorisation.
WebhookWebhookSame concept. Event types differ — see the event mapping below.
PaymentLinkPayment LinkSimilar — both generate a hosted payment page URL. Felloh payment links are tied to a booking.

Different concepts

These Stripe concepts exist in Felloh but work differently.

StripeFellohHow it differs
PaymentIntentPayment Link / Ecommerce / Scheduled PaymentStripe has one universal object for collecting payment. Felloh splits this into three tools depending on the scenario — see choosing a payment method.
ChargeTransactionA Felloh Transaction is the result of a completed payment. It's always linked to a Booking.
SubscriptionScheduled PaymentStripe subscriptions are recurring indefinitely. Felloh scheduled payments are one-off future charges — you create one per installment.
SetupIntent + PaymentMethodTokenised CardIn Stripe, you explicitly save a card via SetupIntent. In Felloh, cards are automatically tokenised when a customer pays — you then retrieve tokens with the API to use for future charges.
Connect (platform payouts)Disbursements + BeneficiariesStripe Connect handles marketplace payouts. Felloh disbursements pay suppliers from trust accounts — a different model built for travel supply chains.
Radar (fraud detection)Fraud ShieldStripe Radar uses ML-based fraud scoring. Felloh Fraud Shield provides configurable rule-based fraud prevention — 3DS rules, card rules, customer rules, device fingerprinting, location checks, and velocity limits. Configure via the Felloh Dashboard.
Terminal (in-person)TerminalFelloh supports in-person payments via terminals. Speak to your account manager to get set up.

No Felloh equivalent

These Stripe features don't have a Felloh counterpart because they're outside the travel payment domain.

Stripe featureWhat to do
Product / PriceFelloh doesn't have a product catalog. Your booking system or CRM holds trip/product information. Pass the total as the booking gross_amount.
InvoiceNot needed — Felloh bookings with payment links serve a similar purpose for travel. Use your own invoicing system if required.
Subscription (recurring)Felloh doesn't do recurring billing. Create individual scheduled payments for each installment.
TaxHandle tax in your own booking system.
IdentityUse a separate KYC provider if required.

The booking model

The most important conceptual shift is that every payment in Felloh is tied to a Booking. In Stripe, you can create a PaymentIntent with no context — just an amount and a customer. In Felloh, you always need a booking first.

Stripe flow:
  CustomerPaymentIntentCharge
  (payment exists independently)

Felloh flow:
  CustomerBookingPayment Link / Ecommerce / Scheduled PaymentTransaction
  (payment is always linked to a booking)

This means your migration needs to ensure that every payment has a corresponding booking. For most travel businesses, this is already how you think about payments — Felloh just makes it explicit.

Because every payment is tied to a booking, Felloh provides automatic reconciliation out of the box. Every payment — cards, open banking, and bank transfers — is automatically matched to its booking using 3-point verification, from initiation through to settlement in your bank account. This eliminates the manual spreadsheet work your finance team does today to match Stripe's bulk settlement payouts to individual bookings.

Felloh also provides automatic surcharging — when a customer enters their card details, Felloh detects whether it's a consumer, corporate, or international card and applies the correct compliant surcharge in real time. The customer sees the surcharge before confirming payment and can switch payment method if they prefer. This protects your margins on expensive card types without manual fee calculations or compliance guesswork.


Choosing a payment method

In Stripe, you always create a PaymentIntent. In Felloh, you choose based on the scenario:

ScenarioStripeFelloh
Send customer a link to payPaymentLink or PaymentIntent + Checkoutcreate-payment-link
Embed payment in your appPaymentIntent + Elementscreate-ecommerce + Felloh SDK
Charge a saved card laterPaymentIntent with off_sessioncreate-scheduled-payment
Charge a saved card nowPaymentIntent with confirm: truecreate-scheduled-payment with today's date

Code migration

Authentication

Stripe uses a single secret key. Felloh uses a public/private key pair to generate a bearer token.

Authentication

import Stripe from 'stripe';
const stripe = new Stripe('sk_live_...');

Creating a customer

Create a customer

const customer = await stripe.customers.create({
  name: 'Sarah Jones',
  email: 'sarah@example.com',
  address: {
    line1: '10 Downing Street',
    city: 'London',
    postal_code: 'SW1A 2AA',
    country: 'GB',
  },
});

Creating a booking (new concept)

This has no Stripe equivalent — it's the step you add to your flow.

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 PaymentIntent
const paymentIntent = await stripe.paymentIntents.create({
  amount: 50000,              // £500.00 in pence
  currency: 'gbp',
  customer: customer.id,
  metadata: {
    booking_ref: 'TRIP-2026-001',  // Stored as metadata
  },
});

// Use paymentIntent.client_secret with Stripe Elements on the frontend

Processing a refund

Process a refund

const refund = await stripe.refunds.create({
  payment_intent: 'pi_...',
  amount: 20000,              // £200.00 partial refund
});
// Refund is processed immediately

Scheduling a future payment

Schedule a future payment

// Save the card via SetupIntent
const setupIntent = await stripe.setupIntents.create({
  customer: customer.id,
  payment_method_types: ['card'],
});

// Later, charge off-session
const paymentIntent = await stripe.paymentIntents.create({
  amount: 100000,
  currency: 'gbp',
  customer: customer.id,
  payment_method: 'pm_...',
  off_session: true,
  confirm: true,
});

Currency mapping

Stripe uses standard ISO 4217 currency codes in lowercase. Felloh uses minor-unit currency codes.

StripeFellohUnit
gbpGBXPence
usdUSXCents
eurEUXEuro cents

Both platforms use minor units for amounts (pence/cents), so the numeric values are the same — only the currency code changes.

Currency conversion helper

const STRIPE_TO_FELLOH_CURRENCY = {
  gbp: 'GBX',
  usd: 'USX',
  eur: 'EUX',
};

function convertCurrency(stripeCurrency) {
  const fellohCurrency = STRIPE_TO_FELLOH_CURRENCY[stripeCurrency.toLowerCase()];
  if (!fellohCurrency) {
    throw new Error(`Unsupported currency: ${stripeCurrency}`);
  }
  return fellohCurrency;
}

// Amount values stay the same — both use minor units
// Stripe: { amount: 150000, currency: 'gbp' }
// Felloh: { amount: 150000, currency: 'GBX' }

Webhook event mapping

If you have existing Stripe webhook handlers, map them to Felloh events.

Stripe eventFelloh eventNotes
payment_intent.succeededtransaction.completedPayment was successful
payment_intent.payment_failedtransaction.failedPayment failed
charge.refundedrefund.completedRefund was processed
charge.dispute.createdchargeback.createdCustomer disputed a charge
customer.createdNo equivalentFelloh does not emit customer events
invoice.paidNo equivalentFelloh does not have invoices

Migrating a webhook handler

Webhook handler migration

app.post('/webhooks/stripe', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.headers['stripe-signature'];
  const event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);

  switch (event.type) {
    case 'payment_intent.succeeded':
      handlePaymentSuccess(event.data.object);
      break;
    case 'payment_intent.payment_failed':
      handlePaymentFailure(event.data.object);
      break;
    case 'charge.refunded':
      handleRefund(event.data.object);
      break;
  }

  res.json({ received: true });
});

Migration plan

A step-by-step approach to moving from Stripe to Felloh without disrupting live operations.

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. Export customers from Stripe — use the Stripe API or Dashboard export
  2. Create customers in Felloh — map Stripe customer fields to Felloh fields
  3. Create bookings for any active reservations — this is the new step that doesn't exist in Stripe
  4. Map your existing booking references to Felloh bookings using the booking_reference field

Phase 3 — Migrate payment flows

  1. Replace PaymentIntent creation with the appropriate Felloh payment method:
    • Checkout/PaymentLinks → create-payment-link
    • Elements/embedded → create-ecommerce
    • Off-session/saved cards → create-scheduled-payment
  2. Replace refund logic with Felloh's two-stage process
  3. Update webhook handlers to use Felloh event types
  4. Update your frontend if using Stripe Elements — replace with the Felloh SDK

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 emails and receipts are correct

Phase 5 — Go live

  1. Switch to production API keys
  2. Run Stripe and Felloh in parallel for a transition period if needed — new bookings go through Felloh, existing Stripe subscriptions complete naturally
  3. Monitor the Felloh Dashboard for transaction status
  4. Decommission Stripe integration once all active payments have settled

Common migration questions

Can I run Stripe and Felloh in parallel? Yes. Route new bookings to Felloh and let existing Stripe payment schedules complete. There's no conflict between the two.

Do I need to re-collect card details? Yes, for new payments. Stripe 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 Stripe does — card details are collected via Felloh's hosted payment pages or SDK, never touching your servers.

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.

What if I use Stripe Connect for marketplace payouts? Felloh's equivalent is Disbursements with Beneficiaries. The model is different — designed for paying travel suppliers rather than marketplace sellers — so this part of the migration needs the most planning. Speak to your Felloh account manager for guidance.