Mensagens transacionais e cascatas
Mensagens transacionais são confirmações de pedido, códigos de acesso e avisos de entrega. O cliente está esperando por elas, por isso saem imediatamente e por uma fila separada: uma campanha grande não as atrasa. A cascata envia uma mesma mensagem por vários canais, um após o outro. Por exemplo, primeiro WhatsApp e, se não for entregue em 2 minutos, SMS.
Você pode enviar essa mensagem a partir de uma jornada ou do seu servidor pela API.
Modelo transacional
Para que uma mensagem seja considerada transacional, marque Mensagem transacional no modelo dela. Essa mensagem é enviada sem verificar a inscrição, os limites de frequência e o horário silencioso. Os e-mails pelo serviço de e-mail do OneTrace.ru são enviados sem aquecimento e em um fluxo separado, sem link de cancelamento de inscrição nos cabeçalhos.
Não marque publicidade dessa forma: isso viola os direitos dos destinatários e prejudica a reputação do remetente.
Mesmo uma mensagem transacional não é enviada se o canal do destinatário estiver fechado:
| Canal | Quando está fechado |
|---|---|
| um e-mail para o endereço voltou com erro permanente (a caixa não existe) | |
| SMS, WhatsApp | o provedor informou que o número não existe; o cliente escreveu “stop” no WhatsApp |
| Telegram | o cliente enviou /stop ao bot ou o bloqueou |
| Viber | o cliente cancelou a inscrição no bot |
Essa mensagem recebe o status “Ignorada” com o motivo “canal bloqueado para o destinatário”. O canal é reaberto quando o cliente se inscreve de novo, por exemplo, toca em “Start” no bot. Uma reclamação de spam não fecha o canal: os e-mails sobre pedidos para esse endereço continuam chegando.
Envio pela API
Seu servidor envia a mensagem com a requisição POST /api/v1/messages. É necessária uma chave secreta com a permissão “Envio de mensagens avulsas”; veja Chaves de API.
curl -X POST https://cdp.onetrace.ru/api/v1/messages \
-H "Authorization: Bearer $CDP_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-A-1001" \
-d '{
"identity": {"type": "email", "value": "anna@example.com"},
"template_id": 12,
"traits": {"first_name": "Ana"},
"data": {"order_id": "A-1001", "amount": 4990}
}'
| Campo | O que significa |
|---|---|
identity |
Destinatário: tipo e valor do identificador — email, phone, user_id, telegram_chat_id e outros. Se o perfil não existir, ele é criado |
template_id |
Modelo da mensagem. O id dele aparece no endereço da página do modelo |
integration_id |
Integração do canal do modelo. Necessária apenas se o canal tiver várias integrações ativas |
traits |
Atributos que são gravados no perfil antes do envio. No modelo: {{ traits.first_name }} |
data |
Dados apenas desta mensagem. No modelo: {{ context.data.order_id }} |
A resposta 202 contém o id da mensagem e o status dela. O status atual é retornado por GET /api/v1/messages/{id}: queued, sent, delivered, failed, skipped e outros, com o motivo da omissão ou do erro.
- Repetir é seguro. Uma requisição com o mesmo cabeçalho
Idempotency-Keyretorna a mensagem já criada, e a segunda não é enviada. Use o número do pedido ou o id da operação. - Limite por destinatário: 20 mensagens por hora pela API. Se for excedido, chega
429com o cabeçalhoRetry-After. - Um modelo comum sem a marcação “Transacional” também pode ser enviado pela API. Nesse caso, todas as regras de mensagens são verificadas.
Na biblioteca PHP pronta, isso é $onetrace->messages()->send(Identity::email('anna@example.com'), 12, ['data' => [...]], 'order-A-1001'); no pacote para Laravel, messages()->send(...).
Cascata na jornada
Adicione à jornada o nó Envio em cascata do grupo “Ações”. No campo Canais em ordem, defina de 2 a 5 etapas. Para cada etapa, indique:
- Integração e Modelo do canal.
- Aguardar — o que considerar sucesso: “enviado”, “entregue” ou “lido”.
- Tempo de espera — para “entregue” e “lido”; por padrão, 15 minutos.

A cascata passa para a próxima etapa se:
- o perfil não tem endereço ou número para o canal, ou o canal dele está fechado — a etapa é pulada imediatamente e a mensagem não é criada;
- a mensagem não saiu: erro de envio ou omissão pelas regras de mensagens;
- o provedor informou que não houve entrega;
- dentro do tempo de espera não chegou a confirmação de entrega ou de leitura.
Nem todos os canais permitem aguardar a entrega e a leitura:
| Aguardar | Canais |
|---|---|
| enviado | todos |
| entregue | SMS, WhatsApp, Viber, Telegram, webhook; e-mail apenas pelo serviço de e-mail do OneTrace.ru, não por um servidor SMTP próprio |
| lido | e-mail, WhatsApp, Viber |
O nó tem duas saídas: chegou — a mensagem de uma das etapas atingiu o objetivo; falhou — nenhum canal funcionou. Enquanto a cascata está em andamento, o participante aguarda no nó.
O envio em cascata entrega uma mesma mensagem. Os modelos de jornada do tipo “Carrinho: push → e-mail → SMS” funcionam de outro jeito: neles, mensagens diferentes saem com pausas até o cliente fazer um pedido.
Cascata pela API
Em vez de template_id, envie steps — as mesmas etapas do nó da jornada:
{
"identity": {"type": "phone", "value": "+79991234567"},
"steps": [
{"integration_id": 3, "template_id": 21, "wait_for": "delivered", "timeout": {"amount": 2, "unit": "minute"}},
{"integration_id": 4, "template_id": 22, "wait_for": "sent"}
],
"data": {"code": "482913"}
}
wait_for aceita sent, delivered ou opened; as unidades de timeout são minute, hour, day, week. A resposta 202 contém o id da cascata, e GET /api/v1/messages/cascades/{id} retorna o estado dela:
status—running,reachedoufailed;- a etapa atual
step; - o canal que funcionou —
reached_channel; - as mensagens das etapas
messages.
Plano
As mensagens transacionais e o envio pela API estão disponíveis em todos os planos. A cascata está disponível a partir do plano “Crescimento”; veja Plano e cobrança. No “Inicial”, o nó na paleta do editor aparece com um cadeado, e a API responde 402. Se o plano for rebaixado, nas jornadas já em funcionamento é enviada apenas a primeira etapa da cascata.