Aller au contenu

Pointez n'importe quel formulaire vers une seule URL.

FormFlow reçoit les soumissions envoyées par vos propres formulaires HTML vers une URL FormFlow, filtre le spam, les stocke et les transmet aux destinations que vous configurez (comme votre boîte de réception ou un endpoint webhook). FormFlow n’héberge pas votre frontend intégré et ne décide pas quelles données vos formulaires recueillent ; les forfaits payants peuvent aussi utiliser une page hébergée par FormFlow.

action https://formflow.digital/api/v1/f/ab12x9
Déclaration de soumission FF-1 · exemple illustré
1 Expéditeur
jane@acme.dev
2 Destination
https://formflow.digital/api/v1/f/ab12x9
3 Contenu
name · email · message
4 Fichiers joints
2 images · 4.1 MB
5 Filtrage
0,02 · pas du spam

Le chemin d'une soumission : reçue, filtrée, stockée, livrée.

reçu · filtré · stocké · livré · retenu · motivé · récupérable

votre <form> POST /api/v1/f/ab12x9 name · email · message filtrage modèle par formulaire honeypot · turnstile · schema comptoir de rétention retenue · à un réglage près d'être un prospect boîte de réception Jane 0.02 Marco 0.05 Priya 0.01 buy-now-bot 0.98 webhook signé e-mail résumé export CSV · XLSX · JSON
vraie soumission — couloir vert robot — signalé dans la boîte, jamais livré, jamais compté refusé par vos propres réglages — retenu, et récupérable

Changez un attribut. Publiez.

Pointez l'attribut action de votre formulaire vers une URL FormFlow et c'est tout — pas de SDK, pas de bibliothèque cliente, pas de serveur à monter. Ça marche depuis un site statique, un serveur, ou un curl ponctuel.

  • Décrivez votre formulaire — Disponible sur les forfaits payants lorsqu’il est activé. Décrivez ce que ce formulaire recueille, ou le test que vous voulez proposer. Vous pourrez vérifier les champs avant de le créer.
  • Importer un schéma de formulaire — Feuille de calcul des questions · Vérifier les champs importés

N'écrivez pas non plus les champs à la main. FormFlow déduit le schéma de votre formulaire de son propre trafic et génère le balisage accessible — HTML, Blade, Vue ou React — prêt à coller. 18 types de champs — text, email, tel, url, number, textarea, select, checkbox, radio, multiselect, date, file, scale, rating, time, duration, grid, checkbox_grid — toutes prises en charge par le schéma. Le constructeur dessine le formulaire à côté de la liste des champs pendant que vous éditez, à partir de réglages pas encore enregistrés. Un formulaire long peut se diviser en étapes, qui retombent en une page plate sans JavaScript. Sur les extraits HTML et Blade, activez le rendu live au moment de copier et le formulaire suivra votre liste de champs dès lors — le balisage collé reste le repli.

Il arrive stylé. Sept feuilles de style autonomes voyagent avec le balisage — rien à installer, rien à lier — et un class-map Bootstrap pour un site qui la charge déjà. Chacune respecte le même budget : libellés liés aux champs, cibles de 44px, anneau de focus visible, et contraste vérifié par style avant publication.

<!-- Votre formulaire existant. Sans JS, sans SDK. -->
<form method="POST"
      action="https://formflow.digital/api/v1/f/ab12x9">
  <input  name="email"   type="email" required>
  <textarea name="message"></textarea>
  <button>Send</button>
</form>
Le même formulaire, dans chaque style que publie FormFlow /form-styles/minimal

Rendu par le même générateur qui écrit votre extrait — pas de copie marketing séparée.

Le spécimen est chargé en direct depuis /form-styles/minimal. S'il reste vide, cette route n'est pas joignable d'ici — la feuille de style voyage quand même avec l'extrait.

Prenez les téléversements de fichiers. Épargnez-vous le stockage.

