Email · SMS · WhatsApp — sans serveur à maintenir

Envoyez et recevez vos messages depuis votre front-end.

Flowli-Email compile vos templates, vérifie l'origine de la requête et relaie l'envoi vers votre SMTP, Resend, SendGrid ou Twilio. Les réponses entrantes reviennent dans vos conversations et alimentent votre carnet de contacts.

SDK client léger

Une balise <script> ou un import npm. init(), send(), sendForm() — email, SMS et WhatsApp.

Multicanal Twilio

SMTP, Resend, SendGrid pour l'email ; Twilio pour les SMS et WhatsApp, avec numéros E.164 validés.

Réponses entrantes

Webhooks Twilio idempotents, fil de conversation, réponse en un clic et règles d'auto-réponse.

Carnet de contacts

Contacts créés automatiquement, import CSV, tags, blocage, fusion de doublons et journal d'audit.

File avec retry/backoff

Les envois transitoirement en échec sont rejoués automatiquement, sans perdre de requête.

Credentials chiffrés

Identifiants Twilio et providers chiffrés au repos (AES-256-GCM) et testables depuis le dashboard.

Sécurité par domaine

Whitelist CORS, clés publiques révocables, clés secrètes pour vos appels serveur.

Rate limiting & logs

Quota horaire par compte, statut du provider, origine, IP et latence pour chaque envoi.

Templates dynamiques

Syntaxe {{ variable }}, conditions et boucles, prévisualisation et compteur de segments SMS.

Trois lignes pour votre premier message

Créez un service d'envoi, écrivez un template avec des variables{{ variable }}puis appelez le SDK. L'API répond{ status: 200, text: 'OK' }.

  • POST /api/public/v1/send — endpoint REST public, CORS contrôlé, email / SMS / WhatsApp.
  • Webhooks Twilio pour les statuts de livraison et les réponses entrantes, avec déduplication des événements.
  • pk_… clé publique pour le navigateur, sk_… clé secrète pour vos serveurs.
  • Pièces jointes jusqu'à 20 fichiers par email (8 Mo l'unité, 15 Mo au total) et 10 médias par MMS / WhatsApp (5 Mo l'unité), par id, contenu base64 ou URL https.
  • Sécurité des fichiers exécutables bloqués, types médias restreints pour MMS / WhatsApp, URLs signées HMAC valides 24 h et purge automatique des fichiers expirés.
  • Logs horodatés avec IP source, canal et message d'erreur du provider.
<script src="https://votre-app.lovable.app/sdk/flowli-email.js"></script>
<script>
  flowli.init("pk_votre_cle_publique");

  // Email
  flowli.send("service_id", "template_id", {
    from_name: "Ada Lovelace",
    message: "Bonjour depuis le navigateur !"
  });

  // Email avec pièce jointe (id stocké, base64 ou URL https)
  flowli.send("service_id", "template_id", { message: "Votre facture" }, null, {
    attachments: [
      { id: "att_123" },
      { filename: "facture.pdf", content_base64: "JVBERi0x..." }
    ]
  });

  // SMS / WhatsApp (numéro validé en E.164), média MMS optionnel
  flowli.send("service_twilio", "template_sms", {
    to: "+15145550123",
    message: "Votre code est 4821"
  }, null, {
    attachments: [{ url: "https://exemple.com/image.png" }]
  }).then(function (res) {
    console.log(res.status, res.text); // 200 OK
  });
</script>
Appel REST avec pièces jointes

Les trois formats sont combinables dans un même appel : id d'un fichier déjà stocké, contenu base64 inline, ou URL https publique.

curl -X POST https://votre-app.lovable.app/api/public/v1/send \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": "svc_smtp_principal",
    "template_id": "tpl_facture",
    "public_key": "pk_votre_cle_publique",
    "channel": "email",
    "to": "client@exemple.com",
    "template_params": {
      "first_name": "Ada",
      "message": "Voici votre facture du mois."
    },
    "attachments": [
      { "id": "att_9f3c21" },
      {
        "filename": "facture-2026-08.pdf",
        "content_type": "application/pdf",
        "content_base64": "JVBERi0xLjcKJcTl8uXrp..."
      },
      {
        "url": "https://cdn.exemple.com/cgv.pdf",
        "filename": "cgv.pdf"
      }
    ]
  }'

# Réponse
# { "status": 200, "text": "OK", "log_id": "log_2f81c4", "attachments": 3 }