Inscripción a eventos8 min de lectura
Inscripción a eventos sin Eventbrite, para eventos comunitarios gratuitos
Gestiona la inscripción a un evento comunitario gratuito en tu sitio: elección de sesiones, email de confirmación desde tu herramienta, aforos por sala y lista de entrada.
Para un evento gratuito, un formulario de inscripción en tu propio sitio puede sustituir el registro de Eventbrite: envía a Ikiform, que guarda cada inscripción y avisa por email a tu equipo. Añade un webhook que mande el email de confirmación desde tu propio proveedor de email, y cuenta las plazas por sesión a partir de la inscripción más reciente de cada email. Mantén Eventbrite, u otra plataforma de entradas, para entradas de pago, límites de aforo estrictos y escaneo en la entrada.
Qué cambia sin una plataforma de entradas
Eventbrite hace cinco trabajos a la vez, y es fácil olvidar los que ahora harás tú. Para una jornada comunitaria gratuita, una serie de meetups o un taller, la mayoría son pequeños. Este es el reparto, con honestidad:
- La página del evento pasa de la página de Eventbrite a tu propio sitio, con tu diseño.
- La inscripción pasa del checkout de Eventbrite a tu formulario, que envía a Ikiform.
- El email de confirmación ya no se envía por ti. Un webhook lo envía desde tu propio proveedor de email.
- El aforo ya no es un tope fijo. Cuentas las inscripciones por sesión y pausas el formulario cuando se llena.
- El control de acceso ya no es una app con escaneo de QR. Imprimes una lista a partir de la exportación CSV.
Los precios de Eventbrite cambian, así que revisa su propia página de precios antes de comparar costes. En los eventos gratuitos, los motivos para irse no suelen ser las comisiones: la lista de asistentes está en la plataforma de otro, la página parece suya y quienes se inscriben entregan sus datos a otra empresa con su propia cuenta y sus propios ajustes de email. Para eventos de pago, quédate. Ikiform no tiene pagos.
Un formulario de inscripción con elección de sesiones
Una jornada comunitaria suele tener sesiones en paralelo, y las salas tienen tamaños distintos. Pregunta a qué sesiones piensa asistir la gente, para poder pasar un taller popular a una sala más grande antes del día. Esta definición limita la elección a tres de cuatro, ya que dos son a la misma hora:
Vista previa
Ejecuta el validador de Ikiform en tu navegador. No se envía nada.
sessions es un multi_select, que se guarda como array. En HTML, llama a las checkboxes sessions[] para que una sola opción también se guarde como lista.nameestá etiquetado para la acreditación, así obtienes el nombre con el que la gente quiere que la llamen.lunches unradiocon una opciónNo lunch, para que pidas comida solo para quienes van a comer.updateses una checkbox sin marcar, que se guarda comotrueofalseen un envío que conserva su propiocreated_at. Añade gente a tu newsletter solo cuando seatrue.- Usa el formulario de RSVP de la guía principal para el markup de tu stack, con estos campos en su lugar.
Envía la confirmación desde tu propia herramienta de email
Ikiform no envía emails a la persona que rellena el formulario. Los emails de notificación solo van a ti y a tu equipo, así que no hay respuesta automática, email de confirmación ni doble opt-in. Envíalos desde tu herramienta de email, activada por un webhook. En un evento, envíala de todos modos: la gente reenvía la confirmación a su responsable y la busca la mañana del evento. Este route handler recibe el webhook firmado de Ikiform y envía el email con la API de Resend. Cualquier proveedor con un endpoint de envío funciona igual.
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";
const TITLES: Record<string, string> = {
keynote: "Opening talk, 10:00",
workshop_a: "Workshop A, 11:30",
workshop_b: "Workshop B, 11:30",
panel: "Closing panel, 15:00",
};
function escape(text: string) {
return text.replace(/[&<>"']/g, (char) => `&#${char.charCodeAt(0)};`);
}
export async function POST(request: Request) {
const payload = await request.text();
try {
const event = await verifyWebhook({
payload,
headers: request.headers,
secret: process.env.IKIFORM_WEBHOOK_SECRET!,
});
if (event.type !== "submission.created") return new Response(null, { status: 204 });
const fields = event.data.fields;
const email = String(fields.email ?? "");
const chosen = (Array.isArray(fields.sessions) ? fields.sessions : []).map((id) => TITLES[String(id)] ?? String(id));
const response = await fetch("https://api.resend.com/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RESEND_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": request.headers.get("webhook-id") ?? event.data.submission_id,
},
body: JSON.stringify({
from: "Community Day <hello@community.example>",
to: email,
reply_to: "hello@community.example",
subject: "You're registered for Community Day, 14 March",
html: [
`<p>Hi ${escape(String(fields.name ?? ""))},</p>`,
"<p>You're on the list for Community Day on 14 March at The Old Library. Doors open at 9:30.</p>",
`<p>Your sessions: ${chosen.map(escape).join(", ")}.</p>`,
'<p><a href="https://community.example/day.ics">Add it to your calendar</a>. Can\'t come after all? Reply to this email.</p>',
].join(""),
}),
});
if (!response.ok) return new Response(`Email API answered ${response.status}`, { status: 502 });
return new Response(null, { status: 204 });
} catch (error) {
if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
throw error;
}
}verifyWebhookcomprueba la firma, así nadie más puede hacer que tu dominio envíe emails.Idempotency-Keyusa elwebhook-idde la entrega, que se mantiene igual en cada reintento automático y en un Retry manual de una entrega fallida, así que una entrega cuya respuesta se perdió no envía un segundo email.- El nombre y los títulos de las sesiones se escapan antes de ir al HTML. Trata los valores de los campos como datos no fiables.
- Un
502hace que Ikiform reintente, así que una caída breve del proveedor de email no hace perder una confirmación. El spam nunca activa el webhook, así que los bots no te hacen enviar emails a desconocidos.
Añade la ruta en Webhooks en el panel y copia su secreto en IKIFORM_WEBHOOK_SECRET. Ikiform reintenta una entrega fallida durante unos 3 días, y el registro de entregas muestra cada intento. Sin código, una herramienta de automatización como Zapier o Make puede enviar el mismo email.
Plazas por sesión
Ikiform no detiene las inscripciones de una sesión cuando su sala se llena, y no puede ocultar una opción completa. Cuenta en su lugar, usando la inscripción más reciente de cada persona, y ejecútalo cuando quieras un número:
import { createClient } from "@ikiform/sdk";
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY! });
const ROOMS: Record<string, number> = { keynote: 200, workshop_a: 30, workshop_b: 30, panel: 200 };
const latest = new Map<string, string[]>();
for await (const submission of ikiform.submissions.iterate({ formId: process.argv[2], status: "received", limit: 100 })) {
const email = String(submission.fields.email ?? "").trim().toLowerCase();
const chosen = Array.isArray(submission.fields.sessions) ? submission.fields.sessions.map(String) : [];
if (email && !latest.has(email)) latest.set(email, chosen);
}
for (const [session, seats] of Object.entries(ROOMS)) {
const taken = [...latest.values()].filter((chosen) => chosen.includes(session)).length;
console.log(`${session.padEnd(12)} ${String(taken).padStart(4)} of ${seats}${taken >= seats ? " FULL" : ""}`);
}Cuando un taller se llene, edita la página para marcarlo como completo y quita su opción del formulario y de la definición de campos, para que los nuevos envíos no puedan elegirlo. Cuando se llene toda la jornada, elige Pause form: los envíos reciben 403 form_paused, y la página debería decir que la inscripción está cerrada.
| Situación | Qué hacer |
|---|---|
| Un taller completo | Quita su opción del formulario y de la definición de campos, y dilo en la página |
| Toda la jornada completa | Pause form y sustituye el formulario por una dirección de email para la lista de espera |
| Alguien cancela | Responde al email de confirmación. Elimina su envío para que el recuento libere la plaza |
| Se esperan ausencias | En los eventos gratuitos suele faltar una parte de los inscritos. Lleva la cuenta de tu propia tasa y admite un poco más de inscripciones la próxima vez |
En la entrada
- La tarde anterior, exporta Submissions como CSV y elimina los emails duplicados, quedándote con el más reciente.
- Ordena por nombre, conserva
name,organisationylunch, e imprime dos copias para el mostrador. - Imprime las acreditaciones desde la misma hoja con una combinación de correspondencia, usando la columna
name. - Apunta a mano a quienes lleguen sin inscripción. Después del evento, añádelos a tu propia lista solo si están de acuerdo.
Compruébalo antes de anunciarlo
- En Allowed domains del formulario, añade el dominio de tu sitio, y
localhostmientras desarrollas. Déjalo vacío para aceptar envíos desde cualquier lugar. - Inscríbete con tu propio email, eligiendo dos sesiones.
- El email de confirmación llega desde tu dominio, con las dos sesiones.
- Si añadiste un webhook, abre el endpoint en Webhooks. La entrega muestra
succeededcon la respuesta de tu servidor. - Ejecuta el recuento de plazas. Cada una de tus dos sesiones muestra una plaza ocupada.
- ¿No llegó nada? Cambia el filtro de estado del panel a Spam. El spam recibe la misma respuesta de éxito que un envío real.
Errores comunes
| Problema | Qué hacer |
|---|---|
422 que pide elegir como máximo 3 opciones | Alguien eligió las cuatro sesiones. Es la regla max_items funcionando; muestra el mensaje de Ikiform junto a las checkboxes. |
| Solo se guarda una sesión cuando alguien elige una | Llama a las checkboxes sessions[]. Con el campo definido como multi_select, un único valor también se guarda como lista. |
| No llega el email de confirmación, pero la inscripción está en Ikiform | Abre la entrega en el registro del endpoint. Un 502 con el estado del proveedor significa que rechazó el email, a menudo por un dominio de envío sin verificar. |
| El envío está en el panel pero no llegó ningún email ni webhook | Se guardó como spam. El spam no envía nada. Ábrelo en el filtro Spam para ver los motivos y márcalo como no spam para enviar su email y sus webhooks. |
429 rate_limited | Un visitante envió más de lo que permite el límite de frecuencia del formulario. Standard permite 5 por minuto por visitante. Espera lo que indique Retry-After, o elige Relaxed o Custom para formularios que envían desde una IP compartida. |
Preguntas
Para un evento gratuito en el que puedes contar plazas e imprimir una lista, sí. Para entradas de pago, límites de aforo estrictos, listas de espera o acceso con QR, una plataforma de entradas hace todo eso e Ikiform no.
Envíalo tú. Añade un webhook de Ikiform que llame a la API de tu proveedor de email, o que se conecte mediante una herramienta de automatización, y envía la confirmación desde tu propio dominio.
No de forma automática. Cuenta las inscripciones por sesión con un script corto o una hoja, y quita la opción de un taller del formulario cuando se llene.
No. Cada envío aceptado se guarda. Una repetición idéntica en menos de 24 horas suma a la puntuación de spam pero no es spam por sí sola, así que elimina duplicados por email en tu lista, tu base de datos o tu exportación CSV.
No, no hay plan gratuito. Probar es gratis: puedes enviar 50 envíos de prueba al mes desde localhost antes de pagar. Para pasar a producción, Pro empieza en 6 $/mes por 500 envíos, o puedes pagar una sola vez 49 $ por 10.000 envíos o 149 $ por 50.000 envíos, con créditos que nunca caducan.
¿Te atascaste en un paso o quieres una guía para tu caso? Escribe a hello@ikiform.com.