@developh/notificacoes
v0.1.0
Published
Email, SMS e WhatsApp numa função: Resend, Twilio e BulkGate, idempotência e horário legal em Portugal. Zero dependências.
Maintainers
Readme
@developh/notificacoes
Email, SMS e WhatsApp numa função. Zero dependências, só fetch.
bun add @developh/notificacoesimport { criarNotificador, chaveIdempotencia } from "@developh/notificacoes";
const notificar = criarNotificador({
email: { fornecedor: "resend", apiKey: process.env.RESEND_API_KEY!, remetente: "Portofino <[email protected]>" },
sms: { fornecedor: "twilio", accountSid: process.env.TWILIO_SID!, authToken: process.env.TWILIO_TOKEN!, remetente: "PORTOFINO" },
whatsapp: { fornecedor: "twilio", accountSid: process.env.TWILIO_SID!, authToken: process.env.TWILIO_TOKEN!, remetente: "+3519xxxxxxxx" },
respeitarHorarioPT: true,
});
await notificar.enviar({
canal: "email", para: reserva.email, assunto: "Reserva confirmada", html, text,
idempotencia: chaveIdempotencia("reserva-cliente", reserva.codigo),
});
// Confirmação imediata é notificação de serviço: passa fora de horas.
await notificar.enviar({ canal: "sms", para: reserva.telefone, texto: "Portofino: mesa confirmada sab 5 set 20:30, 4 pessoas. Codigo PF-7N2K9X.", urgente: true });
// Lembrete da véspera: WhatsApp com fallback para SMS.
await notificar.enviarComFallback([
{ canal: "whatsapp", para: reserva.telefone, template: "HX...", variaveis: { "1": "Tiago", "2": "20:30" } },
{ canal: "sms", para: reserva.telefone, texto: "Portofino: e amanha as 20:30. Para alterar: portofino.pt/reservas/cancelar/PF-7N2K9X" },
]);Fornecedores
| Canal | Fornecedor | Notas |
|---|---|---|
| email | Resend | Idempotency-Key quando passares idempotencia. |
| sms | Twilio | Sender alfanumérico ("PORTOFINO") sem registo em Portugal. ≈ 0,046 €/SMS. |
| sms | BulkGate | ≈ 0,014 €/SMS, API transacional simples. Trocar é mudar a config. |
| whatsapp | Twilio | Templates aprovados pela Meta (Content SID). Utility ≈ 0,0142 €/msg. |
Portugal
respeitarHorarioPT: truerecusa SMS e WhatsApp fora das 9:00–20:00 de Lisboa e aos domingos, exceto mensagens comurgente: true.normalizarTelefonePT("912 345 678")→+351912345678. Números com+de outros países passam tal como estão.segmentosSMS(texto)diz quantos segmentos vais pagar;semAcentosParaSMStira os acentos que forçam UCS-2 (70 caracteres em vez de 160).- Confirmações e lembretes são transacionais: não precisam de consentimento de marketing, mas diz no formulário que o número será usado para mensagens sobre a reserva.
