Pointez n'importe quel formulairevers 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.
vraie soumission — couloir vertrobot — 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. --><formmethod="POST"action="https://formflow.digital/api/v1/f/ab12x9"><inputname="email"type="email"required><textareaname="message"></textarea><button>Send</button></form>
# Ou faites un POST depuis n'importe oùcurl -X POST https://formflow.digital/api/v1/f/ab12x9 \
-d "email=jane@acme.dev" \
-d "message=Loved the demo"# → 200 OK · {"success":true,"id":"…"}
{{-- Généré avec des libellés — accessible par défaut. --}}<formmethod="POST"action="https://formflow.digital/api/v1/f/ab12x9"><labelfor="email">Email</label><inputid="email"name="email"type="email"required><labelfor="message">Message</label><textareaid="message"name="message"></textarea><button>Send</button></form>
<!-- Glissez-le dans n'importe quel composant. Toujours sans SDK. --><template><formmethod="POST"action="https://formflow.digital/api/v1/f/ab12x9"><inputname="email"type="email"required/><textareaname="message"></textarea><button>Send</button></form></template>
// Attribut action natif du formulaire — sans client, sans état.export default functionContact() {
return (
<formmethod="POST"action="https://formflow.digital/api/v1/f/ab12x9"><inputname="email"type="email"required/><textareaname="message"/><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 jointscontact-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é
lien signé · chaque fichier/download/e7a1…?expires=1h
logo.svgrefusé · SVG non autorisé
Couloir rougerobots · signalés, jamais livrés, jamais comptés
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éceptioncontact-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
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.
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.
03
Turnstile
Défi Cloudflare optionnel. En cas de panne il s'ouvre — une vraie soumission ne meurt jamais avec la vérification.
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.
Retenuretenu · motivé · récupérable
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.
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/preflightexemple 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éescontact-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 ditCe formulaire n'accepte pas le champ téléphone.
312 refusées cette semaine · 40 accepté
Déduit de votre propre traficproposition
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.
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é.
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.
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 · dashboard4 choses vous demandent
Approche du quota2,540 sur 3,000 soumissions utilisées cette période.Vérifier la facturation
contact-formDes soumissions sont refusées.Ouvrir le formulaire
contact-form — webhook en échec3 livraisons échouées d'affilée, la plus récente il y a 4 minutes.Ouvrir le formulaire
23 soumissions non luesOuvrir la boîte de réception
acme · submissions3,000 inclus · Starter
Non luSpamReçues du 1 au 31 aoûtExporter CSV · XLSX · JSON
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.
Tariffacturé sur ce qui arrive · pas sur ce qu'envoient les robots
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.
Les estimations sont calculées en USD ; Paddle convertit et ajoute les taxes à la caisse.
Recommandé
Free
$0pour toujours
Votre premier formulaire, branché en deux minutes.
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.