databeginner5 min setupby Mantle

Webhook to a spreadsheet row

Log every webhook POST as a row in a Google Sheet — the simplest durable audit trail there is.

Event webhookAppend the row

Drag to pan, pinch to zoom. This is the real graph the template installs.

Purpose

Log every webhook POST as a row in a Google Sheet — the simplest durable audit trail there is.

How it works

What it does

  • Exposes a webhook and appends one row per delivery to a Google Sheet.
  • Retries up to three times with exponential backoff, so a Sheets rate limit does not lose the row.

Validation

This template is contract-validated: the unit suite checks every node type, every config key and the whole graph against the same rules a saved workflow passes. It has not been run against the live provider — the ids, names and columns below are placeholders to replace with your own.

Nodes 2

  1. 01Event webhooktrigger.webhookTrigger
  2. 02Append the rowgoogle_sheets.appendApp
View template JSON
{
  "format": "mantle-workflow/v1",
  "id": "sheets-webhook-append-row",
  "name": "Webhook to a spreadsheet row",
  "graph": {
    "nodes": [
      {
        "id": "hook",
        "type": "trigger.webhook",
        "label": "Event webhook",
        "config": {
          "slug": "sheet-log",
          "response_mode": "immediate"
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 60,
          "y": 220
        }
      },
      {
        "id": "append",
        "type": "google_sheets.append",
        "label": "Append the row",
        "config": {
          "spreadsheet_id": "1AbCdEfGhIjKlMnOpQrStUvWxYz0123456789",
          "range": "Log!A:D",
          "values": [
            [
              "{{ $now }}",
              "{{ $json.event }}",
              "{{ $json.actor }}",
              "{{ $json.detail }}"
            ]
          ]
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 380,
          "y": 220
        },
        "retry": {
          "max_attempts": 3,
          "backoff": "exponential",
          "initial_ms": 1000,
          "max_ms": 8000
        }
      }
    ],
    "edges": [
      {
        "from": "hook",
        "to": "append"
      }
    ]
  }
}

Requirements

The connections and permissions each step needs, from the node contracts in the catalog.

  • Google SheetsOAuth 2.0

    Used by Append the row.

    Credential: {"client_id", "client_secret", "refresh_token"}

    • The refresh token must have the spreadsheets scope.

Setup

  • Set spreadsheet_id and range — Log!A:D appends after the last filled row of those columns.
  • values is a list of rows; edit the four cells to match your payload and your columns.
  • Pick a Google Sheets connection.

Sample input and output

Synthetic examples: node-contract samples or placeholders, never customer data.

Input

The fields the template declares or reads from the request body. Values are placeholders.

{
  "event": "<event>",
  "actor": "<actor>",
  "detail": "<detail>"
}

Output

Append the row google_sheets.append

{
  "updated_cells": 0,
  "updated_range": "",
  "updated_rows": 1
}

Failure handling

What the graph does when a step fails, read from its retry settings, error branches and error policies.

  • Append the row: up to 3 attempts, 1 s between attempts.
  • A step that fails, after any retries, fails the run. The failed step is kept with its input and error.

See it run, then make it yours.

Templates install as drafts. Edit any step, and Workflow Health re-checks the graph on every save.