Scheduled scans
Scheduled scans run automatically on a cadence you set. Once configured, you get fresh data every week without opening the app — which is exactly when the dashboards, insights, and alerts become most useful.
Cadence options
| Cadence | Best for |
|---|---|
| Daily | High-velocity categories where rankings shift weekly (AI tooling, breaking-news verticals) |
| Weekly | Most use cases. Enough cadence for trend visibility without burning budget. Default for new schedules. |
| Monthly | Mature categories that don't move much month-to-month, or budget-conscious workspaces |
Pick once; change anytime.
Setting up a schedule
- Open the topic detail page
- Click Schedule scans (top-right)
- Pick a cadence and time of day (defaults to 13:00 UTC Mondays for weekly)
- Choose which queries to include — typically "all" but you can exclude experimental ones
- Save
That's it. The schedule starts firing on the next scheduled time.
How it runs (under the hood)
Scheduled scans run on Inngest, not on the Vercel cron's 60-second function timeout. That's important because a 25-query bulk takes 10+ minutes and would otherwise time out mid-execution.
The execution chain:
- Vercel cron fires every minute on
/api/cron/scheduled-scans(auth:CRON_SECRET) - The cron handler queries the DB for schedules that are due now
- For each due schedule, it enqueues an Inngest event (
scheduled-scan/due) and returns immediately - The Inngest worker picks up the event, resolves your BYOK key inside
step.run, and dispatches the scan batch
This architecture means the cron handler stays fast (under 1 second) regardless of how many schedules are due. The actual work is durable + retryable via Inngest.
Best practices
Pick a time when you'll actually look. Weekly schedules running Monday morning so the dashboard is fresh when you start the week.
Stagger across topics if you have many. Don't run all 10 topics at 09:00 Monday — spread across the workday so OpenRouter rate-limits don't pile up.
Keep queries lean. A scheduled bulk of 50 queries weekly = 200/month. On free-tier shared key that's far over the cap; on BYOK that's still real OpenRouter spend. Pick the queries that move the needle.
Pair with alerts. Scheduled scans drive the cadence of alerts (rules evaluate on snapshot completion). Without scheduled scans, you only get alerts on manual scan days — which defeats the purpose.
Cost expectations
A weekly schedule of 10 queries across 4 platforms with BYOK:
- ~$0.05 – $0.15 per weekly run
- ~$0.20 – $0.60 per month
- Plus narrative regeneration when the data moves enough to invalidate the cache (~$0.05 per regen)
Total: typically $1–$2/month per workspace on BYOK for weekly automation. Negligible compared to the value of always-fresh visibility data.
What happens if a scheduled run fails
If Inngest's worker hits an error processing a scheduled-scan event:
- It retries automatically with exponential backoff (default: 3 retries over ~10 minutes)
- If all retries fail, the event lands in Inngest's dead-letter queue with the error logged
- Operators with Inngest Cloud access can manually replay it from the dashboard
The schedule itself doesn't pause on a single failed run — next week's run still fires as expected.
Stopping or modifying a schedule
- Pause — toggle the schedule off; resumes when you toggle back on
- Edit cadence — change daily/weekly/monthly any time; takes effect on next due date
- Delete — remove entirely; historical scans stay in the database, but no future runs
You can have multiple schedules per topic (e.g. daily for the 5 highest-priority queries + weekly for the rest).
See also
- Bulk scans — the manual version of what schedules automate
- Alerts — what fires when scheduled scans produce material change
- Cron jobs — how the cron + Inngest plumbing works (self-hosters)