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 * * * |
comments:fetch | Every minute | * * * * * |
publish:tick | Every minute | * * * * * |
social:refresh-tokens | Daily at 07:00 | 0 7 * * * |
research:sync-channels | Every 6 hours | 0 */6 * * * |
metrics:sync-posts | Daily at 05:45 | 45 5 * * * |
metrics:snapshot-followers | Daily at 07:30 | 30 7 * * * |
engage:sync | Daily at 0*😗/5 | */5 * * * * |
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 * * * * |
ai-models:sync-prices | Daily at 04:15 | 15 4 * * * |
Every command
| Command | What it does | Options |
|---|---|---|
accounts:purge-pending | Permanently delete accounts that were soft-closed more than the grace period ago. | --days |
ai-models:sync-prices | Queue a sync of AI model token prices from the public price feed | — |
automations:enrich-contacts | Fill captured DM contacts' username/name from the Instagram messaging profile API | --team |
carousel:render <id> | Render all slides of a carousel to JPEG and store them in the media library | — |
comments:fetch | Read every due comment-outreach feed, once for the whole platform, paced against the Reddit budget | — |
competitors:refresh [competitor] | Re-read competitor pricing pages into resources/data/competitor-pricing.json and report price changes | --preview |
content:repurpose <post> | Repurpose one approved LinkedIn post draft into carousel + reel + IG caption assets | --bg --profile --preview |
dev:docs-contract | Emit the public-surface contract (MCP tools, REST routes, enums, connectors, commands) as JSON for the docs site | --pretty --section --silent |
engage:sync | Poll every connector implementing PollsConversations for new Engage conversation items | --account --team |
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 --preview |
metrics:snapshot-followers | Snapshot connected accounts' follower counts into account_stat_snapshots via each platform connector | --team |
metrics:sync-posts | Pull our own post metrics into metrics_snapshots for every platform whose connector reports them | --platform --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.post_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 PublishPublicationJob for every due pending publication whose draft is approved; expire the rest; sweep repeat posts | — |
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, every minute.
comments:fetch reads every due comment-outreach feed once a minute, one shared read per feed rather than per brand, paced against Reddit's rate limit. See Sources.
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-posts pulls post metrics for every platform whose connector reports them: Instagram, Bluesky, TikTok, Threads and YouTube today. See Platform support for what each one actually sends back.
metrics:report generates the monthly performance report on the 1st. Read it under Insights.
automations:enrich-contacts fills in contact names and handles from the Instagram messaging profile API.
Running one now
Some of these have a matching button in Studio rather than a wait: Scan now on Sources, and Reconnect on Connections for a token that needs it.
The rest run only on the schedule.