Lista de espera para um novo SaaS

Lista de espera para um novo SaaS8 min de leitura

Como montar uma lista de e-mails pré-lançamento para um lançamento no Product Hunt

Colete uma lista semanas antes do Product Hunt, marque cada inscrição pelo canal e envie o e-mail do dia do lançamento em duas ondas, no ritmo da virada do horário do Pacífico.

Preet SutharFundador, Ikiform

Comece a coletar e-mails na sua própria página de quatro a seis semanas antes do lançamento, com um campo oculto de origem para saber de qual canal veio cada inscrição. Peça às pessoas que optem por receber um e-mail no dia do lançamento, depois exporte a lista na semana anterior e divida-a em dois envios: um logo depois que o dia do Product Hunt começa, à 0h01 no horário do Pacífico, e outro para as Américas pela manhã delas.

Um lançamento no Product Hunt tem data fixa e uma janela de 24 horas. As pessoas mais propensas a testar seu produto e deixar um comentário bem pensado são as que pediram para ter notícias suas, então a lista importa mais que o post de lançamento. Esta página mostra o que muda quando a lista é montada para esse único dia.

O que muda numa lista para o Product Hunt

  • O prazo é fixo. Uma lista de espera normal pode esperar até o produto ficar pronto. Aqui, a lista precisa ser exportada, limpa e carregada na sua ferramenta de e-mail antes de uma data que você escolheu semanas atrás.
  • O dia segue o horário do Pacífico. Os lançamentos entram no ar à 0h01 PT e disputam o ranking daquele dia. Sua lista está em todos os fusos horários, então um único envio num único horário pega metade dela dormindo.
  • O pedido é feedback, não votos. As regras do Product Hunt proíbem pedir upvotes, e fazer isso pode desclassificar um lançamento. Peça à lista que teste o produto e comente o que mudaria. Está dentro das regras, e comentários causam melhor impressão que um número de qualquer jeito.
  • O dia do lançamento traz um pico. Os visitantes do Product Hunt chegam ao seu site e se inscrevem com minutos de diferença. Limites do formulário que não importaram por semanas podem importar por algumas horas.
Uma lista de lançamento no Product Hunt, da primeira inscrição ao dia seguinteAntesDia do lançamento, horário do Pacífico6 a 4semanasantespágina noar, refpor canal1semanaantesexportar,deduplicar,dividirondasavésperaaumentaro limitedoformulário12:01a.m.lançamentoentra noaronda 1Europa,África,Ásia,Oceania6 a.m.onda 2:asAméricasdiaseguinteagradecer,compararrefsdivulgue toda semanaminutosUma lista de lançamento no Product Hunt, da primeira inscrição ao dia seguinteAntesDia do lançamento, horário do Pacífico6 a 4 semanas antespágina no ar, ref por canal1 semana antesexportar, deduplicar, dividirondasa vésperaaumentar o limite do formulário12:01 a.m.lançamento entra no aronda 1Europa, África, Ásia, Oceania6 a.m.onda 2: as Américasdia seguinteagradecer, comparar refsdivulgue toda semanaminutos
  1. De quatro a seis semanas antes, a página entra no ar com o formulário, e cada canal em que você a divulga ganha o próprio valor de ref.
  2. Uma semana antes, exporte a lista, remova os duplicados e divida quem optou por receber em duas ondas, por país.
  3. Na véspera, aumente o limite do formulário inteiro para o tráfego do lançamento não ser recusado.
  4. À 0h01 no horário do Pacífico, o lançamento entra no ar.
  5. Minutos depois, envie a onda 1 para todos fora das Américas, onde é manhã ou tarde.
  6. Por volta das 6h no horário do Pacífico, envie a onda 2 para as Américas.
  7. No dia seguinte, agradeça à lista e compare quais valores de ref trouxeram as pessoas que se cadastraram e ficaram.
O Ikiform registra o país de cada inscrição, então a divisão não precisa de nenhuma pergunta extra no formulário. Países desconhecidos vão para a segunda onda.

