Developer tools

Integrations & developer tools

Send every completed response to the tools your team already uses. Configure connectors in the builder's Settings → Integrations — each one fires on form completion, alongside the generic webhook and email notifications.

No-code connectors

Zapier

Trigger any of Zapier's 6,000+ apps from a form submission.

Create a Zap with the Webhooks → Catch Hook trigger and paste its URL into the form's Zapier field. EesyForm posts a shaped payload (event, form, response, answers) on every completion.

Zapier
Zapier "Webhooks" → "Catch Hook" gives you a URL like
https://hooks.zapier.com/hooks/catch/12345/abcde
Paste it into the form's Zapier field and route the raw JSON to any of
Zapier's 6,000+ apps.

Slack

Post a formatted message to any Slack channel on every response.

Create an incoming webhook in Slack (Incoming Webhooks app) and paste its URL into the form's Slack field. Answers are rendered as a Slack block message.

Google Sheets

Append a row per response — headers become your question titles.

Deploy the Apps Script below as a Web App and paste the /exec URL into the form's Google Sheets field. No API keys or OAuth required.

Google Sheets
// Google Apps Script — paste into a new Apps Script project,
// deploy as a Web App (execute as you, anyone with the link),
// and paste the /exec URL into the form's Google Sheets field.
function doPost(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Responses")
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet("Responses");
  const data = JSON.parse(e.postData.contents);
  if (!sheet.getRange(1, 1).getValue()) {
    sheet.getRange(1, 1, 1, data.headers.length + 1)
      .setValues([["Submitted at", ...data.headers]]);
  }
  const row = [data.submittedAt, ...data.values.map((v) => v ?? "")];
  sheet.appendRow(row);
  return ContentService.createTextOutput("ok");
}

HubSpot

Create or update a contact in HubSpot CRM from the respondent's email.

Create a private app in HubSpot, copy its access token, and paste it into the form. Responses with an email answer create a contact.

Salesforce

Route responses into Salesforce as leads via your own webhook.

Point the form's Salesforce field at an endpoint you control (e.g. an Apex REST resource or an integration platform) — EesyForm posts a lead-shaped payload.

Mailchimp

Subscribe respondents to a Mailchimp audience.

Paste a Mailchimp API key and audience (list) ID. Respondents with an email answer are added as subscribed members.

Notion

Append a page to a Notion database per response.

Create an integration in Notion, share your database with it, and paste the token + database ID into the form. The first answer becomes the page title.

Airtable

Create a record in an Airtable base per response.

Create a personal access token in Airtable and paste it with your base ID and table name. Column names should match your question titles.

Custom integrations

Webhooks

Receive raw JSON on every completed response with HMAC verification.

Set a webhook URL in Settings → Notifications. EesyForm POSTs the payload with an X-EesyForm-Signature header; verify it using the shared WEBHOOK_SECRET and the form ID.

Webhooks
// Node.js — verify the X-EesyForm-Signature header on a webhook.
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifySignature(formId, body, signature) {
  const secret = process.env.WEBHOOK_SECRET + ":" + formId;
  const expected = createHmac("sha256", secret).update(body).digest("hex");
  const a = Buffer.from("sha256=" + expected);
  const b = Buffer.from(signature);
  return a.length === b.length && timingSafeEqual(a, b);
}

REST API & SDK

Fetch the form schema and submit responses from any language or app.

The headless API is open (CORS enabled). The eesyform-embed npm package wraps it in a typed EesyFormClient.

REST API & SDK
curl -X POST https://YOUR-EESYFORM-HOST.com/api/public/forms/my-form-abc123/responses \
  -H "Content-Type: application/json" \
  -d '{
    "sessionId": "abc-123",
    "fields": [
      { "field": { "id": "q_email", "type": "email" }, "text": "ada@example.com" }
    ]
  }'
Delivery guarantees — native connectors and webhooks are fire-and-forget: they never block or break the respondent's submission. Webhooks are attempted up to three times (two retries with linear backoff — 1s, then 2s apart); connector delivery is attempted once with a 5s timeout. Failures are logged server-side, never shown to respondents. The Zapier connector includes the form's title, slug and response ID; other connectors send a subset of answers — see each connector's payload shape in the examples below. Test responses fire webhooks — and notification emails where the plan includes them — with an isTest flag so you can filter them.