Déclarez un champ file et votre formulaire accepte des images par multipart ordinaire — rien à configurer. Un seul champ prend jusqu'à vingt fichiers d'un coup, et vous choisissez les formats qu'il accepte. FormFlow les stocke sur un disque privé et remet à la boîte un lien signé qui expire, pour qu'aucune pièce jointe ne traîne sur une URL publique.

  • JPEG, PNG, WebP et GIF — le SVG est refusé, et chaque fichier est vérifié par magic bytes, sans se fier à l'extension.
  • Plafond de taille par forfait, appliqué à l'entrée — 2 MB sur Starter Lite, 5 MB sur Starter, 25 MB sur Pro.
  • Stockés en privé ; la boîte affiche un lien signé qui expire, jamais d'image <img> en ligne.
Fichiers joints contact-form · 2 déclarés
roof-damage.jpg
image/jpeg · 3.2 MB · vérifié
accepté
meter-reading.png
image/png · 0.9 MB · vérifié
accepté
logo.svg refusé · SVG non autorisé

Un filtre qui apprend chaque formulaire.

Chaque formulaire a son propre modèle. Chaque soumission est notée dès son arrivée — et chaque fois que vous corrigez un verdict, ce formulaire gagne en précision. La note, le motif, l'action suivante : tout énoncé clairement, avec un rapport par formulaire sur la performance réelle du modèle. Essayez →

Apprenez à ce formulaire : Modèle mis à jour pour ce formulaire.
boîte de réception contact-form · ab12x9
Jane Okafor
Loved the demo — can we talk pricing this week?
0,02 · livré
promo-reply@bulk-seo.link
CHEAP backlinks + guaranteed SEO boost!!!
0,61 · incertain
buy-now-bot
🔥 crypto doubler, act now, limited spots
0,98 · spam
  1. 01

    Pot de miel

    Un champ hors écran que les robots remplissent et que personne ne voit. Il ne coûte rien, donc il passe en premier.

  2. 02

    Modèle par formulaire

    Un modèle naïf de Bayes par formulaire, entraîné par vos corrections. Un formulaire froid emprunte un prior d'équipe, si bien qu'il signale dès la première soumission.

  3. 03

    Turnstile

    Défi Cloudflare optionnel. En cas de panne il s'ouvre — une vraie soumission ne meurt jamais avec la vérification.

  4. 04

    Schéma strict

    Activez-le et les champs que votre formulaire n'a jamais déclarés sont refusés à la porte. Désactivé par défaut.

Ces quatre étapes sont réglées pour arrêter les robots. L'une d'elles ne fait pas que ça : votre schéma strict ne distingue pas un robot d'un acheteur, et vos liste d'origines autorisées et règles de téléversement non plus. Ces trois-là rejettent net, sur votre instruction — et le refus atteint le navigateur d'un inconnu, jamais vous.

Un prospect disparaît à quatre endroits. Un seul, c'est le spam.

Les trois autres arrivent de votre côté du câble, où rien n'échoue assez fort pour que quelqu'un le remarque — celui qui envoyait croit avoir envoyé, et aucune erreur n'atteint jamais FormFlow. Alors chacun est surveillé séparément, dans l'ordre où les rencontre celui qui envoie.

  1. Avant l'envoi Une règle invisible pour eux les refuse, et ils abandonnent. Contrôle en amont
  2. En transit La requête même du navigateur meurt avant d'arriver. Boîte d'envoi du navigateur
  3. À la porte Vos propres réglages renvoient une vraie soumission. Comptoir de rétention
  4. Avec le temps Le formulaire casse sur votre site sans rien dire. Santé du formulaire

Demandez au point de terminaison ce qu'il répondrait.

Avant de risquer le prospect : activez le mode strict et le formulaire que FormFlow génère pour vous soumet chaque champ au vrai jugement avant que quiconque appuie sur Envoyer — mêmes règles, mêmes mots, sans conséquence. Cela comble une faille que générer ne peut pas : le navigateur impose required et type="email", mais pas la règle de validation posée dans le constructeur — un formulaire qui passe la vérification du navigateur peut donc être refusé par le serveur. Désormais il le dit pendant que la personne peut encore corriger. Ce qui les a arrêtés est compté aussi.

  • Sans effet de bord, par contrat — ni ligne, ni quota, ni livraison, ni notation de spam.
  • Sur ce qu'il demande — la forme du corps, l'origine, le schéma — il n'est jamais en désaccord avec le point de terminaison qu'il prédit ; un test poste le même corps aux deux et compare.
  • Il ne demande rien d'autre. Spam, Turnstile et champs de fichier restent au POST réel, si bien qu'un contrôle en amont accepté signifie cette configuration accepte ceci, jamais que la soumission sera stockée.
  • Puise dans la même limite de taux que le POST, avec une réserve qu'une vraie soumission seule peut dépenser.
