FormFlow recibe los envíos que tus propios formularios HTML mandan a una URL de FormFlow, filtra el spam, los almacena y los reenvía a los destinos que configures (como tu bandeja de entrada o un endpoint webhook). FormFlow no aloja tu frontend incrustado ni decide qué datos recopilan tus formularios; los planes de pago también pueden usar una página alojada por FormFlow.
envío real — canal verdebot — marcado en la bandeja, nunca entregado, nunca contadorechazado por tus propios ajustes — retenido, y recuperable
Cambia un atributo. Listo.
Apunta el atributo action de tu formulario a una URL de FormFlow y ya está — sin SDK, sin librería cliente, sin servidor que levantar. Funciona desde un sitio estático, un servidor o un curl puntual.
Describe tu formulario — Disponible en los planes de pago cuando está habilitado. Describe lo que recopila este formulario, o la prueba que quieres plantear. Puedes revisar los campos antes de crearlo.
Importar un esquema de formulario — Hoja de cálculo de preguntas · Revisar los campos importados
Tampoco escribas los campos a mano. FormFlow infiere el esquema de tu formulario a partir de su propio tráfico y genera el marcado accesible — HTML, Blade, Vue o React — listo para pegar. 18 tipos de campo — text, email, tel, url, number, textarea, select, checkbox, radio, multiselect, date, file, scale, rating, time, duration, grid, checkbox_grid — todas admitidas por el esquema. El constructor dibuja el formulario junto a la lista de campos mientras editas, desde ajustes que aún no has guardado. Un formulario largo puede dividirse en pasos, que vuelven a una página plana sin JavaScript. En los fragmentos de HTML y Blade, activa Renderizado en vivo al copiar y el formulario seguirá tu lista de campos desde entonces — el marcado pegado queda como respaldo.
Llega con estilo. Siete hojas de estilo autocontenidas viajan con el marcado — nada que instalar, nada que enlazar — y un mapa de clases Bootstrap para un sitio que ya lo carga. Todas cumplen el mismo presupuesto: etiquetas ligadas a inputs, objetivos de 44px, anillo de foco visible y contraste verificado por estilo antes de publicarse.
<!-- Tu formulario actual. Sin JS, sin SDK. --><formmethod="POST"action="https://formflow.digital/api/v1/f/ab12x9"><inputname="email"type="email"required><textareaname="message"></textarea><button>Send</button></form>
# O haz POST desde cualquier sitiocurl -X POST https://formflow.digital/api/v1/f/ab12x9 \
-d "email=jane@acme.dev" \
-d "message=Loved the demo"# → 200 OK · {"success":true,"id":"…"}
{{-- Generado con etiquetas — accesible por defecto. --}}<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>
<!-- Colócalo en cualquier componente. Sigues sin 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>
// Acción nativa del formulario — sin cliente, sin estado.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>
);
}
El mismo formulario, en todos los estilos que publica FormFlow/form-styles/minimal
Renderizado por el mismo generador que escribe tu fragmento — sin copia de marketing aparte.
La muestra se trae en vivo desde /form-styles/minimal. Si sigue en blanco, esa ruta no es accesible desde aquí — la hoja de estilos viaja igualmente con el fragmento.
Acepta subidas de archivos. Olvídate del almacenamiento.
Declara un campo file y tu formulario acepta imágenes por multipart normal — nada que configurar. Un solo campo admite hasta veinte archivos a la vez, y eliges qué formatos acepta. FormFlow los guarda en un disco privado y entrega a la bandeja un enlace firmado con caducidad, así ningún adjunto vive en una URL pública.
JPEG, PNG, WebP y GIF — se rechaza SVG, y cada archivo se comprueba por magic bytes, sin fiarse de la extensión.
Techo de tamaño por plan, aplicado a la entrada — 2 MB en Starter Lite, 5 MB en Starter, 25 MB en Pro.
Almacenados en privado; la bandeja muestra un enlace firmado que caduca, jamás una imagen <img> en línea.
Archivos adjuntoscontact-form · 2 declarados
roof-damage.jpg
image/jpeg · 3.2 MB · verificado
aceptado
meter-reading.png
image/png · 0.9 MB · verificado
aceptado
enlace firmado · cada archivo/download/e7a1…?expires=1h
logo.svgrechazado · SVG no permitido
Canal rojobots · marcados, nunca entregados, nunca contados
Un filtro que aprende cada formulario.
Cada formulario tiene su propio modelo. Cada envío se puntúa al llegar — y cada vez que corriges un veredicto, ese formulario afina más. La puntuación, el motivo, la siguiente acción: todo dicho sin rodeos, con un informe por formulario del rendimiento real del modelo. Pruébalo →
Enseña a este formulario:Modelo actualizado para este formulario.
bandeja de entradacontact-form · ab12x9
Jane Okafor
Loved the demo — can we talk pricing this week?
0.02 · entregado
promo-reply@bulk-seo.link
CHEAP backlinks + guaranteed SEO boost!!!
0.61 · dudoso
buy-now-bot
🔥 crypto doubler, act now, limited spots
0.98 · spam
01
Honeypot
Un campo fuera de pantalla que rellenan los bots y las personas nunca ven. No cuesta nada, así que va primero.
02
Modelo por formulario
Un modelo naive-Bayes por formulario, entrenado con tus correcciones. Un formulario frío toma prestado un prior de equipo, así que marca desde el primer envío.
03
Turnstile
Desafío opcional de Cloudflare. Ante una caída falla abierto — un envío real nunca muere con la comprobación.
04
Esquema estricto
Actívalo y los campos que tu formulario nunca declaró se rechazan en la puerta. Desactivado por defecto.
Retenidoretenido · con motivo · recuperable
Esas cuatro etapas están afinadas para frenar bots. Una no hace solo eso: tu esquema estricto no distingue un bot de un comprador, y tampoco lo hacen tu lista de orígenes permitidos ni tus reglas de subida. Esas tres rechazan de plano, bajo tus instrucciones — y el rechazo llega al navegador de un desconocido, nunca a ti.
Un cliente potencial desaparece en cuatro sitios. Solo uno de ellos es spam.
Los otros tres ocurren en tu lado del cable, donde nada falla lo bastante alto para que alguien lo note — quien enviaba cree haberlo enviado, y ningún error llega nunca a FormFlow. Así que cada uno se vigila por separado, en el orden en que los encuentra quien envía.
Antes de arriesgar el cliente potencial: activa el modo estricto y el formulario que te genera FormFlow pasa cada campo por el juicio real antes de que nadie pulse Enviar — mismas reglas, mismas palabras, sin consecuencias. Cierra una brecha que generar no puede: el navegador exige required y type="email", pero no la regla de validación que pusiste en el constructor — así que un formulario que supera la comprobación del navegador puede ser rechazado igualmente por el servidor. Ahora lo dice mientras la persona aún puede arreglarlo. Lo que les detuvo también se cuenta.
Sin efectos secundarios por contrato — ni fila, ni cuota, ni entrega, ni puntuación de spam.
En lo que pregunta — la forma del cuerpo, el origen, el esquema — nunca discrepa del endpoint que predice; una prueba manda el mismo cuerpo a ambos y compara.
No pregunta nada más. Spam, Turnstile y los campos de archivo quedan para el POST real, así que una verificación previa aceptada significa esta configuración acepta esto, nunca que se vaya a almacenar.
Consume el mismo límite de tasa que el POST, con una reserva que solo puede gastar un envío real.
POST /api/v1/f/ab12x9/preflightejemplo ilustrativo
Deja el campo para ver qué respondería el endpoint.
regla de formulario · min:20 en message · modo estricto activo
Un envío que nunca llegó todavía puede llegar.
Antes de alcanzarnos siquiera: una conexión caída, una pestaña cerrada demasiado pronto — y nadie se entera, porque quien enviaba cree haber enviado y no hay fallo alguno que FormFlow pueda registrar. Activa la bandeja de salida del navegador y el intento se guarda y se reenvía en la siguiente carga de página, llegando como un envío ordinario — contado, entregado y marcado como rescatado en tu panel. Viaja con los fragmentos nativos de HTML y Blade que copiaste con Renderizado en vivo activado.
Se activa por formulario, y nunca en uno con campo de archivo — una subida no puede reconstruirse desde el almacenamiento local.
Guardado en el propio dispositivo de quien envía durante 24 horas, cinco esperando como máximo, y nunca restaurado en un formulario que pueda ver.
El reenvío lleva un Idempotency-Key sobre el que el endpoint emite recibo, así que un cliente recuperado se almacena, cuenta y entrega exactamente una vez. Esa cabecera está publicada en el contrato de ingesta, para que tu propio cliente también pueda enviarla.
Un fallo de red o un 5xx espera en cola para la siguiente carga de página; cualquier cosa que el endpoint respondió de verdad se descarta.
Revisar y recuperar
Un envío rechazado no se descarta — se retiene, con el motivo y el campo culpable. FormFlow lee después ambos lados de tu tráfico, lo aceptado y lo rechazado, y deduce el único cambio de ajuste que recupera la mayoría. Un cambio que costaría aunque sea un envío que ya aceptaste se descarta, nunca se muestra.
Retenidos · envíos rechazadoscontact-form · últimos 7 días
dana@meridian.co
Quote for 40 units — my number is 0161 496 0000
rechazado · phone
t.okonkwo@brightside.dev
Can you invoice us? Reachable on 020 7946 0102
rechazado · phone
hello@fieldnotes.studio
Interested in the annual plan — call 0117 496 0999
rechazado · phone
se les dijoEste formulario no acepta el campo de teléfono.
312 rechazados esta semana · 40 aceptado
Derivado de tu propio tráficopropuesta
Aceptar phone — un campo que tu formulario envía y tu esquema nunca declaró.
Recupera
312 rechazados
Cuesta
0 aceptados
Ensayado con el tráfico reciente de este formulario — los últimos pocos cientos que aceptó y los que devolvió.
Una relajación ya probada contra el tráfico que has aceptado puede activarse sin esperar a que alguien inicie sesión, para que el formulario deje de rechazar clientes mientras nadie mira. Queda apagada hasta que tú la actives, y cualquier cambio que FormFlow haga por su cuenta revierte a los ajustes que elegiste salvo que el tráfico lo confirme. El silencio revierte — una cola detenida, un apagón, nadie mirando — porque el camino de vuelta queda registrado en el mismo respiro que el cambio.
Cuando algo cambia de verdad, un correo dice qué cambió y qué recupera, y enlaza a una página que restaura tus ajustes anteriores. Los clientes recuperados se juzgan otra vez con los ajustes vivos, se cuentan y se entregan como cualquier otro. Nada se retrodata.
Y cuando el propio formulario falla, nada te avisa tampoco.
Mucho después de publicarlo, tu HTML sigue viviendo en tu sitio — así que un formulario roto o editado falla en silencio, y ningún error llega nunca a FormFlow. La salud no es algo que se le informe a FormFlow; se calcula del tráfico y se te envía la primera vez que aparece una avería.
Rechazo — devolviendo una parte real de su propio tráfico. Se informa en vez de una sequía, nunca junto a ella.
Sequía — los envíos se desploman frente a la propia línea base del formulario.
Deriva — un campo declarado cuyo envío el tráfico ha dejado silenciosamente.
Parada temprana — el campo donde quienes envían siguen fallando, contado mientras siguen en la página.
Del formulario al resultado.
El producto es el camino. Apunta un formulario HTML existente a una sola URL; FormFlow mantiene legibles la entrega, el criterio, la recuperación y el envío.
Conserva el frontend que ya tienes. Luego deja que FormFlow muestre qué pasa tras Send: los campos pueden seguir al formulario actual, un rechazo causado por el cliente puede seguir siendo recuperable y cada destinatario conserva su propia obligación de entrega.
Las páginas alojadas están disponibles en los planes Starter Lite, Starter y Pro.
Las listas están disponibles en los planes Starter Lite, Starter y Pro, con páginas alojadas.
Representación en vivo
Actívalo cuando copies el HTML nativo o el componente Blade: la lista de campos actual puede seguir al formulario, la etiqueta pegada queda como respaldo nativo y el estilo sigue siendo el que copiaste.
Recuperación
La recuperación no es un atajo ni un reintento de webhook. FormFlow vuelve a valorar el rechazo almacenado contra la configuración vigente del formulario; solo entonces se convierte en un envío real, consume uso actual y entra en la misma ruta de entrega.
Una escritura pública
El token del formulario es el punto público de escritura. FormFlow recibe la petición, la valora, almacena el envío o el rechazo, y deja la siguiente decisión de entrega dentro de la misma ruta registrada.
Y el reloj es nuestro, no del navegador.
Una sesión empieza cuando se muestran las preguntas, y su plazo queda sellado en el asiento con la duración vigente en ese momento. La ingesta compara la llegada contra ese plazo más una tolerancia fija que nunca revela — la página cuenta hacia cero.
El inicio se escribe una vez. Volver a iniciar sesión, borrar cookies, recargar, una ventana privada — nada lo reinicia. Corre en tiempo real, como ya lo hace una sala vigilada.
Acortar la duración mientras treinta personas hacen su sesión no acorta el examen de nadie; la nueva rige las sesiones que empiecen después.
El papel sobrevive al timbre. Un formulario cronometrado deja de exigir los campos obligatorios, así que la pregunta cuarenta en blanco también se envía — mientras los campos no declarados siguen rechazándose, manteniendo el esquema como contrato en la dirección que te protege.
El plazo consume el asiento llegue o no algo, así que el reloj no se vence leyendo las preguntas y volviendo mañana.
Una bandeja de entrada, repartida a todos los destinos que necesites.
Léelos en un solo lugar — y empuja el mismo envío a cada destino que hayas conectado.
Webhooks firmados
Cada envío llega POST a tu endpoint con una firma HMAC que verificas. Seis intentos, retrocediendo de diez segundos a dos horas, cada uno registrado contra el envío. Un endpoint que nunca tiene éxito se desactiva y se avisa por correo a sus dueños con el último error — una URL muerta deja de reintentarse para siempre, y tú te enteras.
Elige qué dice el cuerpo: el JSON firmado propio de FormFlow, o un mensaje escrito para que lo lea un canal de Slack. El formato decide el cuerpo y nada más — la firma, los reintentos y el retroceso son iguales en ambos casos, y una URL que es en sí una credencial nunca vuelve a mostrarse una vez guardada.
Resumen de envíos
Un solo correo semanal o mensual para tu equipo, cubriendo todos los formularios — no uno por envío. O apagado, si la bandeja y tu webhook bastan. Los bots jamás aparecen en él.
CSV · XLSX · JSON export
Exporta toda la bandeja desde el panel. FormFlow construye el archivo en una cola y te envía por correo un enlace firmado que caduca en una hora — las hojas de cálculo están protegidas contra inyección de fórmulas.
Recibo del remitente
Una respuesta automática a quien rellenó el formulario, enviada a un campo de email que declares en él. Asunto y cuerpo son tuyos; sus respuestas aparecen solo donde pongas un marcador, escapadas como texto, y la carga nunca se copia al correo. Quien se da de baja, queda fuera, y un tope por equipo acota un formulario que de pronto se vuelve popular. Planes de pago.
Todo lo anterior aterriza en un lugar donde puedes trabajar.
Configurar el endpoint son dos minutos de tu vida; esto es lo que abres un lunes. Primero responde una pregunta — qué necesita mi atención ahora — con una fila por condición realmente cierta, su motivo y el único enlace que actúa sobre ella. Sin contadores que comparar: un número no es una respuesta. Debajo, la bandeja es una tabla, no un panel: filtra lo no leído, aparta los bots, elige un rango de fechas, exporta exactamente lo filtrado y abre cualquier envío con todo su historial de entrega.
acme · dashboard4 cosas te necesitan
Acercándose a la cuota2,540 de 3,000 envíos usados este periodo.Revisar facturación
contact-formSe están rechazando envíos.Abrir formulario
contact-form — webhook fallando3 entregas fallidas seguidas, la última hace 4 minutos.Abrir formulario
23 envíos sin leerAbrir bandeja de entrada
acme · submissions3,000 incluidos · Starter
No leídoSpamRecibidos 1–31 agoExportar CSV · XLSX · JSON
Jane Okafor
Loved the demo — can we talk pricing this week?
0.02
dana@meridian.co
Presupuesto de 40 unidades — recuperado de un rechazo
webhookhttps://crm.acme.dev/intake502 Bad Gateway · reintentando en 5m
digestsemanal · 3 destinatariosen cola
buy-now-bot
🔥 crypto doubler, act now, limited spots
0.98
La misma tabla está detrás del registro de retenidos, con el motivo, los campos culpables y las palabras exactas que se le dijeron al remitente — así recuperar un cliente potencial es leer por qué fue rechazado y pulsar Recuperar.
Y lee cada uno de vuelta.
Los mismos envíos, por HTTP, con un token que acuñas en el panel: la bandeja, un envío por id, tus formularios y el registro de rechazados. Paginado por cursor y filtrable, así tu sincronización nocturna hacia tu almacén o CRM pide solo lo que cambió en vez de todo, y nunca necesita un navegador.
De solo lectura por construcción. Un token lleva parte de submissions:read, refusals:read y forms:read — no existe capacidad de escritura que conceder, porque no la hay.
Se muestra una vez al acuñarlo y se guarda como hash, con caducidad opcional. FormFlow no puede mostrártelo otra vez, ni nadie que alcance la base de datos.
Su propio presupuesto por minuto, que crece con tu plan y se mantiene separado de la tasa a la que tus formularios aceptan envíos — una sincronización ocupada jamás puede gastar el espacio que necesita un cliente potencial real.
Planes de pago. A un token en un equipo Free se le responde con management_api_unavailable en vez de una lista vacía, así el motivo nunca es un misterio.
Tarifase cobra por lo que aterriza · no por lo que envían los bots
Paga por lo que aterriza. No por lo que envían los bots.
El spam se filtra antes de contar. Free incluye 100 envíos con tope firme; los planes de pago continúan en excedente transparente hasta alcanzar un techo de gasto o de seguridad. Te escribimos al medio, a cuatro quintos y al total de tu asignación incluida, así que un mes ocupado es algo que te contamos y no algo que descubres en una factura.
Las estimaciones se calculan en USD; Paddle convierte y añade los impuestos en el pago.
En todos los planes, incluido Free: tantos formularios como quieras, el modelo antispam por formulario y su entrenamiento, los envíos rechazados conservados para revisión, el renderizado en vivo y el rescate del navegador, los webhooks firmados, el resumen y la exportación CSV · XLSX · JSON.
También en todas partes: roles de propietario y miembro con invitaciones por correo, inicio de sesión con dos factores opcional, un interruptor de pausa en cualquier formulario, un registro de actividad completo y retención de datos GDPR — correos e IP guardados como hashes con clave, purgados según calendario. Free se reinicia cada mes natural; los planes de pago, en tu periodo de facturación. Los precios de pago los localiza Paddle para tu ubicación y pueden incluir impuestos. Consulta nuestra Política de reembolso.
Apunta tu primer formulario a FormFlow.
Conecta un formulario en dos minutos y mira llenarse la bandeja. Facturación por equipo, y los bots jamás cuentan contra la cuota. Sin backend que construir, sin frontend que alojar.