Alma
Alma : solution BNPL française leader avec paiements 2x, 3x, 4x sans frais. Integration simple e-commerce et conversion +15% average.
📚 Ressources Complémentaires
📖 Guides Pratiques
⚖️ Comparatifs
Alma : BNPL Français Champion Conversion
Qu’est-ce qu’Alma ?
Alma est le leader français Buy Now Pay Later utilisé par 15k+ marchands dont Decathlon, Nature & Découvertes, Darty. Cette fintech parisienne révolutionne l’achat en ligne avec paiements fractionnés 2x/3x/4x, risk management propriétaire et integration plug-and-play qui boost conversion +15% average.
🚀 Fonctionnalités Principales
Plans Paiement Flexibles
- 2x sans frais : paiement immédiat + 30 jours
- 3x sans frais : mensualités étalées 3 mois
- 4x sans frais : quarterly payments option
- D+15/D+30 : différé simple sans fractionnement
Integration E-commerce
- Plug-ins natifs : Shopify, WooCommerce, Magento, Prestashop
- APIs RESTful : developer-friendly integration
- Payment buttons : customizable checkout widgets
- Mobile SDK : in-app payments native
Risk Management
- Scoring propriétaire : IA credit assessment
- Instant approval : décision real-time <2 secondes
- Risk assumé : merchant payment guaranteed
- Fraud protection : advanced detection algorithms
Customer Experience
- Zero paperwork : signup instant digital
- Mobile-first : smartphone optimization
- Dashboard client : payment tracking interface
- Notifications : SMS/email reminders automatic
💰 Prix et Structure
Commission Merchant
- 2x sans frais : 2,9% du montant transaction
- 3x sans frais : 3,9% commission progressive
- 4x sans frais : 4,9% premium financing option
- Différé D+30 : 2,4% simple delay payment
Minimum Requirements
- Panier minimum : 50€ pour paiements 4x
- Transaction maximum : 3000€ per purchase
- Setup costs : gratuit integration
- Monthly fees : aucun frais fixe
Revenue Share Model
- Risk transfer : Alma assume payment risk
- Guaranteed payment : merchant paid immediately
- Collection handling : Alma manages customer
- Default protection : merchant protected losses
⭐ Points Forts
🇫🇷 Leader France BNPL
Market dominance français :
- 15k+ marchands integration active
- 2M+ utilisateurs registered regular
- Brand awareness 85% French consumers
- Trust factor highest BNPL France
⚡ Conversion Booster
Sales optimization :
- +15% conversion rate average improvement
- +25% panier moyen increase typical
- Abandon cart recovery 30% reduction
- Customer acquisition cost lowered
🛡️ Risk Management Excellence
Merchant protection :
- Payment guaranteed 100% eligible transactions
- Fraud detection ML-powered sophisticated
- Instant approval 95%+ transactions
- Chargeback protection complete
📱 User Experience Optimized
Frictionless journey :
- 3-step checkout process simple
- Mobile-first design responsive
- Real-time notifications engagement
- Customer support French-speaking
⚠️ Points Faibles
💰 Commission Structure
Merchant costs élevés :
- 2,9-4,9% commission vs traditional 1-3%
- No volume discounts SME
- Success fee model expensive
- Margins impact significant
🌍 Geographic Limitations
French focus mainly :
- Limited international expansion
- European rollout gradual
- Local regulations dependency
- Currency EUR primarily
📊 Transaction Limits
Purchase restrictions :
- 50€ minimum 4x payments
- 3000€ maximum per transaction
- Sector exclusions travel/luxury
- Age restrictions 18+ required
🔧 Integration Dependencies
Technical requirements :
- Plugin maintenance regular updates
- API versioning compatibility
- Custom integration development time
- Testing environment setup
🎯 Pour Qui ?
✅ Parfait Pour
- E-commerces français audience domestique priority
- Fashion & lifestyle brands targeting millennials
- Home & garden retailers high-ticket items
- Electronics merchants expensive products
- SME retailers conversion improvement needed
❌ Moins Adapté Pour
- International businesses multi-country focus
- Low-margin products <10% profit margin
- B2B merchants business sales primarily
- Luxury goods >3000€ typical transactions
- Service businesses non-physical products
📊 Alma vs BNPL Competitors France
| Critère | Alma | Klarna | Oney |
|---|---|---|---|
| France Market Share | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| Integration Ease | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Commission Rates | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| Risk Management | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Customer Support | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
🛠️ Configuration & Intégration
JavaScript Integration
// Alma JavaScript integration
class AlmaPaymentService {
constructor(merchantId, environment = 'test') {
this.merchantId = merchantId;
this.apiUrl = environment === 'live'
? 'https://api.getalma.eu'
: 'https://api.sandbox.getalma.eu';
this.widgetUrl = environment === 'live'
? 'https://cdn.getalma.eu/widget.js'
: 'https://cdn.sandbox.getalma.eu/widget.js';
this.loadWidget();
}
loadWidget() {
if (!document.getElementById('alma-widget-script')) {
const script = document.createElement('script');
script.id = 'alma-widget-script';
script.src = this.widgetUrl;
script.async = true;
document.head.appendChild(script);
}
}
async getEligiblePlans(amount, currency = 'EUR') {
try {
const response = await fetch(`${this.apiUrl}/v1/payments/eligibility`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
merchant_id: this.merchantId,
purchase_amount: Math.round(amount * 100), // Convert to cents
currency: currency,
locale: 'fr_FR'
})
});
const data = await response.json();
return data.eligibility.map(plan => ({
installments_count: plan.installments_count,
deferred_days: plan.deferred_days,
deferred_months: plan.deferred_months,
customer_total_cost_amount: plan.customer_total_cost_amount,
customer_fee_amount: plan.customer_fee_amount,
monthly_amount: plan.monthly_amount
}));
} catch (error) {
console.error('Alma eligibility check failed:', error);
throw new Error('Unable to get payment plans');
}
}
showPaymentWidget(containerId, options = {}) {
const config = {
merchant_id: this.merchantId,
amount: Math.round(options.amount * 100),
currency: options.currency || 'EUR',
locale: options.locale || 'fr_FR',
customer: {
email: options.customerEmail,
first_name: options.customerFirstName,
last_name: options.customerLastName,
phone: options.customerPhone
},
billing_address: options.billingAddress,
shipping_address: options.shippingAddress,
custom_data: options.customData || {},
return_url: options.returnUrl || `${window.location.origin}/payment/success`,
failure_return_url: options.failureUrl || `${window.location.origin}/payment/failed`,
ipn_callback_url: options.webhookUrl,
onPaymentCreated: this.handlePaymentCreated.bind(this),
onPaymentCompleted: this.handlePaymentCompleted.bind(this),
onPaymentFailed: this.handlePaymentFailed.bind(this)
};
if (window.Alma) {
window.Alma.createWidget(containerId, config);
} else {
console.error('Alma widget not loaded');
}
}
showEligibilityWidget(containerId, amount, options = {}) {
const config = {
merchant_id: this.merchantId,
amount: Math.round(amount * 100),
locale: options.locale || 'fr_FR',
container: containerId,
theme: options.theme || 'default',
show_if_not_eligible: options.showIfNotEligible !== false
};
if (window.Alma) {
window.Alma.createEligibilityWidget(config);
}
}
handlePaymentCreated(payment) {
console.log('Alma payment created:', payment.id);
// Store payment ID for tracking
localStorage.setItem('alma_payment_id', payment.id);
// Optional: Send to analytics
if (typeof gtag !== 'undefined') {
gtag('event', 'alma_payment_created', {
payment_id: payment.id,
amount: payment.amount / 100,
installments: payment.installments_count
});
}
}
handlePaymentCompleted(payment) {
console.log('Alma payment completed:', payment.id);
// Clear stored payment ID
localStorage.removeItem('alma_payment_id');
// Redirect to success page
window.location.href = payment.return_url || '/payment/success';
}
handlePaymentFailed(payment, error) {
console.error('Alma payment failed:', payment.id, error);
// Show error message
this.showError('Le paiement a échoué. Veuillez réessayer.');
// Optional: Send to analytics
if (typeof gtag !== 'undefined') {
gtag('event', 'alma_payment_failed', {
payment_id: payment.id,
error_code: error.code
});
}
}
showError(message) {
const errorDiv = document.createElement('div');
errorDiv.className = 'alma-error';
errorDiv.style.cssText = `
background: #fee;
color: #c33;
padding: 15px;
border: 1px solid #fcc;
border-radius: 4px;
margin: 15px 0;
`;
errorDiv.textContent = message;
const container = document.querySelector('#alma-payment-container');
if (container) {
container.prepend(errorDiv);
setTimeout(() => errorDiv.remove(), 5000);
}
}
}
// Usage example
const almaService = new AlmaPaymentService('merchant_12345', 'test');
// Show payment options on product page
async function showAlmaOptions() {
const productPrice = 299.99;
try {
const plans = await almaService.getEligiblePlans(productPrice);
if (plans.length > 0) {
almaService.showEligibilityWidget('#alma-eligibility', productPrice, {
theme: 'clean',
locale: 'fr_FR'
});
}
} catch (error) {
console.error('Failed to load Alma options:', error);
}
}
// Initialize payment on checkout page
function initializeAlmaCheckout(orderData) {
almaService.showPaymentWidget('#alma-payment-container', {
amount: orderData.total,
customerEmail: orderData.customer.email,
customerFirstName: orderData.customer.firstName,
customerLastName: orderData.customer.lastName,
customerPhone: orderData.customer.phone,
billingAddress: orderData.billingAddress,
shippingAddress: orderData.shippingAddress,
customData: {
order_id: orderData.id,
cart_items: orderData.items
},
returnUrl: '/payment/alma/success',
failureUrl: '/payment/alma/failed',
webhookUrl: '/webhooks/alma'
});
}
Server-side Integration (PHP)
<?php
// Alma server-side integration
class AlmaPaymentService
{
private $apiKey;
private $apiUrl;
public function __construct($apiKey, $environment = 'test')
{
$this->apiKey = $apiKey;
$this->apiUrl = $environment === 'live'
? 'https://api.getalma.eu'
: 'https://api.sandbox.getalma.eu';
}
public function createPayment($paymentData)
{
$data = [
'purchase_amount' => $paymentData['amount'] * 100, // Convert to cents
'currency' => $paymentData['currency'] ?? 'EUR',
'installments_count' => $paymentData['installments_count'] ?? 3,
'locale' => $paymentData['locale'] ?? 'fr_FR',
'customer' => [
'email' => $paymentData['customer']['email'],
'first_name' => $paymentData['customer']['first_name'],
'last_name' => $paymentData['customer']['last_name'],
'phone' => $paymentData['customer']['phone'] ?? null
],
'billing_address' => $paymentData['billing_address'],
'shipping_address' => $paymentData['shipping_address'] ?? null,
'merchant_reference' => $paymentData['merchant_reference'],
'return_url' => $paymentData['return_url'],
'failure_return_url' => $paymentData['failure_return_url'],
'ipn_callback_url' => $paymentData['webhook_url'],
'custom_data' => $paymentData['custom_data'] ?? []
];
return $this->makeApiRequest('POST', '/v1/payments', $data);
}
public function getPaymentStatus($paymentId)
{
return $this->makeApiRequest('GET', "/v1/payments/{$paymentId}");
}
public function refundPayment($paymentId, $amount = null)
{
$data = [];
if ($amount !== null) {
$data['amount'] = $amount * 100; // Convert to cents
}
return $this->makeApiRequest('POST', "/v1/payments/{$paymentId}/refunds", $data);
}
public function handleWebhook($rawPayload, $signature)
{
if (!$this->verifyWebhookSignature($rawPayload, $signature)) {
throw new Exception('Invalid webhook signature');
}
$payload = json_decode($rawPayload, true);
switch ($payload['type']) {
case 'payment.created':
$this->handlePaymentCreated($payload['data']);
break;
case 'payment.completed':
$this->handlePaymentCompleted($payload['data']);
break;
case 'payment.failed':
$this->handlePaymentFailed($payload['data']);
break;
case 'payment.refunded':
$this->handlePaymentRefunded($payload['data']);
break;
default:
error_log("Unhandled Alma webhook event: " . $payload['type']);
}
return true;
}
private function handlePaymentCreated($payment)
{
// Payment has been created but not yet completed
error_log("Alma payment created: " . $payment['id']);
// Update order status to pending
// $this->updateOrderStatus($payment['merchant_reference'], 'pending');
}
private function handlePaymentCompleted($payment)
{
// Payment has been completed successfully
error_log("Alma payment completed: " . $payment['id']);
// Update order status to completed
// Trigger fulfillment
// Send confirmation email
// $this->updateOrderStatus($payment['merchant_reference'], 'completed');
}
private function handlePaymentFailed($payment)
{
// Payment has failed
error_log("Alma payment failed: " . $payment['id']);
// Update order status to failed
// Send failure notification
// $this->updateOrderStatus($payment['merchant_reference'], 'failed');
}
private function handlePaymentRefunded($payment)
{
// Payment has been refunded
error_log("Alma payment refunded: " . $payment['id']);
// Update order status to refunded
// Process refund logic
// $this->updateOrderStatus($payment['merchant_reference'], 'refunded');
}
private function verifyWebhookSignature($payload, $signature)
{
$expectedSignature = base64_encode(hash_hmac('sha256', $payload, $this->apiKey, true));
return hash_equals($expectedSignature, $signature);
}
private function makeApiRequest($method, $endpoint, $data = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->apiUrl . $endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json',
'User-Agent: Alma-PHP-SDK/1.0'
]);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 400) {
throw new Exception("API request failed with status $httpCode: $response");
}
return json_decode($response, true);
}
}
// Usage example
$almaService = new AlmaPaymentService($_ENV['ALMA_API_KEY'], 'test');
// Handle webhook
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['REQUEST_URI'] === '/webhooks/alma') {
try {
$rawPayload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_ALMA_SIGNATURE'] ?? '';
$almaService->handleWebhook($rawPayload, $signature);
http_response_code(200);
echo 'OK';
} catch (Exception $e) {
http_response_code(400);
echo 'Error: ' . $e->getMessage();
}
}
?>
🏆 Notre Verdict
Alma excellent choix e-commerces français cherchant boost conversion avec BNPL leader market. Commission élevée justified par risk transfer et sales improvement substantial.
Note Globale : 4.2/5 ⭐⭐⭐⭐⭐
- France Market Fit : 5/5
- Integration Ease : 5/5
- Conversion Impact : 5/5
- Pricing Value : 3/5
- International Scope : 2/5
🎯 Cas d’Usage Réels
💡 Exemple : Fashion E-commerce
Conversion optimization :
- Target millennials : 25-35 ans primary audience
- Average basket : €150 perfect Alma sweet spot
- Seasonal sales : Black Friday conversion +35%
- Mobile checkout : 70% transactions smartphone
💡 Exemple : Home & Garden Retailer
Higher ticket items :
- Garden furniture : €500-1500 price range
- 4x payments : affordability perception improved
- Impulse purchases : decision facilitated
- Return customers : repeat usage 40% rate
💡 Conseil OSCLOAD : Alma must-have e-commerces français targeting consumers français. ROI positive typically 3-6 mois. Test sur categories high-value first. Complément Stripe/PayPal traditional.