Inscrição em eventos

Inscrição em eventos8 min de leitura

Inscrição em eventos sem Eventbrite, para eventos comunitários gratuitos

Faça as inscrições de um evento comunitário gratuito no seu próprio site: escolha de sessões, e-mail de confirmação pela sua ferramenta, contagem por sala e lista de check-in.

Preet SutharFundador, Ikiform

Para um evento gratuito, um formulário de inscrição no seu próprio site pode substituir o cadastro do Eventbrite: ele envia ao Ikiform, que armazena cada inscrição e avisa sua equipe por e-mail. Adicione um webhook que envia o e-mail de confirmação pelo seu próprio provedor de e-mail e conte as vagas por sessão a partir da inscrição mais recente de cada e-mail. Mantenha o Eventbrite, ou outra plataforma de ingressos, para ingressos pagos, limites rígidos de vagas e check-in com leitura de QR code.

O que muda sem uma plataforma de ingressos

O Eventbrite faz cinco trabalhos de uma vez, e é fácil esquecer os que agora ficam com você. Para um dia comunitário gratuito, uma série de meetups ou um workshop, a maioria deles é pequena. Esta é a divisão, com honestidade:

Quais trabalhos saem do Eventbrite para a sua própria estrutura, e quem faz cada umpágina do eventopágina e marca delessua páginainscriçãocheckout delesseu formulário, oIkiform armazenae-mail deconfirmaçãoenviado por vocêwebhook para suaferramenta de e-mailcapacidadelimite rígido, listade esperavocê conta e pausacheck-inapp, leitura de QRlista impressatrabalhono Eventbriteno seu próprio siteQuais trabalhos saem do Eventbrite para a sua própria estrutura, e quem faz cada umpáginadoeventopáginae marcadelessuapáginainscriçãocheckoutdelesseuformulário,oIkiformarmazenae-maildeconfirmaçãoenviadoporvocêwebhookparasuaferramentadee-mailcapacidadelimiterígido,listadeesperavocêconta epausacheck-inapp,leiturade QRlistaimpressatrabalhonoEventbriteno seupróprio site
  1. A página do evento sai da página do Eventbrite para o seu próprio site, com o seu design.
  2. A inscrição sai do checkout do Eventbrite para o seu formulário, que envia ao Ikiform.
  3. O e-mail de confirmação deixa de ser enviado por você. Um webhook o envia pelo seu próprio provedor de e-mail.
  4. A capacidade deixa de ser um limite rígido. Você conta as inscrições por sessão e pausa o formulário quando lotar.
  5. O check-in deixa de ser um app com leitura de QR code. Você imprime uma lista a partir da exportação CSV.
Os três primeiros ficam melhores no seu próprio site. Os dois últimos ficam piores, e num evento grande ou pago eles são o motivo para continuar numa plataforma de ingressos.

Os preços do Eventbrite mudam, então confira a página de preços deles antes de comparar custos. Em eventos gratuitos, os motivos para sair normalmente não são as taxas: a lista de participantes fica na plataforma de outra empresa, a página tem a cara deles, e quem se inscreve entrega seus dados a outra empresa, com conta e configurações de e-mail próprias. Para eventos pagos, fique. O Ikiform não tem pagamentos.

Um formulário de inscrição com escolha de sessões

Um dia comunitário muitas vezes tem sessões paralelas, e as salas têm tamanhos diferentes. Pergunte de quais sessões as pessoas pretendem participar, para poder levar um workshop concorrido para uma sala maior antes do dia. Esta definição limita as escolhas a três de quatro, já que duas acontecem ao mesmo tempo:

Prévia

Roda o validador do Ikiform no seu navegador. Nada é enviado.

Sessões de que você vai participar
Almoço
sessions é um multi_select, armazenado como array. No HTML, dê aos checkboxes o nome sessions[] para que uma única escolha ainda seja armazenada como lista.
  • name tem o rótulo de crachá, o que traz o nome pelo qual as pessoas querem ser chamadas.
  • lunch é um radio com a opção No lunch, para você encomendar comida só para quem vai comer.
  • updates é um checkbox desmarcado, armazenado como true ou false num envio que guarda o seu próprio created_at. Só adicione pessoas à sua newsletter quando ele for true.
  • Use o formulário de RSVP do guia principal para o markup na sua stack, trocando os campos por estes.
Se um formulário de inscrição também oferece novidades futuras, deixe esse checkbox desmarcado por padrão e diga exatamente o que você vai enviar. O checkbox é o seu registro de consentimento; o e-mail de confirmação abaixo não é marketing e não precisa dele.

Envie a confirmação pela sua própria ferramenta de e-mail

