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:
| Option | Country | Setup cost | Annual | Notes |
|---|---|---|---|---|
| Stripe Atlas | Delaware US | $500 | $100/y + tax | Fastest |
| France LLC | France | €1,500 | €300-800/y | EU, FR language |
| CI Company | Ivory Coast | ~600K XOF | ~200K/y | Stripe via Paystack CI |
| UK LTD | UK | £200 | £100-400/y | Outside EU since Brexit |
| Estonia LLC | Estonia | €300 | €200/y + tax | E-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 | % | Fixed | Total on €100 |
|---|---|---|---|
| Stripe (EU cards) | 1.4% | €0.25 | €1.65 |
| Stripe (non-EU cards) | 2.9% | €0.25 | €3.15 |
| PayPal | 2.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.
| Phase | Setup | SCA failure | Fees |
|---|---|---|---|
| Month 1 (bad impl) | Stripe Charges legacy | 16% | €14,200/mo fees |
| Month 4 (PaymentIntents + Radar redo) | PaymentIntents + automatic | 3.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.
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.

