Repository navigation
Failed Download Notifications
This page explains how PigeonPod sends failed-download digests after automatic retries are exhausted, and how to configure email or webhook delivery.
- Access to
Settings->Notifications - At least one enabled channel: Email or Webhook
- A valid base URL if you want direct feed links in the digest
Sign in to PigeonPod, open Settings, then open Notifications.
For Email, fill in:
SMTP hostSMTP portFrom addressRecipient address
Optional Email fields:
UsernamePasswordEnable STARTTLSEnable SSL
For Webhook, fill in:
Webhook URL
Optional Webhook fields:
Custom HTTP headersCustom JSON body
Webhook URLs must use http:// or https://.
Custom headers must use one header per line in Key: Value format:
Authorization: Bearer your-token
X-Api-Key: your-api-key
These placeholders are supported in header values and JSON string values:
{title}{content}{generatedAt}{baseUrl}{total}
Example custom JSON body:
{
"title": "{title}",
"message": "{content}",
"generatedAt": "{generatedAt}",
"total": "{total}"
}Only string values are rendered. If you need a number or boolean in JSON, write it directly instead of using a placeholder.
Use Send test email or Send test webhook before saving the final configuration.
PigeonPod sends a failed-download digest only when an episode:
- is still in
FAILED - has already exceeded the automatic retry limit
- has no further automatic retry scheduled
- has not already been marked as notified
The notification job starts about 5 minutes after startup and then runs every 8 hours.
If both channels are enabled, PigeonPod tries both.
- If at least one channel succeeds, the digest is treated as delivered.
- If all enabled channels fail, PigeonPod will try again in the next digest cycle.
- Manual retry clears the notification state, so the episode can appear again later if it fails all retries again.
Check for these signals:
- Test email arrives as an HTML email.
- Test webhook reaches your receiver and includes the expected headers and JSON shape.
- A real digest includes the episode title, feed name, feed URL, retry count, published time, and the latest error summary.
If you leave Custom JSON body empty, the real webhook digest uses the built-in default payload, which is a JSON array of failed items:
[
{
"title": "Episode title",
"feedName": "Feed name",
"feedURL": "https://your-base-url/channel/UCexample",
"retryNumber": 6,
"publishedAt": "2026-03-10T08:00",
"error": "ERROR: unable to download video data: HTTP Error 403: Forbidden"
}
]Check:
- SMTP host and port
- authentication username and password
- whether your provider requires an app password
- whether you enabled either STARTTLS or SSL, not both
Check:
- the webhook URL is reachable
- headers use
Key: Valueformat - the custom body is valid JSON
- your receiver accepts
application/json
That is still considered a successful delivery. PigeonPod suppresses duplicates after one channel succeeds.
PigeonPod marks the exhausted failure as notified after successful delivery. You will see it again only if a later manual retry fails through the full retry cycle again.
Repository · Releases · Issues · Discussions
Security note: Do not expose an auth-disabled PigeonPod instance directly to the public Internet.