Automations let you schedule emails, webhooks, and notifications to fire at specific times or intervals. You can send ANY message on ANY schedule — the payload template is free-form text, so you're not limited to feed data.
---
Automations are a general-purpose notification scheduler. Some actions pull data from your feeds (using {variables}), but many actions are just custom messages you write yourself.
| Category | Example | Trigger | Channel |
|----------|---------|---------|---------|
| Reminders | "Doctor appointment tomorrow at 3pm" | One-shot | Telegram |
| Monitoring | "Ping healthcheck URL every 5 minutes" | Interval 5min | Webhook |
| Briefings | "Email me new items at 7am daily" | Daily 7am | Email |
| Reports | "Post weekly roundup to Discord" | Day-of-week Mon | Discord |
| Data pushes | "Send latest article JSON to CRM every hour" | Interval 60min | Webhook |
| Team alerts | "Notify Slack channel on keyword match" | Interval | Webhook |
| Deadlines | "Remind me 2 days before project due" | One-shot | Email |
| Heartbeats | "Prove scraper is alive every hour" | Interval 60min | Webhook |
The template can be literally anything. Use {variables} to pull in feed data, or just write plain text. Both work.
---
1. Go to Automations in the sidebar
2. Click New Action
3. Give it a name (e.g., "Morning Briefing" or "Doctor Reminder")
4. Choose a trigger:
- Interval — Fire every N minutes (min 5)
- Daily — Fire every day at a specific time
- Day of week — Fire on specific weekdays
- One-shot — Fire once at a specific date and time
5. Choose a channel:
- Webhook — POST to any URL (JSON payload)
- Email — Send to an email address (requires SMTP configured)
- Discord — Send to a Discord webhook URL
- Telegram — Send to a Telegram chat ID
6. Write a payload template (see examples below)
7. Click Create
---
You can use Automations purely as a notification scheduler. Write whatever message you want:
`
Don't forget: Doctor appointment tomorrow at 3pm.
555-1234 for the office. Bring insurance card.
`
`
Healthcheck OK — RSSFlux scraper running.
No action needed.
`
`
Quarterly compliance review due next week.
Review access logs and update security policies.
`
Use {variables} to insert live feed data:
`
New item from {feed_title}:
{latest_item_title}
{items[0].link}
`
`
{
"feed": "{feed_title}",
"title": "{latest_item_title}",
"url": "{items[0].link}",
"timestamp": "{now}"
}
`
---
| Variable | Replaced With |
|----------|---------------|
| {feed_title} | Title of the first feed |
| {feed_title[N]} | Title of the Nth feed (0 = first) |
| {feed_url} | URL of the first feed |
| {feed_url[N]} | URL of the Nth feed |
| {feed_list} | All feed names, comma-separated |
| {feed_item[N]} | Bullet list of Nth feed's items |
| {feed_item[N][M].title} | Mth item title from Nth feed |
| {feed_item[N][M].link} | Mth item link from Nth feed |
| {feed_item[N][M].description} | Mth item description from Nth feed |
| {item_count} | Number of new items |
| {items} | Bullet list of item titles (flat across all feeds) |
| {items[N].title} | Nth item title (flat) |
| {items[N].link} | Nth item link (flat) |
| {items[N].description} | Nth item description (flat) |
| {latest_item_title} | Same as items[0].title |
| {now} | Current date and time |
| {event_type} | Feed event type: new_item, scrape_failed, scrape_success |
| {scrape_status} | Same as event_type |
| {scrape_error} | Error message if scrape failed (empty on success) |
Variables are optional. If no feeds match your filter, they'll be empty strings.
---
| Use Case | Trigger | Channel | Template (what gets sent) |
|----------|---------|---------|--------------------------|
| Doctor appointment | One-shot Oct 9 at 3pm | Telegram | "Don't forget: Doctor at 3pm tomorrow. 555-1234." |
| Healthcheck ping | Every 5 minutes | Webhook | POST {"status": "ok", "timestamp": "..."} |
| Morning email briefing | Daily at 7am | Email | "Today's {item_count} items from {feed_title}: {items}" |
| Weekly Discord report | Every Monday 9am | Discord | "TechCrunch — 12 items this week. Top story: {latest_item_title}" |
| Hourly data push to CRM | Every 60 minutes | Webhook | JSON: {feed_title}, {latest_item_title}, {items[0].link} |
| Project deadline | One-shot June 15 at 9am | Email | "Project X due tomorrow. Final review needed." |
| Uptime heartbeat | Every hour | Webhook | POST to BetterUptime or Pingdom |
| Keyword alert | Interval 30min | Telegram | Polls feeds for keyword, sends matches |
| Compliance reminder | One-shot quarterly | Email | "Quarterly security review due. ~30 min task." |
| Evening digest | Daily at 6pm | Discord webhook | "Today's roundup: {item_count} new articles across all feeds" |
| Per-feed second items | Daily 7am | Email | "{feed_title[0]} 2nd: {feed_item[0][1].title}\n{feed_title[1]} 2nd: {feed_item[1][1].title}" |
| Multi-feed comparison | Interval 60min | Discord | "{feed_title[0]} vs {feed_title[1]}\nLatest: {feed_item[0][0].title} → {feed_item[1][0].title}" |
| Per-feed monitoring | Daily 8am | Slack | "{feed_title[0]}: {feed_item[0][0].title}\n{feed_title[1]}: {feed_item[1][0].link}" |
| Push to phone | Instant via button | Slack/Discord/Telegram/Signal | Click the Send button on any feed item — no template needed, uses default formatting |
| Push to contact | Instant via button | Slack/Discord/Telegram/Signal | Save contacts in Settings, pick from dropdown when sending an article |
---
Click the Play button next to any action to fire it immediately. The test sends the message through the full pipeline — template rendering, channel dispatch, and logging.
To check if a past action fired successfully, check the backend logs:
`bash
docker compose logs api 2>&1 | grep "dispatch_action_now"
`
---
| Tier | Max Actions |
|------|------------|
| Free | 2 |
| Hobby | 5 |
| Hobby+API | 10 |
| Developer | 25 |
| Business | 100 |
---
| Issue | Cause | Fix |
|-------|-------|-----|
| Action didn't fire | next_fire_at not reached | Wait, or use the Test button |
| "Action limit reached" | At max for your tier | Delete unused actions or upgrade |
| Webhook returned error | URL invalid or unreachable | Check URL accepts POST |
| Email not sent | SMTP not configured | Configure Admin → Settings → Email |
| Template shows raw {variable} | Misspelled name | Check spelling against reference |
| Telegram not sent | Wrong chat ID or bot token | Verify chat ID and bot token in Admin settings |