POST /api/v1/f/ab12x9/preflight exemple illustré

Quittez le champ pour voir ce que répondrait le point de terminaison.

règle de formulaire · min:20 sur message · mode strict actif

Une soumission jamais arrivée peut encore arriver.

Avant même de nous atteindre : une connexion coupée, un onglet fermé trop tôt — et personne n'en entend parler, car celui qui envoyait croit avoir envoyé et il n'y a aucun échec pour FormFlow à consigner. Activez la boîte d'envoi du navigateur et la tentative est gardée puis renvoyée au chargement de page suivant, arrivant comme une soumission ordinaire — comptée, livrée et marquée récupérée sur votre tableau de bord. Elle voyage avec les extraits natifs HTML et Blade copiés rendu live activé.

  • À activer par formulaire, et jamais sur un formulaire avec champ de fichier — un téléversement ne se reconstruit pas depuis un stockage local.
  • Gardée sur l'appareil même de l'expéditeur pendant 24 heures, cinq en attente au plus, et jamais restaurée dans un formulaire qu'il puisse voir.
  • La nouvelle tentative porte un Idempotency-Key sur lequel le point de terminaison prend reçu, si bien qu'un prospect récupéré est stocké, compté et livré exactement une fois. Cet en-tête est publié dans le contrat d'ingestion, pour que votre propre client puisse l'envoyer aussi.
  • Un échec réseau ou un 5xx reste en file pour le prochain chargement de page ; tout ce que le point de terminaison a réellement répondu est abandonné.

Réviser et récupérer

Une soumission refusée n'est pas jetée — elle est retenue, avec son motif et son champ fautif. FormFlow lit ensuite les deux côtés de votre trafic, l'accepté et le refusé, et déduit le changement de réglage unique qui en récupère le plus. Un changement qui coûterait ne serait-ce qu'une soumission déjà acceptée est écarté, jamais montré.

Retenus · soumissions refusées contact-form · 7 derniers jours
dana@meridian.co
Quote for 40 units — my number is 0161 496 0000
refusée · phone
t.okonkwo@brightside.dev
Can you invoice us? Reachable on 020 7946 0102
refusée · phone
hello@fieldnotes.studio
Interested in the annual plan — call 0117 496 0999
refusée · phone

on leur a dit Ce formulaire n'accepte pas le champ téléphone.

312 refusées cette semaine · 40 accepté

Déduit de votre propre trafic proposition

Accepter phone — un champ que votre formulaire envoie et que votre schéma n'a jamais déclaré.

Récupère
312 refusées
Coûte
0 acceptées

Répété sur le trafic récent de ce formulaire — les quelques centaines les plus récentes qu'il a acceptées, et celles qu'il a renvoyées.

Un assouplissement déjà éprouvé sur le trafic que vous avez accepté peut passer en production sans attendre que quelqu'un se connecte, pour que le formulaire cesse de refuser des prospects quand personne ne regarde. Il reste désactivé tant que vous ne l'activez pas, et tout changement que FormFlow fait d'elle-même revient aux réglages que vous avez choisis sauf confirmation du trafic. Le silence ramène — une file bloquée, une panne, personne qui regarde — parce que le chemin du retour est consigné au même souffle que le changement.

Quand quelque chose change vraiment, un e-mail dit ce qui a changé et ce qu'il récupère, et renvoie vers une page qui restaure vos anciens réglages. Les prospects récupérés sont jugés de nouveau selon les réglages vivants, comptés et livrés comme les autres. Rien n'est antidaté.

Et quand le formulaire lui-même tourne mal, rien ne vous le dit non plus.

