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.
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:
- A página do evento sai da página do Eventbrite para o seu próprio site, com o seu design.
- A inscrição sai do checkout do Eventbrite para o seu formulário, que envia ao Ikiform.
- O e-mail de confirmação deixa de ser enviado por você. Um webhook o envia pelo seu próprio provedor de e-mail.
- A capacidade deixa de ser um limite rígido. Você conta as inscrições por sessão e pausa o formulário quando lotar.
- O check-in deixa de ser um app com leitura de QR code. Você imprime uma lista a partir da exportação CSV.
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.
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.nametem o rótulo de crachá, o que traz o nome pelo qual as pessoas querem ser chamadas.lunché umradiocom a opçãoNo lunch, para você encomendar comida só para quem vai comer.updatesé um checkbox desmarcado, armazenado comotrueoufalsenum envio que guarda o seu própriocreated_at. Só adicione pessoas à sua newsletter quando ele fortrue.- Use o formulário de RSVP do guia principal para o markup na sua stack, trocando os campos por estes.
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.
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;
}
}verifyWebhookconfere a assinatura, então ninguém mais consegue fazer o seu domínio enviar e-mails.Idempotency-Keyusa owebhook-idda 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
502faz 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:
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ção | O que fazer |
|---|---|
| Um workshop lotado | Remova a opção dele do formulário e da definição de campos, e avise na página |
| O dia todo lotado | Pause form e troque o formulário por um endereço de e-mail para a lista de espera |
| Alguém cancela | A pessoa responde ao e-mail de confirmação. Exclua o envio dela para que a contagem libere a vaga |
| Faltas esperadas | Eventos 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
- Na noite anterior, exporte Submissions como CSV e remova os e-mails duplicados, mantendo o mais novo.
- Ordene por nome, mantenha
name,organisationelunche imprima duas cópias para o balcão. - Imprima os crachás a partir da mesma planilha com uma mala direta, usando a coluna
name. - Anote à mão quem chegar sem inscrição. Depois do evento, adicione essas pessoas à sua lista só se elas concordarem.
Confira antes de anunciar
- Em Allowed domains do formulário, adicione o domínio do seu site, mais
localhostenquanto desenvolve. Deixe vazio para aceitar envios de qualquer lugar. - Inscreva-se com o seu próprio e-mail, escolhendo duas sessões.
- O e-mail de confirmação chega do seu domínio, listando as duas sessões.
- Se você adicionou um webhook, abra o endpoint em Webhooks. A entrega mostra
succeededcom a resposta do seu servidor. - Rode a contagem de vagas. Cada uma das suas duas sessões mostra uma vaga ocupada.
- 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
| Problema | O que fazer |
|---|---|
422 dizendo para escolher no máximo 3 opções | Algué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 uma | Dê 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 Ikiform | Abra 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 chegou | Ele 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_limited | Um 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
Para um evento gratuito em que você consegue contar as vagas e imprimir uma lista, sim. Para ingressos pagos, limites rígidos de vagas, listas de espera ou check-in por QR code, uma plataforma de ingressos faz isso e o Ikiform não.
Você mesmo envia. Adicione um webhook do Ikiform que chama a API do seu provedor de e-mail, ou que se conecta por uma ferramenta de automação, e envie a confirmação pelo seu próprio domínio.
Não automaticamente. Conte as inscrições por sessão com um script curto ou uma planilha e remova do formulário a opção de um workshop quando ele lotar.
Não. Todo envio aceito é armazenado. Uma repetição idêntica em até 24 horas aumenta a pontuação de spam, mas não é spam por si só, então remova os duplicados por e-mail na sua lista, no banco de dados ou na exportação CSV.
Não, não há plano gratuito. Testar é grátis: você pode enviar 50 envios de teste por mês a partir de localhost antes de pagar. Para entrar no ar, o Pro começa em US$ 6/mês para 500 envios, ou você pode pagar uma vez 10.000 envios por US$ 49 ou 50.000 envios por US$ 149, com créditos que nunca expiram.
Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.