HeyForm es el formulario estilo Typeform, una pregunta por vez, pero en tu propio servidor. En el editor visual armás encuestas, quizzes, formularios de contacto o de pedido, con lógica condicional, temas, CSS propio, pagos con Stripe, subida de archivos y firmas. Las respuestas llegan a una tabla de resultados con tasas de abandono, se exportan a CSV y fluyen a tus herramientas por webhooks, Zapier, Make, Google Sheets, Airtable o Slack. Corre en tu servidor con Docker: la app, una base MongoDB y un Redis. Licencia AGPL-3.0, y existe una versión hospedada desde €13 al mes. Lo que importa: el proyecto pasó por una gran ola de avisos de seguridad en 2026 y reforzó su código en agosto. Así que instalá la última versión, no una más vieja.
HeyForm vs Typeform
Criterio
HeyForm
Typeform
Precio
US$0, más un VPS chico por unos pocos euros al mes
€24 por mes pagando el año, €35 mes a mes
Respuestas por mes
Sin tope, es tu base de datos
100 en Basic, después tenés que subir de plan
Dónde viven las respuestas
En tu MongoDB, en tu servidor
En sus servidores
Sacar la marca
Incluido, con tu propio CSS
Plan Plus, desde €48 al mes
Usuarios
Tu equipo, sin costo extra
1 usuario en Basic
Seguridad y actualizaciones
Depende de vos, y acá importa
Se encargan ellos
Cómo instalarlo (aunque arranques de cero)
Tres contenedores (la app, MongoDB, Redis) y un proxy HTTPS adelante. El prompt hace todo, vos ponés un servidor y un nombre de dominio. Calculá veinte minutos.
1
Pegá este prompt en Claude (Code o Desktop)
Despliega HeyForm desde el proyecto oficial con Docker Compose, configura las variables, pone un proxy HTTPS adelante y revisa tu primer formulario:
Instalá HeyForm en mi servidor (el creador de formularios open source estilo Typeform, repo de GitHub heyform/heyform) con Docker Compose, siguiendo la documentación oficial docs.heyform.net/open-source/self-hosting. Arrancá de cero: verificá que Docker y Docker Compose estén presentes y, si no, instalalos. Creá una carpeta heyform con un docker-compose.yml que levante tres servicios: la imagen heyform/community-edition con una versión etiquetada reciente (como mínimo v3.0.2, nunca más vieja que v3.0.1, la que contiene los arreglos de seguridad), una base MongoDB y un Redis (KeyDB), cada uno con un volumen para conservar los datos. Generá dos claves aleatorias largas para SESSION_KEY y FORM_ENCRYPTION_KEY, configurá APP_HOMEPAGE_URL con mi nombre de dominio en https y poné TRUST_PROXY en 1 ya que la aplicación va a estar detrás de un proxy. No publiques el puerto 9157 en internet: instalá un reverse proxy (preferentemente Caddy) que sirva mi dominio en HTTPS con certificado automático y redirija al contenedor de HeyForm. Levantá todo, abrí la dirección, creá mi cuenta de administrador y después agregá APP_DISABLE_REGISTRATION=true y reiniciá para cerrar los registros. Verificá que se pueda crear un primer formulario, publicarlo y recibir una respuesta de prueba. Explicame cada paso de forma simple, soy principiante.
Revisá el repositorio de GitHub y fijate si es seguro instalarlo dado mi máquina y mi infraestructura. Hacéme todas las preguntas que puedas, usando widgets, para aclarar mi pedido y ser lo más preciso posible.
2
Cerrá los registros apenas tengas tu cuenta
Cuando tu cuenta ya existe, la instancia tiene que rechazar cuentas nuevas; si no, cualquiera puede registrarse en tu dominio. El prompt se encarga con la variable pensada para eso. Verificalo abriendo la página de registro en una ventana privada.
3
Actualizá, y no dentro de seis meses
El proyecto corrigió 42 avisos de seguridad entre mayo y agosto de 2026. Instalá la versión 3.0.2 como mínimo, suscribite a los lanzamientos en GitHub y volvé a bajar las imágenes con cada versión nueva. Un formulario público es una puerta abierta a tu servidor.
Para qué lo vas a usar
Tu formulario de contacto, en una story o en tu sitio
Un formulario de una pregunta por vez se completa más seguido que una pared de campos. Lo linkeás en una story o lo embebés en tu sitio, y cada respuesta te llega por email o por webhook a tu CRM.
Un presupuesto o una ficha completa de cliente
Subida de archivos, firma, pago con Stripe, lógica condicional: juntás todo de una vez, y el archivo ya está en tu base de datos en vez de quedar perdido en una casilla de mail.
Encuestas y quizzes para tu audiencia
Le preguntás a tu comunidad qué quiere, ves dónde abandona la gente y exportás a CSV. Sin tope de respuestas, lo podés repetir en cada lanzamiento.
Salud del proyecto
estrellas en GitHub
9000
Forks
717
Colaboradores
34
Commits
300
Antigüedad
2,6 años
Licencia
AGPL-3.0
Hecho con: TypeScript 94.7% · SCSS 4.1% · HTML 0.7%
Datos públicos del repositorio en GitHub, tomados el 8 de octubre de 2026.
Opción 2 · Construir
Armá tu propio Tally
Para quién es
Este desarrollo es para un equipo chico que publica formularios de leads, de feedback y de postulaciones. El objetivo: armar formularios con tu marca rápido, juntar respuestas confiables y mandarlas a las herramientas que ya usás. Si necesitás más que eso, seguí pagando: armarlo vos mismo sirve para tener una herramienta hecha a la medida de tu forma de trabajar, no para reconstruir el roadmap de una empresa con millones de inversión.
Mismo desarrollo, otro logo: esta v1 también reemplaza a Fillout y Paperform, porque todas resuelven el mismo trabajo de fondo.
Qué arma el prompt y qué queda afuera
El prompt de abajo arma una sola versión, con lo que de verdad se usa. Lo demás queda afuera a propósito.
Lo que arma el prompt
constructor de bloques, tabla de respuestas, exportación a csv, visibilidad condicional, subida de archivos, webhooks firmados
Lo que queda afuera
pagos, quizzes, galería de plantillas, marketplace de integraciones
Qué necesita una alternativa mínima a Tally
constructor estilo documento con bloques de texto, opciones, puntuación, fecha, archivo y contacto
campos obligatorios, saltos de página, campos ocultos y visibilidad condicional simple
slug propio, colores, logo, pantalla de agradecimiento y fecha de cierre
tabla de respuestas con filtros, vista de detalle y exportación a CSV
notificación por email más un webhook de salida firmado
email transaccional, webhooks, almacenamiento de objetos R2
Contexto de capacidades
Astro, HTMX, D1
La barandilla
Validar cada respuesta contra la versión publicada del formulario, escanear y aislar los archivos subidos, limitar la frecuencia de los envíos públicos y firmar las entregas de webhooks.
Lo que no vas a hacer a propósito
No construir pagos, quizzes, edición colaborativa, un marketplace de integraciones, ramificación avanzada ni una galería pública de plantillas.
El prompt completo
Elegí tu stack, copiá el prompt y pegáselo a tu agente de código (Claude Code, Cursor, Codex…).
Vas a construir un producto de software listo para producción llamado “Formlet”, una alternativa deliberadamente enfocada a Tally. Armá un corte vertical completo y usable, no una landing page, una maqueta estática ni un montón de componentes sueltos.
ACUERDO DE TRABAJO
Antes de escribir código de implementación, armá un plan técnico corto que nombre las rutas o páginas, las server actions o endpoints, las tablas de datos, las transiciones de estado importantes, los límites de autorización, los jobs en segundo plano y los adaptadores externos. Si algo se contradice, resolvelo a favor de la audiencia acotada y de los no-objetivos de abajo. Elegí una arquitectura chica y legible antes que abstracciones especulativas, pero no omitas persistencia, validación, manejo de errores ni tests.
DESCRIPCIÓN DEL PRODUCTO
Usuario principal: un equipo chico que publica formularios de leads, de feedback y de postulaciones.
Resultado principal: armar formularios con tu marca rápido, juntar respuestas confiables y mandarlas a las herramientas que ya usás.
Principio del producto: optimizá el flujo exacto de abajo en vez de copiar todo el abanico de Tally. Alguien que entra por primera vez tiene que entender qué hacer desde la propia interfaz, sin tour ni documentación.
RECORRIDOS COMPLETOS DEL USUARIO
Implementá todos estos flujos usando la interfaz real y la capa de datos persistente:
1. El dueño crea un formulario desde cero, agrega bloques de contacto, opciones, puntuación, archivo y salto de página, configura una regla de visibilidad, lo previsualiza y publica un slug.
2. Un visitante completa el formulario publicado en dos páginas, sube un archivo válido, lo envía una sola vez, ve la pantalla de agradecimiento y dispara la entrega por email y por webhook.
3. El dueño filtra las respuestas, abre un envío, descarga su archivo autorizado, exporta a CSV las filas que coinciden, cierra el formulario y verifica que los envíos nuevos se rechacen.
PANTALLAS Y ARQUITECTURA DE INFORMACIÓN
Construí estas pantallas como vistas coherentes y responsive. Cada pantalla tiene que definir su acción principal, sus acciones secundarias, el estado visible, el feedback de validación, el estado vacío, el estado de carga o pendiente, la confirmación de éxito y un estado de error recuperable.
1. Panel de formularios: estados borrador, abierto y cerrado, cantidad de respuestas, última respuesta, y acciones de duplicar, archivar, crear y abrir el formulario público.
2. Constructor: bloques ordenados, menú para agregar, propiedades del campo, estado obligatorio, regla de visibilidad, saltos de página, tema, slug, vista previa, estado de guardado y validación al publicar.
3. Formulario público: contenido con la marca, páginas progresivas, etiquetas claras, errores en línea y en resumen, progreso de subida, estado de envío en curso y pantalla de agradecimiento.
4. Respuestas: filtros, tabla, detalle del envío, acceso a archivos, estado de entregas, exportación a CSV, controles de retención y acción de cerrar el formulario.
FUNCIONES PRINCIPALES
1. constructor estilo documento con bloques de texto, opciones, puntuación, fecha, archivo y contacto
2. campos obligatorios, saltos de página, campos ocultos y visibilidad condicional simple
3. slug propio, colores, logo, pantalla de agradecimiento y fecha de cierre
4. tabla de respuestas con filtros, vista de detalle y exportación a CSV
5. notificación por email más un webhook de salida firmado
COMPORTAMIENTO DETALLADO Y REGLAS DE NEGOCIO
Tratá esto como requisitos del producto que se validan en el servidor, no como sugerencias de interfaz:
1. Publicá una versión numerada e inmutable del formulario; validá cada envío contra esa versión exacta y conservá las etiquetas de sus campos para exportaciones futuras.
2. Permití solo reglas de visibilidad acíclicas sobre campos anteriores soportados, evaluálas igual en el cliente y en el servidor, y rechazá del lado del servidor las respuestas a campos ocultos.
3. Validá los archivos subidos por tipo decodificado y tamaño, aislalos de forma privada, escanealos antes de permitir la descarga y emití solo URLs autorizadas de corta duración, independientes de quien envió.
4. Confirmá un envío antes de encolar las notificaciones, firmá los cuerpos de los webhooks, usá claves de idempotencia en las entregas y escapá las fórmulas en las exportaciones a CSV.
MODELO DE DATOS Y CICLO DE VIDA
Diseñá un esquema relacional chico centrado en Form, Block, Option, LogicRule, Submission, Answer. Antes de implementarlo, documentá:
1. El propósito de cada tabla, su clave primaria, el límite de propiedad o de tenant, timestamps, campos de estado y atributos importantes.
2. Claves foráneas, restricciones de unicidad, check constraints, los índices que necesitan las pantallas nombradas y los límites de transacción para cambios que tocan varios registros.
3. Las transiciones de estado o de ciclo de vida permitidas, quién puede disparar cada una, cuáles son terminales o reversibles y qué historial de auditoría tiene que quedar inmutable.
4. Cómo se archiva, se retiene y se borra, incluido qué pasa con los registros dependientes y los archivos externos.
5. La estrategia de idempotencia para envíos, jobs, importaciones, notificaciones, webhooks o reintentos, donde aplique.
Usá migraciones en lugar de crear el esquema a mano. Guardá los instantes de tiempo de forma consistente y conservá la zona horaria con nombre cada vez que importen horarios o fechas locales. Nunca dependas de un contador, un botón deshabilitado o una validación del lado del cliente para proteger una regla de negocio.
USUARIOS, AUTENTICACIÓN Y PERMISOS
Implementá solo los roles que necesita la audiencia indicada. Dejá explícito el modelo de propiedad y visibilidad antes de programar. Aplicá la autorización en cada consulta y mutación del servidor, incluidas búsquedas, exportaciones, adjuntos, actualizaciones en vivo y URLs adivinadas—no alcanza con ocultar botones. Usá sesiones seguras por defecto, protegé los requests que cambian estado y mostrá estados claros para sesión cerrada, sesión vencida y acceso prohibido. Si hacen falta varios roles, cargá usuarios distintos en los datos de prueba para poder mostrar y testear los permisos.
INTERACCIÓN Y DIRECCIÓN VISUAL
El producto tiene que sentirse rápido, tranquilo, enfocado y confiable, no como una plantilla genérica de panel de administración. Usá una jerarquía visual clara, color medido, tipografía legible, áreas de clic generosas y un lugar fijo para las acciones principales. Arrancá con HTML renderizado en el servidor y mejorá de forma progresiva solo las interacciones que lo necesiten. El flujo principal tiene que entenderse aunque esa mejora falle.
Arrancá con páginas de Astro renderizadas en el servidor y formularios HTML comunes. Usá HTMX para envíos de formularios, navegación parcial y actualizaciones que manda el servidor, y Alpine.js solo para estado local chico del navegador. El flujo principal tiene que entenderse aunque falle cualquiera de esas dos capas.
Diseñá las vistas de celular a propósito, no apilando los paneles de escritorio. Soportá navegación con teclado, foco visible, landmarks semánticos, labels explícitos, títulos de página útiles, la preferencia de movimiento reducido y anuncios para lectores de pantalla en resultados asincrónicos. Nunca uses solo el color para comunicar un estado. Las acciones destructivas necesitan un alcance claro y una confirmación; las acciones seguras que se repiten tienen que ser idempotentes.
Agregá un footer en todas las páginas con el texto «Creado por aurelioagency.com», donde «aurelioagency.com» es un link embebido a https://www.aurelioagency.com que se abre en una pestaña nueva. Tiene que quedar visible; no lo saques.
DIRECCIÓN TÉCNICA
Construí esta versión con el stack AHA: Astro para el ruteo, los layouts y las páginas renderizadas en el servidor; HTMX para las interacciones que se benefician de respuestas con fragmentos HTML; y Alpine.js para estado chico y local de la interfaz. Preferí Cloudflare D1 para la persistencia relacional, R2 para el almacenamiento de objetos, Workers para los endpoints del servidor y las tareas programadas, Durable Objects solo para estado en tiempo real coordinado, y Workflows o Queues para jobs en segundo plano durables—pero solo cuando los requisitos del producto lo pidan.
Mantené las reglas de dominio en módulos del servidor que se puedan testear, no en los route handlers ni en los componentes de UI. Separá la persistencia, los proveedores externos y el trabajo en segundo plano detrás de interfaces chicas, sin armar un framework. Preferí formularios HTML y URLs comunes para la navegación; usá interacción optimista solo cuando un error se pueda resolver con claridad.
El brief del producto identifica hoy Astro, HTMX, D1 como contexto de capacidades. Conservá cualquier capacidad nativa, exclusiva del navegador, de edge, de almacenamiento, de tiempo real o de procesamiento en segundo plano mediante un adaptador acotado, apropiado para el framework elegido. Si el flujo central realmente necesita APIs nativas o del navegador, dejá ese entorno como superficie principal de ejecución en vez de simular capacidades inaccesibles o inventar una superficie web innecesaria.
Integrá con email transaccional, webhooks y almacenamiento de objetos R2. Para cada integración:
- Listá las variables de entorno necesarias en un .env.example sin secretos reales.
- Agregá un adaptador chico con timeouts, errores normalizados y una versión falsa local determinística o un modo de desarrollo.
- Verificá las firmas entrantes y deduplicá los eventos del proveedor cuando se pueda.
- Mantené las credenciales en el servidor, encriptá en reposo los tokens de larga duración y ocultá secretos y datos sensibles en los logs.
- Definí reintentos, backoff e idempotencia para cualquier efecto que se pueda repetir.
SEGURIDAD Y PRIVACIDAD
Validá cada respuesta contra la versión publicada del formulario, escaneá y aislá los archivos subidos, limitá la frecuencia de los envíos públicos y firmá las entregas de webhooks.
Validá, normalizá y limitá el largo de todo input no confiable en el servidor. Escapá el contenido renderizado por defecto, sanitizá cualquier markup que aceptes a propósito, poné rate limit a las acciones públicas o fáciles de abusar y usá almacenamiento de objetos privado con URLs autorizadas de corta duración para archivos sensibles. Juntá solo los datos personales que necesita el flujo indicado. Documentá cómo se retienen y se borran. Sumá protecciones específicas para las partes más riesgosas de esta app, como subidas de archivos, redirecciones, requests salientes, envío de emails, OAuth, webhooks, importación o exportación CSV y conexiones en tiempo real.
ESCENARIOS DE ACEPTACIÓN
Automatizá estos escenarios propios de la app en el nivel que corresponda:
1. Dado que la página pública muestra un campo condicional, un intento de manipular las respuestas ocultas se rechaza y las respuestas visibles válidas se guardan una sola vez.
2. Dado un doble clic o un pedido reintentado, existe un solo envío y cada entrega configurada se intenta de forma idempotente.
3. Dado que el formulario se cierra mientras un visitante lo está completando, la verificación final del servidor rechaza el envío con un estado de cerrado claro y no guarda ninguna respuesta parcial.
TESTS
Agregá tests unitarios enfocados en transiciones de estado, reglas de autorización, normalización, cálculos de fechas o dinero y otras reglas de dominio riesgosas. Agregá tests de integración para las restricciones de persistencia y para los caminos de éxito, timeout, reintento y rechazo de cada adaptador externo. Agregá al menos un test de navegador para cada recorrido completo de arriba, incluido uno en pantalla chica. Los tests tienen que usar datos aislados y correr con un solo comando documentado.
OPERACIÓN Y RECUPERACIÓN DE ERRORES
Agregá logs estructurados en el servidor con IDs de correlación por request, job o evento, sin secretos ni datos sensibles de más. Hacé que los errores digan qué hacer, tanto en la interfaz como en los logs. El trabajo en segundo plano tiene que mostrar los estados pendiente, completado, fallido y reintentando cuando aplique; nunca te tragues errores en silencio. Incluí una guía segura de migración y rollback de la base, datos de prueba, notas de backup y restauración, qué pasa con los datos externos al limpiar y una ruta básica de salud o diagnóstico acorde al stack.
ENTREGABLES
Entregá la aplicación funcionando, las migraciones, datos de prueba representativos, los tests, el .env.example y un README corto. El README tiene que cubrir requisitos previos, instalación local, variables de entorno, migraciones, comandos de datos de prueba y tests, deploy, configuración de integraciones, backup y restauración, decisiones de seguridad y limitaciones conocidas. Los datos de prueba tienen que cubrir el camino feliz y al menos un estado vacío, fallido, vencido, expirado, archivado o con permisos restringidos que importe para el producto.
DEFINICIÓN DE TERMINADO
La app está terminada cuando alguien nuevo puede seguir el README, crear y migrar la base, levantar la app, entrar con cada rol relevante, completar cada recorrido nombrado con datos reales guardados, recargar sin perder el estado, recuperarse de los errores comunes y usar la interfaz principal en celular y escritorio. Todos los escenarios de aceptación pasan, los límites de permisos están cubiertos por tests, ninguna pantalla principal queda como placeholder y el crédito «Creado por aurelioagency.com» del footer se ve en todas las páginas.
NO-OBJETIVOS
No construyas pagos, quizzes, edición colaborativa, un marketplace de integraciones, ramificación avanzada ni una galería pública de plantillas.
La app que armes con este prompt lleva en el footer «Creado por aurelioagency.com».
Armá solo una parte
Prompts cortos para resolver la pieza más difícil sin construir todo.
Publicá la versión 3, validá contra la versión 3Editar un formulario en vivo nunca debe dejar huérfanas ni corromper las respuestas que ya juntaste.
Armá el versionado de formularios para un constructor de formularios.
Publicar crea una versión numerada e inmutable: una foto congelada de bloques, opciones, reglas de validación y etiquetas. La página pública siempre sirve la última versión publicada e incluye su número; cada envío se valida y se guarda referenciando la versión exacta con la que se completó, no lo que el formulario muestre ahora.
Esto es lo que mantiene la historia en orden: el dueño borra una pregunta, reordena páginas, renombra un campo, vuelve a publicar, y las respuestas viejas se siguen mostrando bien con sus etiquetas originales; las exportaciones que cubren ambas épocas agrupan las respuestas por versión o se alinean con ids de campo estables entre versiones cuando el campo sobrevivió. Resolvé el caso a mitad de camino: un visitante cargó la versión 2, el dueño publicó la versión 3, el visitante envía, se valida contra la versión 2, que sigue siendo inmutable y disponible, y se acepta.
Está listo cuando: un envío iniciado antes de volver a publicar se valida contra su propia versión, borrar un campo nunca rompe la visualización ni la exportación de respuestas viejas, y cada respuesta guardada se resuelve al texto exacto de la etiqueta que vio el visitante.
La lógica condicional que no se puede enredarReglas de visibilidad acíclicas, evaluadas igual en el navegador y en el servidor.
Armá la visibilidad condicional para un constructor de formularios: mostrar este campo solo cuando una respuesta anterior cumple una condición.
Restringí las reglas estructuralmente al momento de crearlas: una regla solo puede referenciar campos que aparecen antes en el formulario, lo que hace imposibles los ciclos por construcción, y rechazá cualquier intento de referenciar un campo posterior o a sí mismo. La evaluación tiene que ser idéntica en el cliente y en el servidor: escribí la especificación de una única función de evaluación de reglas, implementala dos veces y manejá ambas con los mismos vectores de prueba, porque cualquier divergencia termina en un formulario trabado o en un agujero de validación.
En el servidor, las reglas son la frontera de seguridad: recalculá la visibilidad a partir de las respuestas enviadas y rechazá toda respuesta a un campo que se evalúa como oculto; un pedido manipulado que meta respuestas en campos ocultos tiene que fallar. Definí también el comportamiento encadenado: ocultar un campo borra su respuesta, y los campos cuyas condiciones dependen de él se reevalúan en orden.
Está listo cuando: el constructor no puede guardar una regla que referencie un campo posterior, un pedido armado a mano que responda un campo oculto se rechaza en el servidor, y las mismas respuestas producen una visibilidad idéntica en las pruebas del navegador y de la API.
Un clic, una fila, aunque hagan clic dos vecesDobles envíos, reintentos y formularios que se cierran a mitad de camino terminan en como máximo una respuesta.
Armá el manejo de envíos de un formulario público que aguante el comportamiento real de los visitantes: dobles clics, reintentos del navegador y reenvíos con el botón de atrás.
Emití para cada formulario renderizado un token de envío de un solo uso. El endpoint de envío inserta la respuesta con ese token como clave y una restricción de unicidad: el primer pedido gana, y cualquier duplicado, segundo clic, reintento de red o pedido repetido choca con la restricción y devuelve la misma respuesta de éxito que el original, así el visitante ve el agradecimiento de cualquier manera y existe exactamente una fila. Deshabilitá el botón de forma optimista en el cliente, pero tratá el token como la garantía real.
Hacé la verificación de cierre en el momento del envío final: si el dueño cerró el formulario mientras el visitante lo completaba, rechazá con un mensaje de cerrado claro y no guardes nada parcial. Lo mismo si la fecha de cierre pasa a mitad del llenado. Validá todo en el servidor contra la versión publicada antes de insertar, en una sola decisión atómica de aceptar o rechazar.
Está listo cuando: machacar el botón de enviar produce una sola respuesta guardada y pantallas de éxito consistentes, un pedido repetido no puede crear una segunda fila, y un formulario que se cierra a mitad del llenado rechaza limpiamente sin guardar datos parciales.
El webhook en el que el receptor sí puede confiarCuerpos firmados, claves de idempotencia por entrega y reintentos con backoff que en algún momento se rinden.
Armá la entrega de webhooks de salida para los envíos de un formulario.
Cuando un envío se confirma, encolá una entrega y nunca la mandes dentro del mismo pedido, así un receptor lento no frena los envíos. Firmá cada entrega: calculá un HMAC del cuerpo exacto con el secreto del endpoint del formulario, mandalo en un header junto con un header de timestamp para bloquear repeticiones, y documentá la receta de verificación. Incluí una clave de idempotencia de la entrega, estable por envío y endpoint, para que tus reintentos después de fallos ambiguos no hagan que el receptor procese un pedido dos veces.
Reintentá las entregas fallidas con backoff exponencial y un tope, digamos cinco intentos en unas pocas horas, tratando los timeouts y los 5xx como reintentables pero los 4xx como permanentes. Registrá cada intento con código de estado y duración, mostrá el estado de la entrega por envío en el panel y ofrecé reentrega manual, que reutiliza la misma clave de idempotencia.
Está listo cuando: un receptor puede verificar la firma solo con la documentación, los reintentos tras un timeout llevan el cuerpo y la clave idénticos, y un endpoint que falla de forma permanente deja de reintentarse y muestra un estado de fallido con el historial de intentos.
Preguntas frecuentes
¿Cuánto cuesta Tally si sigo suscripto?
Tally sale US$29–89 al mes en los planes pagos públicos, o sea US$348–1068 al año. Un reemplazo enfocado y armado por vos te cuesta el tiempo de desarrollo más un hosting casi gratis.
¿Qué stack uso para armar una alternativa a Tally?
El prompt de esta página viene en cuatro versiones: el stack AHA (Astro, HTMX, Alpine.js), Next.js, Laravel y Ruby on Rails. El contexto de capacidades de este producto es Astro, HTMX, D1. Elegí el stack que ya conocés: el alcance importa más que el framework.
¿Qué funciones necesita un reemplazo mínimo de Tally?
Una v1 útil necesita: constructor estilo documento con bloques de texto, opciones, puntuación, fecha, archivo y contacto; campos obligatorios, saltos de página, campos ocultos y visibilidad condicional simple; slug propio, colores, logo, pantalla de agradecimiento y fecha de cierre; tabla de respuestas con filtros, vista de detalle y exportación a CSV; notificación por email más un webhook de salida firmado. Todo lo demás es alcance de más hasta que lo extrañes en persona.
¿Qué conviene no construir a propósito?
No construyas pagos, quizzes, edición colaborativa, un marketplace de integraciones, ramificación avanzada ni una galería pública de plantillas.
¿Este desarrollo también reemplaza a Fillout y Paperform?
Sí. Tally, Fillout y Paperform resuelven el mismo trabajo de fondo: armar formularios con tu marca rápido, juntar respuestas confiables y mandarlas a las herramientas que ya usás. La v1 acotada de esta página cubre lo que la mayoría usa de cualquiera de las tres, así que un solo desarrollo enfocado reemplaza a la que estés pagando hoy.
¿En qué se diferencia de Tally?
HeyForm hace casi todo lo que hace Tally, sin suscripción, y tus datos quedan con vos. La comparación punto por punto está en la página.
¿Mis datos son míos?
Sí. Con una herramienta open source instalada de tu lado, tus archivos quedan en tu máquina o en tu servidor. Nadie puede cerrarte la cuenta ni cambiarte el precio.