Bien après sa mise en ligne, votre HTML vit toujours sur votre site — alors un formulaire cassé ou modifié échoue en silence, et aucune erreur n'atteint jamais FormFlow. La santé n'est pas une information donnée à FormFlow ; elle est calculée depuis le trafic et vous est envoyée dès la première panne apparue.

  • Refus — renvoyant une vraie part de son propre trafic. Signalé plutôt qu'une sécheresse, jamais à ses côtés.
  • Sécheresse — les soumissions s'effondrent face à la référence propre du formulaire.
  • Dérive — un champ déclaré que le trafic a discrètement cessé d'envoyer.
  • Arrêt prématuré — le champ où ceux qui envoient échouent sans cesse, compté pendant qu'ils sont encore sur la page.

Du formulaire au résultat.

Le produit, c'est le chemin. Pointez un formulaire HTML existant vers une seule URL ; FormFlow garde lisibles la passation, le jugement, la récupération et la livraison.

Gardez le frontend que vous avez déjà. Puis laissez FormFlow montrer ce qui se passe après Send : les champs peuvent suivre le formulaire à jour, un refus causé par le client peut rester récupérable, et chaque destinataire garde sa propre obligation de livraison.

  • Les pages hébergées sont disponibles sur les forfaits Starter Lite, Starter et Pro.
  • Les listes sont disponibles sur les forfaits Starter Lite, Starter et Pro, avec des pages hébergées.
Exemple illustré : les champs actuels d'une déclaration passent par un rail d'enregistrement sombre tandis que le code collé reste en dessous.
Rendu en direct

Activez l'option quand vous copiez le HTML natif ou le composant Blade : la liste de champs à jour peut suivre le formulaire, le balisage collé reste le repli natif et le style reste celui que vous avez copié.

Exemple illustré : un refus ocre passe par la porte de politique en vigueur avant d'atteindre le bac vert des admis.
Récupération

La récupération n'est ni un contournement ni une relance de webhook. FormFlow réévalue le refus stocké face aux réglages en vigueur du formulaire ; ce n'est qu'alors qu'il devient une vraie soumission, consomme votre quota actuel et entre dans le même chemin de livraison.

Exemple illustré : trois déclarations de formulaires différentes convergent vers une même entrée verte et continuent comme un seul chemin enregistré.
Une seule écriture publique

Le jeton du formulaire est le point public d'écriture. FormFlow reçoit la requête, la juge, stocke la soumission ou le refus, et garde la prochaine décision de livraison dans le même chemin enregistré.

Et l'horloge est à nous, pas au navigateur.

Une séance démarre quand les questions sont affichées, et son échéance est tamponnée sur le siège selon la durée en vigueur à cet instant. L'ingestion compare l'arrivée à cette échéance plus une tolérance fixe jamais divulguée — la page compte jusqu'à zéro.

  • Le départ est écrit une fois. Se reconnecter, vider les cookies, recharger, une fenêtre privée — rien ne le relance. Il court au temps mural, comme dans une salle surveillée.
  • Raccourcir la durée pendant que trente personnes passent leur séance ne raccourcit la copie de personne ; la nouvelle régit les séances qui débutent après elle.
  • La copie survit à la sonnerie. Un formulaire chronométré cesse d'imposer les champs requis, donc la question quarante restée blanche part quand même — tandis que les champs non déclarés restent refusés, gardant le schéma comme contrat dans le sens qui vous protège.
  • L'échéance dépense le siège que quelque chose arrive ou non, si bien qu'on ne bat pas l'horloge en lisant les questions pour revenir demain.

Une boîte de réception, diffusée partout où vous en avez besoin.

Lisez-les à un seul endroit — et poussez la même soumission vers chaque destination que vous avez câblée.

Webhooks signés

Chaque soumission part en POST vers votre endpoint avec une signature HMAC que vous vérifiez. Six tentatives, en back-off de dix secondes à deux heures, chacune consignée contre la soumission. Un endpoint qui ne réussit jamais une seule fois est désactivé et ses propriétaires reçoivent par e-mail la dernière erreur — une URL morte cesse d'être retentée pour toujours, et vous êtes prévenu.

Choisissez ce que dit le corps : le JSON signé de FormFlow, ou un message écrit pour être lu par un canal Slack. Le format décide du corps et de rien d'autre — signature, relances et back-off sont identiques dans les deux cas, et une URL qui est elle-même un identifiant n'est jamais montrée à nouveau une fois enregistrée.

Résumé des soumissions

