Cobrança previsível
Veja o preço por canal antes de mandar. Planeje com o financeiro sem surpresa no fim do mês.
Integrar canal por canal vira caro e lento. Com templates, você aprova o conteúdo uma vez e escolhe onde ele vai: SMS, WhatsApp, Telegram, e-mail, push ou RCS. No modelo, cada canal tem interruptor (enabled) e payload próprio; na API, a resposta traz tudo dentro de sms, whatsapp, telegram e email — sem campos planos misturados. Um painel só mostra se chegou, se falhou e quanto custou.
Um modelo · Vários canais · Dados por pessoa · Um painel · Menos integração solta
Quem recebe quer o aviso no celular, no e-mail ou no WhatsApp. Você liga só os canais que precisa e preenche o texto de cada um. No envio, a lista channels só pode incluir canais habilitados naquele template; nome, pedido e link entram por variáveis. No painel: entregue, erro ou custo por canal.
O custo depende dos canais usados no disparo. WhatsApp e e-mail R$ 0,05; push R$ 0,01; SMS R$ 0,12; RCS R$ 0,25 — tudo somado com transparência no painel.
Veja o preço por canal antes de mandar. Planeje com o financeiro sem surpresa no fim do mês.
Hoje WhatsApp, amanhã SMS, ou os dois juntos. Mesmo fluxo. Sem abrir um projeto novo para cada canal.
Escolha data e hora. O sistema envia na janela certa. Se a rede falhar, há nova tentativa automática.
Exemplo: lembrete no celular e confirmação no e-mail. Uma regra clara em vez de vários fluxos espalhados no código.
Status e gasto por canal na mesma tela. Ninguém precisa juntar planilha de cada provedor.
Você aprova um modelo. Cada cliente recebe o nome e os dados dele. Sem copiar e colar.
Do pedido de envio ao resultado final fica registrado. Suporte e auditoria sabem o que aconteceu.
Passou a priorizar WhatsApp em vez de e-mail? Ajuste onde manda. O que já está pronto continua servindo.
Usa mais de um canal? Então precisa ver custo e entrega separado para cada um. Só assim dá para ver o que funciona e cortar o que não vale a pena.
Na mesma campanha, compare SMS e e-mail em reais. Decisão com dado, não com feeling.
Veja taxa de sucesso por canal e por lista. Ajuste mensagem ou público com precisão.
Créditos e consumo no mesmo lugar. Acabou a soma manual por canal.
Cada envio com histórico
Do início ao fim fica registrado. O suporte abre o painel e explica ao cliente o que ocorreu. Sem caixa preta.
Combine lembrete no WhatsApp e e-mail no horário que o cliente espera. O fuso é o do seu workspace — não manda de madrugada sem querer.
Agende no fuso do Brasil (ou do seu workspace). Acabou confusão com UTC.
Quem agenda pela tela e quem agenda por integração usam o mesmo motor.
Black Friday ou folha de pagamento: você programa; a fila segura o pico.
O modelo é fixo e aprovado. Nome, pedido e link vêm do seu sistema na hora do envio. Cada um recebe a versão dele. Menos erro humano.
O mesmo pedido vira linha curta no SMS e texto longo no e-mail. Uma fonte de verdade.
Defina texto padrão se algum campo vier vazio. A jornada não quebra no meio.
Mais canais não precisam virar mais spam. Separe o que é oferta do que é cobrança ou aviso obrigatório. Respeite opt-out e preferências.
Promoção, transacional e cobrança ficam claros. Menos risco de mandar o tipo errado para a pessoa errada.
O mesmo contato no WhatsApp, Telegram, SMS e e-mail com histórico ligado. Menos contradição entre canais.
Seu sistema dispara uma vez. A Notifique coloca na fila, tenta de novo se precisar e avisa o seu CRM. Você não gerencia cada canal na mão.
Quando entrega ou falha, seu backend ou CRM pode ser avisado. Menos consulta manual.
Quem programa usa API ou SDK. Quem opera usa a tela. Os dois veem o mesmo template e o mesmo resultado.
Primeiro você define o template com cada canal em { enabled, payload }. Depois dispara com channels contendo só um subconjunto dos canais ligados (ex.: SMS e e-mail, sem WhatsApp). Dois códigos diferentes, um gatilho no seu sistema. Detalhes na documentação.
Passo 1 — Criar template (canais e conteúdo por bloco)
// 1) Criar o template — cada canal: { enabled, payload }// A API devolve enabledChannels e blocos sms | whatsapp | telegram | email (sem smsContent/whatsappContent no root).await fetch("https://api.notifique.dev/v1/templates", { method: "POST", headers: { "Content-Type": "application/json", Authorization: "Bearer sk_live_xxxxx", }, body: JSON.stringify({ name: "otp_duplo_login", category: "AUTHENTICATION", language: "pt_BR", sms: { enabled: true, payload: { content: "Olá {{nome}}, código SMS: {{otp_mobile}} (válido {{validade_min}} min).", }, }, whatsapp: { enabled: true, payload: { content: "Olá {{nome}}, código no WhatsApp: {{otp_mobile}}", }, }, telegram: { enabled: false, payload: {} }, email: { enabled: true, payload: { subject: "Seu código de acesso", html: "<p>Olá {{nome}}, código: <strong>{{otp_web}}</strong></p>", }, }, }),});Passo 2 — Enviar (channels ⊆ template)
// Backend Node/TS — 2) Disparar (channels ⊆ canais habilitados no template)const otpMobile = String(Math.floor(100000 + Math.random() * 900000));const otpWeb = String(Math.floor(100000 + Math.random() * 900000));await otpStore.save({ userId: "usr_123", mobileOtp: otpMobile, webOtp: otpWeb, expiresAt: new Date(Date.now() + 5 * 60 * 1000),});const res = await fetch("https://api.notifique.dev/v1/templates/send", { method: "POST", headers: { "Content-Type": "application/json", Authorization: "Bearer sk_live_xxxxx", }, body: JSON.stringify({ template: "otp_duplo_login", // Só canais com enabled: true no template (ex.: não inclua "telegram" se estiver desligado) channels: ["sms", "email"], variables: { nome: "João", otp_mobile: otpMobile, otp_web: otpWeb, validade_min: "5", }, // instanceId: obrigatório se "whatsapp" ∈ channels e não houver instância padrão // telegram: { instanceId: "..." } — se "telegram" ∈ channels // from — se e-mail ∈ channels e não houver domínio padrão }),});if (!res.ok) throw new Error("Falha ao enviar");const payload = await res.json();console.log(payload.data?.messageIds);A regra de ‘está certo ou errado’ continua no seu produto. A Notifique só entrega a mensagem.
type ConfirmInput = { userId: string; mobileCode: string; webCode: string };export async function confirmOtpDual(input: ConfirmInput) { const current = await otpStore.getByUserId(input.userId); if (!current) throw new Error("OTP não encontrado"); if (new Date() > current.expiresAt) throw new Error("OTP expirado"); const mobileOk = await verifyHash(input.mobileCode, current.mobileOtpHash); const webOk = await verifyHash(input.webCode, current.webOtpHash); if (!mobileOk || !webOk) throw new Error("Códigos inválidos"); await otpStore.consume(input.userId); return { ok: true, authenticatedAt: new Date().toISOString() };}Quer um painel e um fluxo para SMS, WhatsApp, e-mail, push e RCS?