Skip to main content
Connections define what happens after a form is completed. They are configured in the connections array at the root of your YAML file and fire once, when the submission status becomes completed — that is, when the user submits the final section. Connections do not fire for partial saves. If a user submits section 1 of a multi-section form and then abandons it, no connections fire.

Webhook

Sends an HTTP POST to a URL with the full submission as the request body.
connections:
  - type: webhook
    url: https://your-api.com/hooks/apply
PropertyTypeRequiredDescription
type"webhook"YesMust be webhook.
urlstringYesThe endpoint to POST to.
Request bodyContent-Type: application/json:
{
  "id": "abc123",
  "form_id": "acme/forms/apply",
  "status": "completed",
  "data": {
    "full_name": "Jane Smith",
    "role": "Software Engineer",
    "email": "jane@example.com"
  },
  "metadata": {
    "ip_address": "203.0.113.1",
    "user_agent": "Mozilla/5.0 ..."
  },
  "created_at": "2025-06-01T10:00:00Z",
  "updated_at": "2025-06-01T10:05:00Z"
}
No authentication headers are sent. To verify the source, validate the payload structure in your receiver, or embed a secret in your webhook URL.

Email

Sends an email when the form is completed. Supports Handlebars-style {{variable}} interpolation in to, subject, and body.
connections:
  - type: email
    to: "{{data.email}}"
    subject: "Thanks for applying, {{data.full_name}}"
    body: "<p>We received your application for {{data.role}}. We'll be in touch.</p>"
    include_responses: true
PropertyTypeRequiredDescription
type"email"YesMust be email.
tostringYesRecipient address. Supports Handlebars.
subjectstring | LocaleMapYesEmail subject. Supports Handlebars.
bodystring | LocaleMapNoEmail body. HTML is supported. Supports Handlebars.
include_responsesbooleanNoAuto-appends an HTML table of all field responses to the body.
Available template variables:
  • data — submission data object (one key per field ID)
  • form — form object
subject and body support LocaleMap. When using locale maps with Handlebars:
subject:
  en: "New application from {{data.full_name}}"
  es: "Nueva solicitud de {{data.full_name}}"
Email is sent via Resend. Sending to both the applicant and your team:
connections:
  - type: email
    to: "{{data.email}}"
    subject: "Thanks for applying, {{data.full_name}}"
    body: "<p>We received your application. We'll be in touch soon.</p>"
  - type: email
    to: "hiring@example.com"
    subject: "New application from {{data.full_name}}"
    include_responses: true

Airtable

Creates a new row in an Airtable base. Setup: Navigate to https://app.declarativeforms.com/oauth/airtable — you’ll be redirected through an OAuth2 flow to authorize access to your Airtable workspace. After authorizing, you’ll receive a connection_id to use in your YAML.
connections:
  - type: airtable
    connection_id: your-connection-id
    base_id: appXXXXXXXXXXXXXX
    table_id_or_name: Applications
PropertyTypeRequiredDescription
type"airtable"YesMust be airtable.
connection_idstringYesOAuth connection ID from the setup flow.
base_idstringYesAirtable base ID — starts with app.
table_id_or_namestringYesTable name (e.g., "Applications") or table ID.
The platform sends submission.data as the Airtable fields object. Your form field IDs must match Airtable column names exactly. For example, if your form has full_name, role, and email, your Airtable table must have columns named full_name, role, and email.

Multiple connections

You can configure multiple connections. They fire sequentially in array order. Here is the job application form with all three connection types:
version: 1
title: Join the team
sections:
  - id: main
    title: Apply to work with us
    fields:
      - id: full_name
        type: short_text
        label: Full name
      - id: role
        type: single_select
        label: Role you're applying for
        options:
          - Software Engineer
          - Product Manager
          - Designer
      - id: email
        type: email
        label: Email address
    next: done

connections:
  - type: webhook
    url: https://your-api.com/hooks/apply
  - type: email
    to: "{{data.email}}"
    subject: "Thanks for applying, {{data.full_name}}"
    body: "<p>We received your application for {{data.role}}.</p>"
  - type: airtable
    connection_id: your-connection-id
    base_id: appXXXXXXXXXXXXXX
    table_id_or_name: Applications