Un seul e-mail hebdomadaire ou mensuel à votre équipe, couvrant chaque formulaire — pas un par soumission. Ou désactivé, si la boîte de réception et votre webhook suffisent. Les bots n'y apparaissent jamais.

CSV · XLSX · JSON export

Exportez toute la boîte depuis le panneau. FormFlow construit le fichier via une file d'attente et vous envoie un lien signé qui expire dans l'heure — les tableurs sont protégés contre l'injection de formules.

Reçu de l'expéditeur

Une réponse automatique à la personne qui a rempli le formulaire, envoyée vers un champ e-mail déclaré sur celui-ci. Objet et corps sont à vous ; leurs réponses n'apparaissent que là où vous posez un marqueur, échappées en texte, et la charge utile n'est jamais copiée dans le mail. Qui se désabonne reste dehors, et un plafond par équipe encadre un formulaire qui deviendrait soudain populaire. Forfaits payants.

Tout ce qui précède atterrit à un endroit où l'on peut travailler.

Configurer l'endpoint prend deux minutes de votre vie ; voici la partie que vous ouvrez un lundi. Il répond d'abord à une question — qu'est-ce qui me demande mon attention maintenant — avec une ligne par condition réellement vraie, sa raison, et l'unique lien qui agit dessus. Pas de compteurs à comparer : un nombre n'est pas une réponse. En dessous, la boîte est une table, pas un tableau de bord : filtrez les non-lus, écartez les bots, choisissez une plage de dates, exportez exactement ce que vous avez filtré, et ouvrez toute soumission avec son historique complet de livraison.

acme · dashboard 4 choses vous demandent
  • Approche du quota 2,540 sur 3,000 soumissions utilisées cette période. Vérifier la facturation
  • contact-form Des soumissions sont refusées. Ouvrir le formulaire
  • contact-form — webhook en échec 3 livraisons échouées d'affilée, la plus récente il y a 4 minutes. Ouvrir le formulaire
  • 23 soumissions non lues Ouvrir la boîte de réception
acme · submissions 3,000 inclus · Starter
Non lu Spam Reçues du 1 au 31 août Exporter CSV · XLSX · JSON
Jane Okafor
Loved the demo — can we talk pricing this week?
0.02
dana@meridian.co
Devis pour 40 unités — récupérée d'un refus
récupérée
  • webhookhttps://acme.dev/hooks/formflowlivrée · tentative 2
  • webhookhttps://crm.acme.dev/intake502 Bad Gateway · nouvelle tentative dans 5 min
  • digesthebdomadaire · 3 destinatairesen file
buy-now-bot
🔥 crypto doubler, act now, limited spots
0.98

La même table se trouve derrière le registre des retenues, avec la raison, les champs fautifs et les mots exacts dits à l'expéditeur — récupérer un prospect, c'est lire pourquoi il a été refusé puis cliquer Récupérer.

Et relisez-les toutes.

Les mêmes soumissions, via HTTP, avec un jeton frappé dans le panneau : la boîte, une soumission par id, vos formulaires et le registre des refus. Pagination par curseur et filtrable, pour qu'une synchro nocturne vers votre entrepôt ou CRM demande ce qui a changé plutôt que tout, et n'ait jamais besoin d'un navigateur.

  • Lecture seule par construction. Un jeton porte une partie de submissions:read, refusals:read et forms:read — il n'existe aucune capacité d'écriture à accorder, puisqu'il n'y en a pas.
  • Montré une fois à la frappe et stocké sous forme de hachage, avec expiration facultative. FormFlow ne peut plus vous le montrer, et personne qui atteint la base de données non plus.
  • Son propre budget à la minute, croissant avec votre forfait et tenu séparé du débit auquel vos formulaires acceptent des soumissions — une synchro chargée ne peut jamais dépenser la place dont un vrai prospect a besoin.
  • Offres payantes. Un jeton sur une équipe Free obtient en réponse management_api_unavailable plutôt qu'une liste vide, ainsi la raison n'est jamais un mystère.
GET /api/v1/manage/submissions exemple illustré
# Plus récentes d'abord, pagination par curseur.
curl https://formflow.digital/api/v1/manage/submissions \
  -H "Authorization: Bearer ff_…"

