Connectors Overview

Connectors are the delivery layer of formdata.dev. When a form submission arrives at the ingestion endpoint, one queue message is created per destination. Each message is processed independently, so a failure in one connector does not block delivery to others.

Connector Types

Type Identifier Description
Webhook webhook HTTP request to any URL (Slack, Discord, Zapier, custom backends)
SMTP smtp Send email via any SMTP server with AUTH LOGIN
Google Sheets google_sheets_webhook HTTP request to a Google Apps Script web app

Async Delivery via Queues

All deliveries happen asynchronously through Cloudflare Queues:

Browser → POST /v1/f/pk_xxx → [KV lookup] → Queue message per destination → Consumer → Connector
  1. The ingestion endpoint reads form config from KV (never touches D1)
  2. One queue message is created for each enabled destination
  3. The response (202 Accepted) is returned immediately to the client
  4. The queue consumer processes each message and dispatches to the appropriate connector
Non-Blocking

The submitter gets a response in milliseconds. Delivery happens in the background. This means you cannot report delivery errors back to the submitter.

SubmissionEnvelope

Every connector receives the same SubmissionEnvelope payload:

{
  "submissionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "formId": "f1234567-89ab-cdef-0123-456789abcdef",
  "formName": "contact-form",
  "payload": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "message": "Hello!"
  },
  "metadata": {
    "origin": "https://example.com",
    "ip": "203.0.113.42",
    "userAgent": "Mozilla/5.0 ...",
    "referer": "https://example.com/contact",
    "submittedAt": "2026-03-18T12:00:00.000Z"
  }
}

For webhook and Google Sheets connectors, this envelope is sent as the JSON body. For SMTP, it is formatted into a plain-text email.

Retry Behavior

The queue consumer uses Cloudflare Queue's built-in retry mechanism:

Setting Value
Max retries 5
Retry delay 30 seconds
Dead letter queue formdata-delivery-dlq
Max batch size 10 messages

On each delivery attempt:

  • Success — the message is acknowledged (message.ack())
  • Failure — the message is retried (message.retry()) up to 5 times
  • Exhausted retries — the message moves to the dead letter queue
No Delivery Dashboard

formdata.dev does not store submissions or delivery logs. Failed deliveries in the DLQ are only visible via the Cloudflare Dashboard (Queues section) if you are self-hosting.