# 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.

Publicado em 2026-10-25 · https://ikiform.com/pt-br/guides/event-registration/without-eventbrite

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:

Diagrama: Quais trabalhos saem do Eventbrite para a sua própria estrutura, e quem faz cada um

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:

Formulário: Community day registration

- **Nome para o crachá** (`name`, text, obrigatório)
- **E-mail** (`email`, email, obrigatório)
- **Sessões de que você vai participar** (`sessions`, multi_select, obrigatório)
- **Empresa ou grupo** (`organisation`, text)
- **Almoço** (`lunch`, radio, obrigatório)
- **Quero receber e-mails sobre os próximos dias comunitários** (`updates`, checkbox)

`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](https://ikiform.com/pt-br/guides/event-registration.md#form) 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](https://ikiform.com/pt-br/docs/webhooks.md). 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`:

```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](https://ikiform.com/blog/form-submissions-to-zapier.md) ou o [Make](https://ikiform.com/blog/form-submissions-to-make.md) 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`:

```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çã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

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

| 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

### Um formulário de inscrição basta no lugar do Eventbrite?

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.

### Como quem se inscreve recebe um e-mail de confirmaçã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.

### Posso limitar as vagas de cada workshop?

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.

### O Ikiform remove envios duplicados?

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.

### O Ikiform é gratuito?

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.

## Mais guias

- [Inscrição em eventos](https://ikiform.com/pt-br/guides/event-registration.md): Receba confirmações de presença na página do seu evento: formulário, limite de convidados, contagem honesta, encerramento ao lotar e lista de check-in, sem app de ingressos.
- [Inscrição de voluntários](https://ikiform.com/pt-br/guides/event-registration/volunteer-signup.md): Um formulário de inscrição de voluntários em que as pessoas escolhem turnos, com telefone para o dia, e um script que mostra os turnos desfalcados e monta a escala.
- [RSVP de casamento](https://ikiform.com/pt-br/guides/event-registration/wedding-rsvp.md): Um formulário de RSVP para um site de casamento feito por você: uma resposta por convite, uma refeição por convidado, um prazo e a lista de quem não respondeu.
