What runs on a schedule
Background work, and when it happens. Generated from the app.
You do not run any of this. It is documented because "why did nothing publish" and "when do metrics arrive" are both answered here.
The two that matter most
Publishing ticks every minute. A slot at 09:10 publishes at 09:10, give or take the queue.
Metrics sync nightly. A post published this morning has no metrics until tomorrow. That is not a bug.
Times below are the deployment timezone
Not your posting-schedule timezone. Your posts go out in your configured timezone. See Posting schedule.
Schedule
Times are in the deployment timezone (Europe/Athens), which is separate from the posting-schedule timezone you set per brand in Settings.
| Command | Runs | Cron |
|---|---|---|
accounts:purge-pending | Daily at 03:00 | 0 3 * * * |
lifecycle:send | Daily at 10:00 | 0 10 * * * |
content:comments --due | Hourly | 0 * * * * |
publish:tick | Every minute | * * * * * |
social:refresh-tokens | Daily at 07:00 | 0 7 * * * |
research:sync-channels | Every 6 hours | 0 */6 * * * |
research:run-saved-searches | Every 6 hours | 0 */6 * * * |
metrics:sync-instagram | Daily at 05:00 | 0 5 * * * |
metrics:sync-bluesky | Daily at 05:15 | 15 5 * * * |
metrics:snapshot-followers | Daily at 07:30 | 30 7 * * * |
automations:enrich-contacts | Daily at 06:30 | 30 6 * * * |
metrics:report | Monthly on the 1st at 09:00 | 0 9 1 * * |
videos:cleanup-stale-uploads | Hourly | 0 * * * * |
studio-scheduler-heartbeat | Every minute | * * * * * |
Every command
| Command | What it does | Options |
|---|---|---|
accounts:purge-pending | Permanently delete accounts that were soft-closed more than the grace period ago. | --days |
automations:enrich-contacts | Fill captured DM contacts' username/name from the Instagram messaging profile API | --team |
carousel:render <draft> | Render all slides of a carousel draft to JPEG and store them in the media library | — |
content:comments | Scan public sources for comment-worthy posts and draft comments into the queue | --dry-run --deep --due |
content:editorial | AI planner run — generates a batch of LinkedIn posts, a reel, and a carousel as backlog draft rows | --dry-run |
content:repurpose <draft> | Repurpose one approved LinkedIn post draft into carousel + reel + IG caption assets | --bg --profile --dry-run |
dev:docs-contract | Emit the public-surface contract (MCP tools, REST routes, enums, connectors, commands) as JSON for the docs site | --pretty --section --silent |
flow:sync-with-stripe | Sync local database with Stripe products and plans | — |
lifecycle:send | Send due lifecycle emails (onboarding, trial nurture, churn recovery) | — |
metrics:report | Generate the monthly own-channel performance report for each team with metrics | --month --team --force --dry-run |
metrics:snapshot-followers | Snapshot connected accounts' follower counts into account_stat_snapshots via each platform connector | --team |
metrics:sync-bluesky | Pull our own Bluesky post metrics into metrics_snapshots via the official API | --team --days |
metrics:sync-instagram | Pull our own Instagram post metrics into metrics_snapshots via the Graph API | --team --days |
permissions:sync | Idempotently sync the TeamPermission enum into Spatie's permissions table | — |
postlyra:import-workspace [path] | Import the existing TS-prototype workspace (drafts, ideas, comments, schedule, metrics) into the DB | --fresh |
postlyra:match-metrics | Backfill metrics_snapshots.draft_id (+ pillar) against published drafts using the prefix heuristic | --team |
postlyra:seed-owner | Create (or reset) the login-able owner user for the default team, for the app panel | --email --password |
publish:tick | Dispatch PublishDraftJob for every due pending schedule slot | — |
research:run-saved-searches | Re-run active saved searches and record how many results are new | --search |
research:sync-channels | Dispatch a sync job per tracked channel (or a single one via --channel) | --channel |
social:refresh-tokens | Refresh social account tokens via each platform connector | --force |
videos:cleanup-stale-uploads | Abort R2 multipart uploads stuck in "uploading" past the grace period. | --hours |
Reading it
publish:tick dispatches due slots. If the scheduler dot in the sidebar is red, this is what has stopped, and nothing will publish.
content:comments --due runs hourly but only scans brands whose own configured interval has elapsed. So a 4 hour interval means 4 hours, not every hour.
social:refresh-tokens refreshes connection tokens, with a policy per platform. TikTok's 24 hour tokens refresh every run, Instagram's 60 day tokens occasionally.
metrics:sync-instagram and metrics:sync-bluesky are the only two post-metric syncs, because they are the only two platforms with a usable analytics API.
metrics:report generates the monthly performance report on the 1st. Read it under Insights.
automations:enrich-contacts fills in contact names and handles. It does nothing at all while the automations dry-run switch is on, which is why contacts can show as bare ids. See Contacts.
Running one now
Some of these have buttons under Tools: the AI planner, comment scans, token refresh and research sync.
The rest run only on the schedule.