O formulário

Comece pelo formulário só com e-mail do guia principal e adicione duas coisas: um checkbox que pede o e-mail do dia do lançamento e um ref oculto preenchido a partir do link pelo qual as pessoas chegaram.

index.html
<form id="launch-list" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required>
  <label>
    <input name="launch_reminder" type="checkbox" value="true">
    Email me the morning we launch on Product Hunt
  </label>
  <input type="hidden" name="ref" value="direct">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button>Get early access</button>
</form>

<script>
  const params = new URLSearchParams(location.search);
  const ref = params.get("ref") || params.get("utm_source");
  if (ref) {
    document.querySelector('#launch-list [name="ref"]').value = ref.toLowerCase().replace(/[^a-z0-9_-]/g, "").slice(0, 40);
  }
</script>
  • O checkbox começa desmarcado. Um e-mail no dia do lançamento é algo separado do acesso antecipado, então as pessoas optam por ele. O Ikiform armazena true ou false com o horário da inscrição.
  • O script copia ?ref= ou ?utm_source= para o input oculto e remove tudo o que não for letra, dígito, - ou _. Sem nenhum dos dois, ref continua direct.
  • O Product Hunt costuma adicionar ref=producthunt aos links da sua página de lançamento, então as inscrições do dia do lançamento se marcam sozinhas.

Adicione a definição de campos na aba Fields do formulário. O Ikiform passa a recusar envios sem e-mail, armazena o checkbox como true ou false de verdade e limita ref a 40 caracteres para ninguém conseguir encher o campo.

Campos
{
  "version": 1,
  "title": "Launch list",
  "fields": [
    { "id": "email", "type": "email", "label": "Email", "required": true },
    { "id": "launch_reminder", "type": "checkbox", "label": "Email me the morning we launch on Product Hunt" },
    { "id": "ref", "type": "text", "label": "Source", "validation": { "max_length": 40 } }
  ]
}

Um ref por canal

Defina os valores antes de divulgar o link em qualquer lugar e use-os sempre:

Onde você divulgaLinkRef armazenado
Seus posts no X ou no Blueskyexample.com/?ref=xx
LinkedInexample.com/?ref=linkedinlinkedin
Um post numa comunidade, como o Indie Hackersexample.com/?ref=ihih
Sua newsletter ou blogexample.com/?utm_source=newsletternewsletter
Sua página de lançamento no Product HuntAdicionado pelo Product Huntproducthunt

Prepare o formulário para o tráfego do lançamento

Os limites padrão servem para uma página de pré-lançamento tranquila. O dia do lançamento não é tranquilo. Cada visitante pode enviar 5 por minuto, o que é bastante, mas o formulário inteiro tem limite de 300 por minuto. Um lançamento na primeira página pode trazer mais inscrições do que isso num minuto movimentado.

  • Na véspera, abra as configurações do formulário e escolha um limite de taxa Custom com um limite maior para o formulário. Volte ao anterior depois da semana do lançamento.
  • Se você vai fazer uma demonstração num meetup ou num coworking, todo mundo compartilha um IP. Escolha Relaxed para esse dia.
  • Um envio recusado recebe 429 rate_limited e um header Retry-After. O formulário HTML simples mostra a página de erro do Ikiform com um link de volta.
  • Ligue a verificação humana em Spam check se o dia do lançamento trouxer bots. O formulário simples não precisa de mudança para isso; veja proteção contra spam.

Divida o e-mail de lançamento em duas ondas

Uma semana antes do lançamento, leia a lista pela API REST e divida-a. Este script mantém a inscrição mais nova por e-mail, descarta quem não marcou o checkbox e grava dois arquivos CSV pelo país que o Ikiform registrou. Ele precisa de uma chave secreta com submissions:read.

waves.mjs
import { writeFileSync } from "node:fs";
import { createClient } from "@ikiform/sdk";

