News por dentro — a anatomia de uma newsletter feita de itens, edições e envios
News por dentro
É fácil olhar para um produto de newsletter e enxergar uma caixa onde você escreve um email e clica em "enviar para a lista". A maioria das ferramentas de fato é essa caixa. O produto News da LaunchWithAgency não é — e a diferença não está na interface, está no modelo de dados.
News separa cinco conceitos que ferramentas mais simples confundem em um só: a lista, o assinante, o item, a edição e o envio. Este artigo percorre os cinco, explica por que cada um é uma entidade própria, e mostra como essa separação transforma a newsletter de uma caixa de texto em um sistema editorial.
A lista: o canal
Uma lista (newsletter_lists) é o canal — a "Tech Weekly", a "Atualizações do Produto". Ela tem nome, descrição, um remetente (fromEmail, fromName) e um idioma. Você pode ter várias listas: uma por audiência, uma por idioma, uma por cliente se você é uma agência.
Dois detalhes do schema dizem muito sobre a filosofia. Primeiro, o slug da lista é único por dono, não globalmente — dois usuários da plataforma podem cada um ter uma lista chamada growth, porque a URL pública é qualificada pelo handle do dono. Segundo, existe a flag publicArchive: uma lista pode, ou não, expor suas edições passadas como páginas web públicas. A newsletter não é só um email que evapora na caixa de entrada — ela pode ser um arquivo navegável.
O assinante: uma linha que tem estado
Um assinante (newsletter_subscribers) pertence a uma lista e — este é o ponto — tem um estado. A coluna status carrega pending, active ou unsub. A coluna confirmedAt marca quando ele confirmou; unsubscribedAt, quando saiu. Há ainda source, registrando de onde ele veio, e locale, o idioma dele.
Esse estado é o que torna o double opt-in uma propriedade do dado, não um recurso à parte. Quando alguém se inscreve, nasce uma linha pending. O produto Emails dispara um email de confirmação. Só quando a pessoa clica no link a linha vira active e ganha um confirmedAt. Um assinante pending não é um assinante de verdade ainda — e o schema sabe disso. Ninguém é incluído num envio sem ter dito sim de forma verificável.
> O assinante não é um endereço de email numa lista. É um registro com um ciclo de vida — pendente, ativo, cancelado — e cada transição fica gravada.
O item: a unidade curada
Aqui está a entidade que separa News de uma caixa de texto. Um item (newsletter_items) é uma unidade pequena e curada de conteúdo: um link, uma ideia, uma nota curta. Ele tem título, uma URL opcional, um corpo em Markdown.
Por que isso é uma entidade própria? Porque a curadoria de uma newsletter não acontece toda de uma vez, no momento de escrever a edição. Ela acontece ao longo da semana — você encontra um link na terça, anota uma ideia na quinta. O item tem um status próprio: unassigned, enquanto ele está só no seu acervo, e in_issue, quando já pertence a uma edição. News te dá um acervo de itens que você coleta no seu ritmo, e dos quais você monta a edição depois.
A edição: o email que sai
Uma edição (newsletter_issues) é o email concreto que vai para a lista — a "Edição #42". Ela tem um título, um slug, e dois campos que envolvem os itens: introMd e outroMd, a abertura e o fechamento que emolduram a curadoria.
A relação entre edição e itens é onde o modelo brilha. Ela não é uma cópia — é uma tabela de junção, newsletter_issue_items, que liga uma edição aos itens dela com uma position, definindo a ordem. Isso significa que um item é reutilizável, que a ordem da edição é editável sem reescrever nada, e que montar uma edição é organizar itens, não digitar um email do zero. A edição também tem estado: draft, scheduled, sent — e quando enviada, registra sentAt e sentCount.
O envio: o registro por destinatário
A quinta entidade é a mais granular. Um envio (newsletter_sends) é uma linha por destinatário, por edição. Quando a Edição #42 sai para 800 assinantes, nascem 800 linhas em newsletter_sends — cada uma com o assinante, o status, e os campos openedAt e clickedAt.
Isso é o que transforma "enviei a newsletter" em dados. Você não tem um número agregado solto; você tem o registro individual de cada envio, de qual edição para qual assinante, com o que aconteceu depois. É a base sobre a qual qualquer métrica honesta de engajamento se constrói.
Por que separar cinco conceitos é o produto
Some as cinco entidades e repare no que você tem: uma lista que é um canal real com arquivo público; assinantes com ciclo de vida e opt-in verificável; um acervo de itens que você curou ao longo do tempo; edições que são itens organizados, não texto rescrito; e um log de envio por destinatário.
Isso não é uma caixa de "escrever e enviar". É um sistema editorial. E ele é deliberadamente o "básico bem-feito" — News não tenta ser uma plataforma de automação de marketing gigante. Ele faz o que uma newsletter precisa, com um modelo de dados que respeita como a curadoria realmente funciona, sem o overhead de uma ferramenta dedicada.
E, como tudo na LaunchWithAgency, ele vive no mesmo banco que os outros quatro produtos. O assinante de News é a mesma linha que o lead capturado em Pages. A edição enviada deixa rastro no mesmo lugar que Flows consegue ler. A newsletter não é uma ilha — é uma das cinco faces do mesmo sistema.