Skip to content

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.

CommandRunsCron
accounts:purge-pendingDaily at 03:000 3 * * *
lifecycle:sendDaily at 10:000 10 * * *
content:comments --dueHourly0 * * * *
publish:tickEvery minute* * * * *
social:refresh-tokensDaily at 07:000 7 * * *
research:sync-channelsEvery 6 hours0 */6 * * *
research:run-saved-searchesEvery 6 hours0 */6 * * *
metrics:sync-instagramDaily at 05:000 5 * * *
metrics:sync-blueskyDaily at 05:1515 5 * * *
metrics:snapshot-followersDaily at 07:3030 7 * * *
automations:enrich-contactsDaily at 06:3030 6 * * *
metrics:reportMonthly on the 1st at 09:000 9 1 * *
videos:cleanup-stale-uploadsHourly0 * * * *
studio-scheduler-heartbeatEvery minute* * * * *

Every command

CommandWhat it doesOptions
accounts:purge-pendingPermanently delete accounts that were soft-closed more than the grace period ago.--days
automations:enrich-contactsFill 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:commentsScan public sources for comment-worthy posts and draft comments into the queue--dry-run --deep --due
content:editorialAI 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-contractEmit the public-surface contract (MCP tools, REST routes, enums, connectors, commands) as JSON for the docs site--pretty --section --silent
flow:sync-with-stripeSync local database with Stripe products and plans
lifecycle:sendSend due lifecycle emails (onboarding, trial nurture, churn recovery)
metrics:reportGenerate the monthly own-channel performance report for each team with metrics--month --team --force --dry-run
metrics:snapshot-followersSnapshot connected accounts' follower counts into account_stat_snapshots via each platform connector--team
metrics:sync-blueskyPull our own Bluesky post metrics into metrics_snapshots via the official API--team --days
metrics:sync-instagramPull our own Instagram post metrics into metrics_snapshots via the Graph API--team --days
permissions:syncIdempotently 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-metricsBackfill metrics_snapshots.draft_id (+ pillar) against published drafts using the prefix heuristic--team
postlyra:seed-ownerCreate (or reset) the login-able owner user for the default team, for the app panel--email --password
publish:tickDispatch PublishDraftJob for every due pending schedule slot
research:run-saved-searchesRe-run active saved searches and record how many results are new--search
research:sync-channelsDispatch a sync job per tracked channel (or a single one via --channel)--channel
social:refresh-tokensRefresh social account tokens via each platform connector--force
videos:cleanup-stale-uploadsAbort 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.

Postlyra, by MAVA Design