How to set up: monthly inventory snapshot
- Step 1Pair a runner and add the Slack credential — Install and pair the @jadapps/runner, then store your Slack bot token (the `xoxb-…` value) on it under a ref like `slack-prod`. The two connector nodes look the token up by `credentialRef` at run time via `ctx.credentials` — it is never sent to JAD's server.
- Step 2Fork this workflow — Click Fork. The from-blueprint route places the three nodes left-to-right, auto-wires `http-request` → `csv-validator` → `slack-postmessage`, copies the `0 9 * * 1` schedule, and creates a private draft owned by you, snapshotted as version 1.
- Step 3Point the HTTP Request at your CSV — Open the HTTP Request node and set the `url` to your report endpoint, leave `method` as GET, and adjust `timeoutMs` (default 60000) if the download is large. Add a `credentialRef` here too if the URL needs auth.
- Step 4Set the Slack channel and message — On the Slack node, set `channel` (`#ops-summary` or a `Cxxx` id) and the `credentialRef`. Leave `text` blank to post the upstream CSV text, or template a message — the node falls back to the upstream file's first 16KB when `text` is empty.
- Step 5Confirm the cron schedule — The fork inherits `0 9 * * 1` (Monday 09:00 UTC). Edit it to your cadence — the matcher supports `*`, ranges, lists, and `*/N` steps on standard 5 fields. Times are evaluated in UTC, so offset for your timezone.
- Step 6Publish and watch the run history — Publish the workflow. The cron tick enqueues a run when due and pushes a wake to your runner; each execution writes a row to the run history with a full step trace you can inspect or replay.
Frequently asked questions
What tools does this workflow actually chain?+
Three nodes in order: **HTTP Request** (GET the CSV), **CSV Validator** (shape-check and pass through), and **Slack: Post Message** (post via chat.postMessage). It does not use a row-count or sum tool — the summary you see comes from the validator's health/rows/issues report and whatever text you set on the Slack node.
Does my Slack token leave my device?+
No. The Slack bot token is stored as a credential on your paired runner and resolved at run time via `ctx.credentials[credentialRef]`; the runner adds the Bearer header itself. JAD's central API never accepts file uploads and never receives the token — connectors run on the runner.
Is this scheduled out of the box?+
Yes. The blueprint's `scheduleCron` is `0 9 * * 1` (Mondays at 09:00 UTC). The from-blueprint fork copies that schedule into your new workflow, so it is scheduled the moment you fork — unlike forking one of your own workflows, which starts unscheduled.
What timezone is the cron in?+
UTC. The matcher compares against getUTCMinutes/getUTCHours/getUTCDate/getUTCMonth/getUTCDay, so `0 9 * * 1` fires at 09:00 UTC. Offset the hour field for your local time (e.g. 09:00 US Eastern in winter would be `0 14 * * 1`).
What cron syntax is supported?+
Standard 5-field POSIX: minute, hour, day-of-month, month, day-of-week. It supports `*`, literals, `A-B` ranges, `A,B,C` lists, and `*/N` steps. It does not support nicknames (@hourly), seconds, named days/months, or L/W/# — a bad expression is rejected and recorded in last_fire_error.
Which subscription tier do I need?+
Pro. Both the HTTP Request and Slack nodes are `isPro: true` connectors (shown as "PRO · 1 credit"). tier-precheck scans the graph and returns the strictest minTier; with two Pro connectors the whole workflow requires Pro to run.
How do I fork it?+
Click Fork on this page. The from-blueprint route builds the graph (240px horizontal stride), auto-wires consecutive nodes via the first compatible out→in ports, copies the schedule and description, creates a private workflow owned by you, and snapshots it as version 1 with a `forked` audit event.
Can I see the history of each run?+
Yes. Every execution writes a row to `workflow_runs` with a `trace` blob, a status (running/success/failed/cancelled), start/end timestamps, and input/output summaries. The runs API returns the latest 50 for the workflow's owner, so you get a full audit trail per run.
What if Slack is down or the token is wrong?+
The node returns ok=false with a `slack_<error>` code (or `network_error` on a fetch failure) and the run is recorded as failed. Fix the credential or channel and trigger another run — the cron will also retry on its next due slot.
Can I post the actual CSV rows instead of a fixed message?+
Yes. Leave the Slack node's `text` empty and it falls back to the upstream file content, posting up to the first 16KB (appending "…[truncated]" beyond that). For a tidier digest, template `text` yourself or pass Block Kit JSON in the `blocks` field.
Can I summarise more than one CSV?+
The shipped chain handles one source. To combine sources, add a node like [csv-merger](/tool/csv-merger) before the validator, or fork the workflow once per source and point each at a different channel. The validator and Slack node stay the same.
What related workflows should I look at?+
If your data starts dirty, run [dedupe-excel-csv-workflow](/workflows/dedupe-excel-csv-workflow) or merge feeds with [merge-supplier-inventory-csvs-workflow](/workflows/merge-supplier-inventory-csvs-workflow) first. For a different sink, [pdf-batch-extract-to-sheets](/workflows/pdf-batch-extract-to-sheets) and [rss-to-notion-digest](/workflows/rss-to-notion-digest) follow the same fetch-process-deliver shape. To pre-clean a CSV by hand, see [csv-cleaner](/tool/csv-cleaner) and [csv-deduplicator](/tool/csv-deduplicator).