What this page is. Every automation that runs on its own for byForja, with the schedule it actually fires on, what it does, the file that holds the code, and whether it is really running. One page like this exists on each of the four intranets.
Worker code: ~/Projects/byforja-backup-worker/ and ~/Projects/byforja-cron-purge/. Deployed at byforja-backup-worker.alexandre-corne-ac.workers.dev and byforja-cron-purge.alexandre-corne-ac.workers.dev.
Status is measured, not declared. Every schedule below was read back from the Cloudflare schedules API on 27/08/2026, not copied from the wrangler.toml files. A cron declared locally and never deployed shows up as dormant, which is exactly how two dead robots were found on the Elite Outsiders side.
Sister pages: tools.bycaliber.work/crons · tools.eliteoutsiders.com/crons · tools.alexandrecorne.com/crons.
| Schedule | What it does | Source file | Real status | Run |
|---|---|---|---|---|
0 2 1 * *1st of month, 02:00 UTC | Archives the previous month of the events table to R2 byforja-backups, then deletes those rows from D1. Backup first: an R2 failure blocks the DELETE, so nothing is lost. The DELETE cutoff is the start of the current month, which is why the retention purge no longer carries an events clause. | ~/Projects/byforja-backup-worker/src/events-archive.js | ActiveTrigger confirmed live on the Cloudflare schedules API on 27/08/2026. | |
0 3 1 * *1st of month, 03:00 UTC | Dumps every business table of D1 byforja into a single SQL file (CREATE TABLE plus one INSERT per row) and uploads it to R2 byforja-backups under YYYY-MM/. | ~/Projects/byforja-backup-worker/src/index.js (runBackup) | ActiveTrigger confirmed live on 27/08/2026. The retention purge used to run at this exact minute on the same database and was moved to 05:00 the same day. | |
0 4 * * 1Monday, 04:00 UTC | Fetches byforja.com/sitemap.xml, walks every public page and extracts every clickable element (links, buttons, [role="button"], [data-track-id]). Upserts page_inventory and button_inventory. If the sitemap fetch fails, the stale cleanup is skipped so nothing is wiped by accident. | ~/Projects/byforja-backup-worker/src/page-flow-crawl.js | ActiveTrigger confirmed live on 27/08/2026. | |
0 4 1 * *1st of month, 04:00 UTC | Builds its baseline from byforja.com/sitemap.xml, crawls each URL and buckets the results: 200 and 3xx are fine, 4xx warn, 5xx and network failures are errors. Mails only when something is off. | ~/Projects/byforja-backup-worker/src/url-audit.js | ActiveTrigger confirmed live on 27/08/2026. Runs one hour after the backup on purpose, so the crawl does not compete with the R2 upload. | |
0 5 1 1,7 *1st of January and July, 05:00 UTC | Counts rows per analytics table and per event type, then writes the snapshot back so the analytics map page reflects reality twice a year. | ~/Projects/byforja-backup-worker/src/analytics-map-refresh.js | ActiveTrigger confirmed live on 27/08/2026. Next run 01/01/2027. | |
0 6 * * *Every day, 06:00 UTC | Reads error_events over the last 24 hours plus the KPI thresholds. Sends one consolidated mail if anything is breached, and stays completely silent otherwise. | ~/Projects/byforja-backup-worker/src/error-events-watchdog.js | ActiveTrigger confirmed live on 27/08/2026. Silence is the normal state, so an outage of this robot looks exactly like a healthy day. Use the button to prove it still answers. | |
0 8 * * 1Monday, 08:00 UTC | Weekly snapshot: 7 day counters, delta against the previous 7 days, top paths, sent by mail. Runs four hours after the page-flow crawler so the report leans on a fresh inventory. | ~/Projects/byforja-backup-worker/src/weekly-snapshot.js | ActiveTrigger confirmed live on 27/08/2026. | |
0 * * * *Every hour | Outreach follow-up sender for touches T2, T4 and T5. For each prospect with a live sequence it works out which touch is due, checks it is that prospect's local 08:00 to 09:00 window on a Tuesday or a Thursday, then runs a dual stop check (a Cal.com booking under their email, or a last message coming from the prospect). Only if all of that clears does it send, inside the existing Gmail thread. T3 is never sent by this robot. An empty draft is skipped, not an error. | ~/Projects/byforja-backup-worker/src/gmail-followup.js | ActiveTrigger confirmed live on 27/08/2026. Real sends require both LIVE_SEND = "true" in wrangler.toml and the Gmail secrets. Either one missing means dry run, no exceptions. | |
0 5 1 * *1st of month, 05:00 UTC | GDPR retention purge. Deletes kit_email_opens rows older than 180 days, which is the six month promise made on the public privacy page. | ~/Projects/byforja-cron-purge/src/index.js | Active, no-opTwo changes on 27/08/2026. The schedule moved off 0 3 1 * *, which was the exact minute byforja-backup-worker dumps the same database to R2. And the events clause was removed: the archive at 02:00 already deletes everything older than the current month, so a 730 day cutoff could never match a row. What is left has nothing to do today either: the table kit_email_opens does not exist in D1 byforja. Confirmed by the worker's own dry run on 27/08/2026. |
| Schedule | What it does | Source file | Real status |
|---|---|---|---|
0 8 * * 1,4Monday and Thursday, 08:00 local | Reads the three CRM databases in Notion, one per vertical, and produces the bi-weekly brief: clients, prospects, leads, with the rows that need attention called out. byForja is one of the three verticals it covers. | ~/.claude/scheduled-tasks/crm-brief-biweekly/SKILL.md | ActiveLast run 24/08/2026. A Claude Code task runs on this Mac only, and only while a Claude Code app is open. If the Mac is off at 08:00 it fires on the next launch. |
| Schedule | What it does | Source file | Real status |
|---|---|---|---|
Every day, 09:30Europe/Paris | Video auto-publisher for byForja. Also reachable through the webhook byforja-videos-trigger. | n8n on the Hostinger VPS, workflow <code>[byForja] Video Auto-Publisher</code> | DormantThe workflow carries a daily schedule trigger but the workflow itself is switched off in n8n, so the trigger never fires. Read from the n8n API on 27/08/2026. |