Transactionnel
Les e-mails de votre application, enfin gardés
Un reçu qui n’arrive pas, c’est un client qui appelle. Lekalao envoie les e-mails de vos applications par votre fournisseur, et garde chacun au journal.
14 jours d’essai. Rien à payer pour commencer.
Atelier Mboa
Votre reçu nº 20418
Merci, Mireille.
- Bol émaillé ×2
- 18 000
- Livraison
- 2 500
Total20 500 FCFA
Journal
Renvoyer- Accepté par Postmark09:41:07
- Délivré09:41:09
- Ouvert, deux fois09:52:30
recu-commande · fr
Trois façons de brancher
- L’API
- Un POST : des variables, des pièces jointes, la langue, le fournisseur.
- Le transport Laravel
- MAIL_MAILER=lekalao, et votre code ne change pas.
- Le relais SMTP
- Pour ce qui ne parle que SMTP : un jeton d’API sert de mot de passe. Sans TLS aujourd’hui, donc en auto-hébergé ou derrière votre terminateur.
curl -X POST "$LEKALAO_URL/api/v1/transactional-mails/send" \
-H "Authorization: Bearer $LEKALAO_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-2026-00481-confirmation" \
-d '{
"template": "order-confirmation",
"to": ["ada@example.com"],
"locale": "fr",
"variables": {
"customer": { "name": "Ada" },
"order": { "number": "2026-00481", "total": "12 500 FCFA" }
}
}'// config/mail.php
'mailers' => [
'lekalao' => [
'transport' => 'lekalao-api',
'endpoint' => env('LEKALAO_URL'),
'token' => env('LEKALAO_TOKEN'),
],
],
// .env: MAIL_MAILER=lekalao
Mail::to($order->customer)->send(new OrderConfirmed($order));MAIL_MAILER=smtp
MAIL_HOST=$LEKALAO_SMTP_HOST
MAIL_PORT=2525
MAIL_USERNAME=lekalao
# An API token with the "write" ability
MAIL_PASSWORD=$LEKALAO_TOKENLe journal répond à « l’a-t-il reçu ? »
Destinataires, contenu, remise, ouvertures, clics, et un bouton pour renvoyer. Des statistiques par modèle.
Deux flux, deux fournisseurs
Les campagnes par l’un, les factures par l’autre. Une campagne qui attire des plaintes n’abîme jamais le flux qui envoie vos reçus.
Des modèles que le marketing peut relire
HTML, Markdown ou MJML, une version par langue, des destinataires par défaut. L’application envoie les variables ; le texte, lui, se corrige sans déploiement.
Des webhooks qui se prouvent
Inscriptions, départs, tags, rebonds, plaintes : chaque appel est signé en HMAC-SHA256. Le journal garde la réponse reçue, et une adresse qui échoue dix fois de suite est désactivée.
Vérifier un webhook
Route::post('/webhooks/lekalao', function (Request $request) {
$expected = hash_hmac(
'sha256',
$request->getContent(),
config('services.lekalao.webhook_secret'),
);
$received = (string) $request->header('X-Lekalao-Signature');
abort_unless(hash_equals($expected, $received), 401);
// subscriber.unsubscribed, mail.bounced, campaign.sent…
return response()->noContent();
});Tout ce que fait l’interface, votre code le fait aussi
La même clé n’écrit jamais deux fois : une Idempotency-Key rend la première réponse pendant 24 heures. Les limites se comptent par jeton, pas par adresse. Mille abonnés passent en un appel, avec un compte rendu par ligne.
Un test refuse toute route sans description, et toute description sans route.
Pas de SDK, et c’est voulu
Cinq paquets à maintenir pendant que l’API bouge coûteraient plus qu’ils ne rapportent. La spécification OpenAPI est juste ; votre générateur fait le reste. Pour Laravel, le transport est prêt.
Comment c’est fait
Laravel, PostgreSQL, Redis. Plus de 500 tests automatisés, dont un qui ouvre chaque page avec des données. Ce site s’inscrit à sa propre liste par le formulaire du produit.
Quatorze jours pour juger par vous-même
Créez le compte, branchez votre fournisseur, envoyez votre première campagne. Rien à payer pour commencer.