Each log entry has a status that reflects the current state of the delivery attempt.
Status Values #
| Status | Description |
|---|---|
pending | Delivery has been enqueued but not yet attempted |
delivered | Delivery succeeded (2xx response received) |
failed | Delivery has permanently failed (see failure reasons below) |
retrying | Delivery failed and a retry is scheduled |
What Causes Permanent Failure #
| Response | Behavior |
|---|---|
410 Gone | Endpoint is automatically disabled; delivery marked failed; admin notified |
4xx (except 410) | Permanent failure; no retry scheduled |
5xx or network error | Retry scheduled; after max retries exhausted → permanent failure |
| Max retries reached | Status set to failed; admin notification sent if configured |
Retry Schedule #
| Attempt | Delay After Previous Failure |
|---|---|
| 1st retry | 60 seconds |
| 2nd retry | 5 minutes |
| 3rd retry | 15 minutes |
| 4th retry | 1 hour |
| 5th retry | 6 hours |
Total window: approximately 7.5 hours from first attempt to final failure.
The completed_at Timestamp #
The completed_at field is only set when status reaches a final state: delivered or failed. It is not set while status is retrying.
Test Deliveries #
Test deliveries have is_test = 1. They follow the same status values but are excluded from daily failure digest emails.
Debug Deliveries #
Debug deliveries have is_debug = 1. They are automatically deleted after 24 hours by the daily cleanup cron.
Related Topics #
- Delivery Logs Overview
- Log Retention
- Troubleshooting Failed Deliveries
