Write a scheduled status row to Google Sheets
Use Schedule Trigger → JSON Operations (JQ) → Append Rows to add a timestamp, workflow name and the literal status ok to Google Sheets each day. This template uses no AI model and no paid third-party API. Production checks passed for the diagnostic harness, a manual graph run and one real one-minute interval firing. Daily wall-clock timing was not tested.
Status: production-tested on 9 October 2026 on AI Flowi Workflow 1.9.2 (15 of 15 cases passed)
By Ai Flowi · Published · Updated
Task
Write one row per successful execution. The timestamp is the trigger’s actual execution time, including its timezone offset. The workflow name is a configured constant. The last cell is always ok. A row confirms that this heartbeat reached the sheet; it does not check the health of another service.
Who it is for
Operations teams and workflow administrators who want a simple daily activity record in a sheet they can inspect. Use a private sheet and synthetic data for the first run.
Sample input
The daily flow needs no incoming HTTP request. Schedule Trigger supplies runtime data. This shortened example shows the fields relevant to the row; identifiers have been omitted.
{
"trigger": "schedule",
"scheduled_at": "2026-10-10T08:00:00+08:00",
"triggered_at": "2026-10-10T08:00:01+08:00",
"timezone": "Asia/Kuala_Lumpur"
}
Illustrative row, not a recorded test result:
["2026-10-10T08:00:01+08:00", "Scheduled status heartbeat", "ok"]
Setup
- Connect your Google account in AI Flowi Workflow. Confirm that the account can edit the selected private spreadsheet.
- Create a dedicated tab, for example
Heartbeat. Puttimestamp,workflow_nameandstatusin A1:C1, in that order. - Save a flow named
Scheduled status heartbeat. Add Schedule Trigger, JSON Operations and Append Rows. - In Schedule Trigger, select Daily, timezone
Asia/Kuala_Lumpurand one time, for example Hour08, Minute00. Leave Enabled off while preparing and testing. - In JSON Operations, choose JQ Expression and paste the row query below. Keep the JQ field visible. Set its constant to the exact saved workflow name.
- In Append Rows, select your Google account, set your Spreadsheet ID, set Range to
'Heartbeat'!A:C, selectRAWand leave Include Object Headers off. Replace the range if you choose another tab name. - Connect the ports below. Run the saved flow manually and confirm exactly one new three-cell row. Then test one short interval firing before enabling your daily schedule.
Node connections and field mappings
| Source output | Target input | Purpose |
|---|---|---|
Schedule Trigger: schedule_data | JSON Operations: data | Supply the trigger timestamp |
JSON Operations: data_output | Append Rows: values | Supply one row in a values wrapper |
{values: [[.triggered_at, "Scheduled status heartbeat", "ok"]]}
Column A takes triggered_at; column B takes the configured workflow name; column C takes ok. The scheduled flow has no webhook, model, router or response node. Renaming the flow requires changing the name constant in the query.
Sanitized request and response examples
The actual scheduled flow returns execution events in the authenticated builder, with no synchronous webhook response. The separate diagnostic webhook harness tests row mapping and invalid requests. It is not part of the three-node scheduled template and does not prove the scheduler fired.
POST https://workflow.aiflowi.com/api/v1/webhook/YOUR_TEST_HARNESS_FLOW_ID
Content-Type: application/json
x-api-key: YOUR_PLATFORM_API_KEY
{"triggered_at":"2026-10-10T08:00:01+08:00"}
Observed harness success response after one appended row:
HTTP 200
{"status":"appended"}
Observed harness rejection for a missing timestamp:
HTTP 422
{"verified":false,"error":"triggered_at is required and must be text"}
The request above is illustrative; the response bodies are recorded production results. Missing and invalid API keys returned HTTP 403; their response bodies were omitted from the evidence. Private sheet, account, connection and execution identifiers are not shown.
Validation and failure behaviour
The scheduled path uses the native trigger timestamp and fixed configuration. It accepts no caller-supplied workflow name or status. The diagnostic harness requires an object body and a text timestamp with an ISO 8601 shape and timezone. It rejects missing or wrong-type timestamps, non-object bodies and malformed JSON with an observed HTTP 422 response. Missing or invalid Platform API Keys returned HTTP 403. Read-back checks confirmed that every rejected case left all sheet rows unchanged.
The harness checks timestamp syntax only; an impossible calendar date can match its pattern. Keep this diagnostic endpoint private. Extra input fields are ignored. Repeating a valid request appends another row.
A Google Sheets error stops the flow. The reviewed reference platform has no supported in-flow exception branch for this component; a private webhook caller can receive a raw platform error, including Google API details. A controlled error response is not provided by this design. Check permissions, tab name and Spreadsheet ID, then inspect execution history and read the sheet before retrying.
Test results
Production evidence records 15 of 15 cases passed on 9 October 2026. Twelve cases used a separate companion webhook harness. The actual three-node scheduled graph was run manually through the authenticated build endpoint, with NDJSON completion events, trigger: manual, three node completions and one matching row. It was then temporarily enabled at Interval = 1 Minute. No manual calls to the main graph occurred during that window; sheet read-back and a fresh scheduler transaction with trigger: schedule correlated the appended timestamp. The real firing added one row during a recorded observation window of 69,811 ms, including restoration, read-back and log inspection. This was a real timed interval firing, not a daily wall-clock test.
| Case | Expected behaviour | Observed HTTP / execution | Observed row change | Verdict |
|---|---|---|---|---|
| Valid harness request | 200; one exact row | HTTP 200 | +1; exact three-cell row checked | PASS |
| Missing timestamp | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Wrong timestamp type | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Malformed JSON | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Missing API key | 403; no write | HTTP 403; body omitted | 0; existing rows unchanged | PASS |
| Invalid API key | 403; no write | HTTP 403; body omitted | 0; existing rows unchanged | PASS |
| Invalid timestamp shape | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Non-object JSON | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Forged status and name | 200; configured name and ok | HTTP 200 | +1; configured harness name and literal ok checked | PASS |
| Identical retry | 200; another row | HTTP 200 | +1; identical retry appended another row | PASS |
| Timezone offset | 200; timestamp preserved | HTTP 200 | +1; +08:00 timestamp preserved | PASS |
| Null timestamp | 422; no write | HTTP 422 | 0; existing rows unchanged | PASS |
| Manual scheduled-graph run | Manual trigger; one row | Completed manual build; trigger: manual; 3 node completions | +1; timestamp matched trigger; name and ok checked | PASS |
| One-minute real firing | Fresh scheduler record and matching row | Real timed firing; scheduler correlation confirmed; 69,811 ms observation window | +1; timestamp matched fresh scheduler record; name and ok checked | PASS |
| Restore disabled Daily | Saved enabled=false | Saved-flow read-back; disabled Daily 08:00, Asia/Kuala_Lumpur confirmed | Not recorded; configuration check | PASS |
Manual run performed: Yes: authenticated build of the actual scheduled graph. Real firing performed: Yes: one-minute interval, one correlated row. Schedule cleanup: Confirmed disabled; Daily 08:00, Asia/Kuala_Lumpur restored. Temporary-key cleanup: Deletion confirmed. Imported-copy retest: Not recorded in supplied evidence. The suite started with 0 data rows and finished with 6, excluding the header. Exact stored row literals and runtime timestamps were not retained in the sanitized evidence; row deltas and mapping checks were recorded.
Download
Download availability: Not available in the supplied materials. No sanitized export or imported-copy production retest is evidenced. The setup and field mapping above describe the tested graph. A shareable export must have private configuration removed, remain disabled on import and be tested after reconnection.
Required configuration
- An AI Flowi Workflow account with usable plan allowance.
- An authorized Google connection with edit permission on the selected spreadsheet.
- A dedicated tab with the three headers and its exact range.
- A saved workflow name matching the JQ constant, plus daily time and IANA timezone.
- Enabled turned on only after checking a manual run and the automatic firing test.
- For the optional private harness only: POST, Platform API Key authentication and From Flow response mode.
Tested version and date
Template platform version: AI Flowi Workflow 1.9.2, as identified by the supplied live catalogue. Production test date: 9 October 2026. The recorded suite ran from 2026-10-09T01:37:10.178Z to 2026-10-09T01:38:44.750Z. The runtime evidence does not separately capture a deployed-version response; version attribution comes from the catalogue, while execution results come from the production record. Check schedule component fields in your workspace before enabling the flow.
Usage and cost assumptions
Plans: Go from USD8/month billed yearly (USD10 monthly), Plus from USD16 (USD20 monthly), Pro 100 from USD80 (USD100 monthly), Pro 200 from USD160 (USD200 monthly) and Pro 500 from USD400 (USD500 monthly), with 5,000 to 250,000 Flowi Tokens/month and top-ups; 1 token per node run; third-party API and model usage is not included.
The daily path runs three nodes on success, so it targets 3 Flowi Tokens per execution. One execution each day for 30 days targets 90 Flowi Tokens. No AI/model call or paid third-party API is included. The existing Google connection and Google account quotas still apply.
| Executions | Node calculation | Flowi Tokens |
|---|---|---|
| 100 | 100 × 3 | 300 |
| 1,000 | 1,000 × 3 | 3,000 |
| 10,000 | 10,000 × 3 | 30,000 |
These are usage calculations, not measured charges or additional plan prices. The main path has no branch and assumes one row per run. Retries and manual runs add executions. The optional harness targets seven node runs on a valid request and four on rejected input; each read-back adds one more node run. Failed builds can consume tokens for nodes that ran before failure.
Limitations
- A successful row is an activity record, not a service-health check or uptime guarantee.
- Append has no duplicate protection. Retrying after an uncertain outcome can add another row.
- One real one-minute interval firing was observed. Daily wall-clock firing, downtime recovery, clock drift, daylight-saving changes and long-term schedule reliability were not tested.
- Disabling a schedule may leave already queued or in-flight work that can still complete.
- No automatic retry, alert, backfill, spreadsheet-error recovery or row retention policy is implemented here. Google Sheets failure injection was not part of the recorded 15 cases; the recovery limitation comes from the reviewed design.
- No sanitized export or imported-copy retest is recorded. Complete stored rows and raw scheduler payloads are omitted from the sanitized evidence.
- Workflow-name changes require an updated JQ constant. Changing headers, tab names or sharing can break the configured write.
Next steps
Configure your own private sheet and confirm its headers. Run a manual check and a short-interval firing in your workspace, then verify daily wall-clock timing before relying on the daily schedule. Import and re-test a sanitized copy before offering a download. Choose your daily time and enable the configured deployment after these checks.
Related: Component catalog · Connections · Webhook to Google Sheets tutorial · Google Sheets integration.