utilitiesbeginner8 min setupby Mantle

Form submission to Airtable with a Slack ping

An intake form writes the submission to Airtable and tells the channel it landed.

Intake formCreate the recorPing the channel

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

Purpose

An intake form writes the submission to Airtable and tells the channel it landed.

How it works

What it does

  • Publishes an intake form.
  • Writes each submission to an Airtable table and posts the new record id to Slack.

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 3

  1. 01Intake formtrigger.formTrigger
  2. 02Create the recordairtable.create_recordApp
  3. 03Ping the channelslack.post_messageApp
View template JSON
{
  "format": "mantle-workflow/v1",
  "id": "airtable-form-intake-with-alert",
  "name": "Form submission to Airtable with a Slack ping",
  "graph": {
    "nodes": [
      {
        "id": "form",
        "type": "trigger.form",
        "label": "Intake form",
        "config": {
          "slug": "airtable-intake",
          "title": "Submit a request",
          "submit_label": "Send",
          "response_message": "Got it — thank you.",
          "fields": [
            {
              "name": "name",
              "label": "Name",
              "type": "text",
              "required": true
            },
            {
              "name": "email",
              "label": "Email",
              "type": "email",
              "required": true
            },
            {
              "name": "budget",
              "label": "Budget",
              "type": "number"
            },
            {
              "name": "notes",
              "label": "Notes",
              "type": "textarea"
            }
          ]
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 60,
          "y": 220
        }
      },
      {
        "id": "record",
        "type": "airtable.create_record",
        "label": "Create the record",
        "config": {
          "base_id": "appXXXXXXXXXXXXXX",
          "table": "Intake",
          "fields": {
            "Name": "{{ $json.name }}",
            "Email": "{{ $json.email }}",
            "Budget": "{{ $json.budget }}",
            "Notes": "{{ $json.notes }}"
          }
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 380,
          "y": 220
        }
      },
      {
        "id": "ping",
        "type": "slack.post_message",
        "label": "Ping the channel",
        "config": {
          "channel": "#intake",
          "text": "New intake from {{ $json.name }} ({{ $json.email }}) — Airtable record {{ steps.record.id }}"
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 700,
          "y": 220
        }
      }
    ],
    "edges": [
      {
        "from": "form",
        "to": "record"
      },
      {
        "from": "record",
        "to": "ping"
      }
    ]
  }
}

Requirements

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

  • AirtableBearer token

    Used by Create the record.

    Credential: the Airtable access token

  • SlackAPI key

    Used by Ping the channel.

    Credential: the bot token (xoxb-…), or {"token": "xoxb-…"}

    • The bot must be a member of a private channel before it can post there (Slack error not_in_channel otherwise).

Setup

  • Set base_id and table; the fields keys must be your Airtable column names.
  • Edit the form's fields — the record and the Slack text read them by name.
  • Pick Airtable and Slack connections and set the channel.

Sample input and output

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

Input

One form submission. Values are placeholders.

{
  "name": "<Name>",
  "email": "person@example.com",
  "budget": 0,
  "notes": "<Notes>"
}

Output

Ping the channel slack.post_message

{
  "channel": "",
  "ok": true,
  "ts": ""
}

Failure handling

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

  • 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.