{
  "data": [
    {
      "uuid": "9f1c8a2e…",
      "form_uuid": "3b7ed004…",
      "payload": {
        "email": "jane@acme.dev",
        "message": "Loved the demo"
      },
      "is_spam": false,
      "spam_score": 0.02,
      "created_at": "2026-08-15T09:14:22+00:00"
    }
  ],
  "meta": { "has_more": true, "next_cursor": "eyJpZCI6…" }
}

Payez ce qui arrive. Pas ce qu'envoient les robots.

Le spam est filtré avant de compter. Free comprend 100 soumissions avec plafond ferme ; les forfaits payants continuent en dépassement transparent jusqu'à un plafond de dépense ou de sécurité. Vous recevez un e-mail à la moitié, aux quatre cinquièmes et à la totalité de votre quota inclus, si bien qu'un mois chargé vous est annoncé au lieu d'être découvert sur une facture.

Free

$0 pour toujours

Votre premier formulaire, branché en deux minutes.

100 soumissions incluses

Dépassement pour 1,000
Plafond ferme
Plafond quotidien
20
Plafond de période
100
Soumissions / minute
60
Fichiers stockés
Non inclus
Envoi d'image maximum
Non inclus
Page de formulaire hébergée
Non inclus
Formulaires multi-étapes
Non inclus
Reçus du demandeur
Non inclus
Lectures d'API / minute
Non inclus
Commencer gratuitement

Starter Lite

$5.99 USD par mois

Un vrai forfait pour un formulaire petit et régulier.

1,100 soumissions incluses

Dépassement pour 1,000
$7
Plafond quotidien
550
Plafond de période
16,500
Soumissions / minute
150
Fichiers stockés
256 MB
Envoi d'image maximum
2 MB
Page de formulaire hébergée
Inclus
Formulaires multi-étapes
Inclus
Reçus du demandeur
Inclus
Lectures d'API / minute
60
Choisir Starter Lite

Pro

$29.99 USD par mois

Volume élevé, fichiers plus lourds.

10,000 soumissions incluses

Dépassement pour 1,000
$3
Plafond quotidien
5,000
Plafond de période
150,000
Soumissions / minute
1,200
Fichiers stockés
10 GB
Envoi d'image maximum
25 MB
Page de formulaire hébergée
Inclus
Formulaires multi-étapes
Inclus
Reçus du demandeur
Inclus
Lectures d'API / minute
300
Choisir Pro
Chaque limite qui diffère entre les forfaits
Free Starter Lite Starter Pro
Soumissions incluses 100 1,100 3,000 10,000
Dépassement pour 1,000 Plafond ferme $7 $5 $3
Plafond quotidien 20 550 1,500 5,000
Plafond de période 100 16,500 45,000 150,000
Soumissions / minute 60 150 300 1,200
Fichiers stockés Non inclus 256 MB 1 GB 10 GB
Envoi d'image maximum Non inclus 2 MB 5 MB 25 MB
Page de formulaire hébergée Non inclus Inclus Inclus Inclus
Formulaires multi-étapes Non inclus Inclus Inclus Inclus
Reçus du demandeur Non inclus Inclus Inclus Inclus
Lectures d'API / minute Non inclus 60 120 300

Sur chaque forfait, Free compris : autant de formulaires que vous voulez, le modèle antispam par formulaire et son entraînement, les soumissions refusées conservées pour examen, le rendu en direct et le sauvetage navigateur, les webhooks signés, le digest et l’export CSV · XLSX · JSON.

Partout aussi : rôles Propriétaire et membre avec invitations par e-mail, connexion à deux facteurs facultative, interrupteur de pause sur tout formulaire, journal d'activité complet et conservation des données GDPR — adresses e-mail et IP stockées en hachages à clé, purgées selon calendrier. Free se réinitialise au mois calendaire ; les forfaits payants à votre période de facturation. Les prix payants sont localisés par Paddle selon votre position et peuvent inclure des taxes. Voir notre Politique de remboursement.

Pointez votre premier formulaire vers FormFlow.

Branchez un formulaire en deux minutes et regardez la boîte se remplir. Facturation par équipe, et les robots ne comptent jamais dans votre quota. Aucun backend à construire, aucun frontend à héberger.