Inscripción a eventos

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.

Preet SutharFundador, Ikiform

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:

Qué trabajos pasan de Eventbrite a tu propia configuración, y quién hace cada unopágina del eventosu página, su marcatu páginainscripciónsu checkouttu formulario,Ikiform lo guardaemail deconfirmaciónlo envían por tiwebhook a tuherramienta de emailaforotope fijo, lista deesperacuentas y pausasentradaapp, escaneo QRlista impresatareaen Eventbriteen tu propio sitioQué trabajos pasan de Eventbrite a tu propia configuración, y quién hace cada unopáginadeleventosupágina,sumarcatupáginainscripciónsucheckouttuformulario,Ikiformloguardaemaildeconfirmaciónloenvíanpor tiwebhooka tuherramientadeemailaforotopefijo,listadeesperacuentasypausasentradaapp,escaneoQRlistaimpresatareaenEventbriteen tu propiositio
  1. La página del evento pasa de la página de Eventbrite a tu propio sitio, con tu diseño.
  2. La inscripción pasa del checkout de Eventbrite a tu formulario, que envía a Ikiform.
  3. El email de confirmación ya no se envía por ti. Un webhook lo envía desde tu propio proveedor de email.
  4. El aforo ya no es un tope fijo. Cuentas las inscripciones por sesión y pausas el formulario cuando se llena.
  5. El control de acceso ya no es una app con escaneo de QR. Imprimes una lista a partir de la exportación CSV.
Las tres primeras son mejores en tu propio sitio. Las dos últimas son peores, y para un evento grande o de pago son el motivo para quedarte en una plataforma de entradas.

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.

Sesiones a las que asistirás
Almuerzo
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.
  • name está etiquetado para la acreditación, así obtienes el nombre con el que la gente quiere que la llamen.
  • lunch es un radio con una opción No lunch, para que pidas comida solo para quienes van a comer.
  • updates es una checkbox sin marcar, que se guarda como true o false en un envío que conserva su propio created_at. Añade gente a tu newsletter solo cuando sea true.
  • Usa el formulario de RSVP de la guía principal para el markup de tu stack, con estos campos en su lugar.
Si un formulario de inscripción también ofrece novedades futuras, deja esa checkbox sin marcar por defecto y di exactamente qué vas a enviar. La checkbox es tu registro del consentimiento; el email de confirmación de abajo no es marketing y no lo necesita.

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.

app/api/registered/route.ts
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;
  }
}
  • verifyWebhook comprueba la firma, así nadie más puede hacer que tu dominio envíe emails.
  • Idempotency-Key usa el webhook-id de 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 502 hace 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:

seats.ts
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ónQué hacer
Un taller completoQuita su opción del formulario y de la definición de campos, y dilo en la página
Toda la jornada completaPause form y sustituye el formulario por una dirección de email para la lista de espera
Alguien cancelaResponde al email de confirmación. Elimina su envío para que el recuento libere la plaza
Se esperan ausenciasEn 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

  1. La tarde anterior, exporta Submissions como CSV y elimina los emails duplicados, quedándote con el más reciente.
  2. Ordena por nombre, conserva name, organisation y lunch, e imprime dos copias para el mostrador.
  3. Imprime las acreditaciones desde la misma hoja con una combinación de correspondencia, usando la columna name.
  4. 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

  1. En Allowed domains del formulario, añade el dominio de tu sitio, y localhost mientras desarrollas. Déjalo vacío para aceptar envíos desde cualquier lugar.
  2. Inscríbete con tu propio email, eligiendo dos sesiones.
  3. El email de confirmación llega desde tu dominio, con las dos sesiones.
  4. Si añadiste un webhook, abre el endpoint en Webhooks. La entrega muestra succeeded con la respuesta de tu servidor.
  5. Ejecuta el recuento de plazas. Cada una de tus dos sesiones muestra una plaza ocupada.
  6. ¿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

ProblemaQué hacer
422 que pide elegir como máximo 3 opcionesAlguien 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 unaLlama 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 IkiformAbre 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 webhookSe 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_limitedUn 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

¿Te atascaste en un paso o quieres una guía para tu caso? Escribe a hello@ikiform.com.