O Ikiform não envia e-mail para quem preenche o formulário. Os e-mails de notificação vão só para você e sua equipe, então não há resposta automática, e-mail de confirmação nem double opt-in. Envie esses e-mails pela sua ferramenta de e-mail, disparados por um webhook. Num evento, envie mesmo assim: as pessoas encaminham a confirmação para o chefe e a procuram na manhã do evento. Este route handler recebe o webhook assinado do Ikiform e envia o e-mail pela API do Resend. Qualquer provedor com um endpoint de envio funciona do mesmo jeito.

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 confere a assinatura, então ninguém mais consegue fazer o seu domínio enviar e-mails.
  • Idempotency-Key usa o webhook-id da entrega, que continua o mesmo em toda nova tentativa automática e num Retry manual de uma entrega que falhou, então uma entrega cuja resposta se perdeu não envia um segundo e-mail.
  • O nome e os títulos das sessões são escapados antes de entrar no HTML. Trate os valores dos campos como entrada não confiável.
  • Um 502 faz o Ikiform tentar de novo, então uma instabilidade curta no provedor de e-mail não faz você perder uma confirmação. Spam nunca dispara o webhook, então bots não fazem você mandar e-mail para desconhecidos.

Adicione a rota em Webhooks no painel e copie o segredo dela para IKIFORM_WEBHOOK_SECRET. O Ikiform tenta de novo uma entrega que falhou por cerca de 3 dias, e o log de entregas mostra cada tentativa. Sem código, uma ferramenta de automação como o Zapier ou o Make consegue enviar o mesmo e-mail.

Vagas por sessão

O Ikiform não interrompe as inscrições de uma sessão quando a sala lota, e não consegue esconder uma opção esgotada. Em vez disso, conte, usando a inscrição mais nova de cada pessoa, e rode a contagem sempre que quiser um 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" : ""}`);
}

Quando um workshop lotar, edite a página para marcá-lo como esgotado e remova a opção dele do formulário e da definição de campos, para que novos envios não possam escolhê-lo. Quando o dia todo lotar, escolha Pause form: os envios recebem 403 form_paused, e a página deve dizer que as inscrições foram encerradas.

SituaçãoO que fazer
Um workshop lotadoRemova a opção dele do formulário e da definição de campos, e avise na página
O dia todo lotadoPause form e troque o formulário por um endereço de e-mail para a lista de espera
Alguém cancelaA pessoa responde ao e-mail de confirmação. Exclua o envio dela para que a contagem libere a vaga
Faltas esperadasEventos gratuitos costumam ter uma parcela de faltas. Acompanhe a sua própria taxa e aceite um pouco mais de inscrições da próxima vez

Na porta

  1. Na noite anterior, exporte Submissions como CSV e remova os e-mails duplicados, mantendo o mais novo.
  2. Ordene por nome, mantenha name, organisation e lunch e imprima duas cópias para o balcão.
  3. Imprima os crachás a partir da mesma planilha com uma mala direta, usando a coluna name.
  4. Anote à mão quem chegar sem inscrição. Depois do evento, adicione essas pessoas à sua lista só se elas concordarem.

Confira antes de anunciar

  1. Em Allowed domains do formulário, adicione o domínio do seu site, mais localhost enquanto desenvolve. Deixe vazio para aceitar envios de qualquer lugar.
  2. Inscreva-se com o seu próprio e-mail, escolhendo duas sessões.
  3. O e-mail de confirmação chega do seu domínio, listando as duas sessões.
  4. Se você adicionou um webhook, abra o endpoint em Webhooks. A entrega mostra succeeded com a resposta do seu servidor.
  5. Rode a contagem de vagas. Cada uma das suas duas sessões mostra uma vaga ocupada.
  6. Não chegou nada? Mude o filtro de status do painel para Spam. Spam recebe a mesma resposta de sucesso de um envio real.

Pegadinhas

ProblemaO que fazer
422 dizendo para escolher no máximo 3 opçõesAlguém escolheu as quatro sessões. É a regra max_items funcionando; mostre a mensagem do Ikiform ao lado dos checkboxes.
Só uma sessão é armazenada quando alguém escolhe umaDê aos checkboxes o nome sessions[]. Com o campo definido como multi_select, um único valor continua sendo armazenado como lista.
Nenhum e-mail de confirmação, mas a inscrição está no IkiformAbra a entrega no log do endpoint. Um 502 com o status do provedor significa que ele recusou o e-mail, muitas vezes por um domínio de envio não verificado.
O envio está no painel, mas nenhum e-mail ou webhook chegouEle foi armazenado como spam. Spam não envia nada. Abra-o no filtro Spam para ver os motivos e marque-o como não spam para enviar o e-mail e os webhooks dele.
429 rate_limitedUm visitante enviou mais do que o limite de taxa do formulário permite. O Standard permite 5 por minuto por visitante. Espere o Retry-After, ou escolha Relaxed ou Custom para formulários que enviam a partir de um único IP compartilhado.

Perguntas

Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.