const AMERICAS = new Set(["US", "CA", "MX", "BR", "AR", "CO", "CL", "PE", "EC", "UY", "PY", "BO", "VE", "GT", "CR", "PA", "DO", "PR"]);
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY });
const seen = new Set();
const waves = { midnight: [], morning: [] };

for await (const submission of ikiform.submissions.iterate({ formId: "frm_xxxxxxxxxxxxxxxx", status: "received", limit: 100 })) {
  const email = String(submission.fields.email ?? "").trim().toLowerCase();
  if (!email || seen.has(email)) continue;
  seen.add(email);
  if (submission.fields.launch_reminder !== true) continue;
  const country = submission.meta.country ?? "";
  const wave = !country || AMERICAS.has(country) ? waves.morning : waves.midnight;
  wave.push([email, String(submission.fields.ref ?? "").replaceAll(",", ""), country].join(","));
}

for (const [name, rows] of Object.entries(waves)) {
  writeFileSync(`wave-${name}.csv`, ["email,ref,country", ...rows].join("\n"));
  console.log(`${name}: ${rows.length} people`);
}
  • As inscrições chegam da mais nova para a mais antiga, então uma pessoa que se inscreveu duas vezes é avaliada pela resposta mais recente. Se ela desmarcou o checkbox na segunda vez, fica de fora.
  • Importe os dois arquivos na sua ferramenta de e-mail como segmentos separados e agende: a onda 1 para alguns minutos depois da 0h01 no horário do Pacífico, a onda 2 para por volta das 6h no horário do Pacífico.
  • Rode mais uma vez na véspera do lançamento para pegar a última semana de inscrições.

O e-mail do dia do lançamento

Envie pela sua ferramenta de e-mail, para que descadastros e devoluções sejam tratados. Comece pelo produto, coloque o link da página de lançamento em segundo lugar e peça um comentário, não um voto:

E-mail do dia do lançamento
Subject: We're on Product Hunt today

Hi,

You joined the Acme list a few weeks ago. Today we launched on Product Hunt,
and the product is open to everyone on this list first.

Try it: https://acme.example/start
Our launch page: https://www.producthunt.com/products/acme

If you have a minute, tell us on the launch page what you'd change.
Honest comments help more than anything else today.

Ada, founder of Acme
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. Se você quer um e-mail de boas-vindas no momento em que alguém entra, encaminhe as inscrições por webhook para a sua ferramenta de e-mail; o guia principal mostra o relay.

O dia seguinte

Exporte a lista de novo com Export CSV, filtrada pelos últimos 7 dias, e conte as inscrições por ref. Os canais que trouxeram pessoas que depois fizeram login são onde vai o seu próximo post de lançamento. Mande a quem entrou no dia do lançamento um agradecimento curto pela sua ferramenta de e-mail; essas pessoas encontraram você pelo Product Hunt e ainda não tiveram notícias suas.

Confira se funciona

Faça isto uma semana antes do lançamento, não na noite anterior.

  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. Abra a página com ?ref=x e envie. O envio mostra ref como x e launch_reminder como false.
  3. Envie de novo com o checkbox marcado e sem query string. ref mostra direct e launch_reminder mostra true.
  4. Abra Submissions no painel. O novo envio está lá com todos os campos que você enviou.
  5. Rode o script das ondas e confira se cada endereço de teste está no arquivo esperado para o país dele.
  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
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.
422 com Unknown field para utm_source ou outro parâmetroSó ref está definido. O script lê utm_source para dentro de ref em vez de enviá-lo, então confira se você não adicionou outro input oculto.
Toda inscrição tem ref definido como directO script roda antes de o formulário existir, ou o id do formulário é diferente. Coloque o script depois do formulário e mantenha id="launch-list".
Um país está vazio na exportaçãoO Ikiform não conseguiu saber onde o visitante estava. O script coloca países vazios na onda da manhã, que pega as Américas acordadas e todo o resto mais tarde no dia.
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.

Perguntas

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