Sending again after seeing only acceptance can create a duplicate message. Trace the first send through its later events before deciding to retry.
Keep the message identifier returned by your send request. It connects the initial acceptance to later events about that message.
What happens between accepted and delivered?
Email passes through preparation. SMS messages pass through handover to a mobile carrier.
You can track your Bird sends through these event types:
| Channel | Event | What happened |
|---|---|---|
email.accepted | Bird accepted the send and is preparing it, once per requested recipient. | |
email.processed | Bird prepared the message for delivery to the recipient's mail server. | |
email.delivered | The recipient's mail server accepted the message. | |
| SMS | sms.accepted | Bird accepted the send request and queued it for processing. |
| SMS | sms.sent | Bird handed the message to the carrier. |
| SMS | sms.delivered | The carrier reported delivery to the recipient handset. |
Compare event times in timestamp to locate a delay. Webhook arrival times include delivery delays of their own.
For email, subtract acceptance time from preparation time to measure preparation inside Bird. The interval after preparation also includes waiting to reach the receiving server.
For SMS, subtract acceptance time from carrier handover time to measure the time before handover. The interval from handover to delivery measures the remaining delivery time.
For example, an SMS accepted at noon and handed over two seconds later spent two seconds before carrier handover. If delivery follows eight seconds later, the total is ten seconds.
Why is it still not delivered?
The message may still be waiting. A later event may instead report a failed delivery.
An acceptance event alone cannot distinguish those outcomes. Read the later events for the same message before deciding whether to send it again.
Email reports these outcomes:
email.deferredmeans delivery is delayed after a temporary failure. Bird retries, so the message can still be delivered or bounce later.email.bouncedmeans the receiving server rejected delivery.email.rejectedmeans Bird refused the message before a delivery attempt. Investigate the rejection reason before changing the recipient's mail-server settings.
SMS uses a different set:
sms.undeliveredreports a non-permanent delivery failure from the carrier.sms.failedreports a permanent delivery failure.sms.rejectedmeans Bird refused the message before carrier handover.sms.expiredmeans the message's validity period elapsed before delivery.
Read the error accompanying a failed outcome to identify the cause. Carrier filtering of SMS explains one possible cause.
Is there one lifecycle I can learn?
Each channel has its own sequence of delivery states.
Email servers can ask a sender to try again later. SMS carriers can stop trying when a message expires. Those outcomes require different recovery actions.
WhatsApp and voice also report their own event types. Their event guides describe the relevant states: email, SMS, WhatsApp and voice.
Can a delivered message stop being delivered?
An email can move from delivered to bounced after the receiving mail server reports a later delivery failure.
The server first accepts the message over SMTP. It can report a failure separately after that exchange has ended.
Bird records the report as email.out_of_band_bounce. When the report is classified as a bounce, the recipient's status moves from delivered to bounced. For a hard bounce, Bird also suppresses the address to block later sends because the failure is permanent.
An auto-reply can appear on the timeline without changing the delivery status. The report's classification determines whether the earlier acceptance is retracted.
Keep delivery status updateable after a successful event. Webhooks can arrive out of order, so compare event timestamps before applying a change that would overwrite newer state.
In short
Acceptance confirms the send request.
Bird begins preparing the message after acceptance. The event does not confirm arrival at a mail server or handset.
Preparation and handover are different boundaries.
Email reports preparation with email.processed. SMS reports carrier handover with sms.sent.
Failures have channel-specific meanings.
Email can be deferred, bounced or rejected. SMS distinguishes undelivered, failed, rejected and expired outcomes.
Email delivery can be followed by a bounce.
A later bounce report can move an email recipient from delivered to bounced. An auto-reply leaves the delivery status unchanged.