View .md

MuxForms integrations are configured per form under Integrations. Slack and Discord use incoming webhook URLs with messages formatted for each platform. Google Sheets uses a deployable Apps Script web app. Zapier, Make, and n8n should use the Custom URL destination with signed JSON.

Docs

Integrations

Open a form → Integrations. Pick a destination, paste the URL from Slack, Discord, Google Apps Script, or your automation tool.

Quick links

IntegrationDestination type
SlackSlack incoming webhook
DiscordDiscord webhook
Google SheetsGoogle Sheets (Apps Script)
Zapier / Make / n8nCustom URL (signed webhook)

Slack

  1. In Slack: Apps → Incoming Webhooks → add to a channel → copy the URL.
  2. In MuxForms: Integrations → Destination Slack incoming webhook → paste URL → Save.
  3. Submit the form. MuxForms posts a short text message with your field values.

Discord

  1. Channel settings → Integrations → Webhooks → New Webhook → copy URL.
  2. MuxForms → Discord webhook destination → paste → Save.

Google Sheets

Create a spreadsheet, open Apps Script, paste the template below, run setupSheet, then deploy as a Web app (execute as you, access: anyone). Paste the /exec URL into MuxForms as Google Sheets (Apps Script).

Apps Script

/**
 * MuxForms → Google Sheets
 * 1. Extensions → Apps Script → paste this file → Save
 * 2. Run setupSheet once (authorize when prompted)
 * 3. Deploy → New deployment → Web app → Execute as: Me, Who has access: Anyone
 * 4. Copy the /exec URL into MuxForms → Integrations → Google Sheets
 */
const SHEET_NAME = "MuxForms";

function setupSheet() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) sheet = ss.insertSheet(SHEET_NAME);
  sheet.clear();
  sheet.appendRow(["submitted_at", "submission_id", "form_name", "form_project", "origin"]);
}

function doPost(e) {
  const lock = LockService.getScriptLock();
  lock.waitLock(30000);
  try {
    const data = JSON.parse(e.postData.contents);
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    let sheet = ss.getSheetByName(SHEET_NAME);
    if (!sheet) {
      setupSheet();
      sheet = ss.getSheetByName(SHEET_NAME);
    }
    const fields = data.fields || {};
    const keys = Object.keys(fields).filter(function (k) {
      return k.indexOf("_") !== 0;
    }).sort();
    const header = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    const baseCols = ["submitted_at", "submission_id", "form_name", "form_project", "origin"];
    const needed = baseCols.concat(keys);
    if (header.join("") === "" || header[0] !== "submitted_at") {
      sheet.getRange(1, 1, 1, needed.length).setValues([needed]);
    } else {
      const existing = header.filter(Boolean);
      const merged = existing.slice();
      keys.forEach(function (k) {
        if (merged.indexOf(k) === -1) merged.push(k);
      });
      if (merged.length > existing.length) {
        sheet.getRange(1, 1, 1, merged.length).setValues([merged]);
      }
    }
    const rowHeader = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    const row = rowHeader.map(function (col) {
      if (col === "submitted_at") return data.createdAt || "";
      if (col === "submission_id") return data.submissionId || "";
      if (col === "form_name") return (data.form && data.form.name) || "";
      if (col === "form_project") return (data.form && data.form.project) || "";
      if (col === "origin") return data.origin || "";
      return fields[col] != null ? String(fields[col]) : "";
    });
    sheet.appendRow(row);
    return ContentService.createTextOutput(JSON.stringify({ ok: true })).setMimeType(
      ContentService.MimeType.JSON,
    );
  } finally {
    lock.releaseLock();
  }
}

Zapier, Make, and n8n

Choose Custom URL as the destination. Point it at the catch hook URL from your scenario. MuxForms sends signed JSON (MuxForms-Signature) on every submission—see Webhooks for verification. You can also trigger flows from your app with the submit API if you prefer polling or dual-write patterns.

Telegram and Notion

There is no first-party Telegram bot or Notion OAuth yet. Use Make, Zapier, or n8n: MuxForms webhook → HTTP module → Telegram Bot API or Notion create page. The full comparison list lives on Integrations.

Common questions

One form, multiple tools?
Each form supports one integration URL. Use your automation tool to fan out to Slack and Notion if needed.
Does Slack get the raw JSON payload?
No. MuxForms formats a readable Slack message. Use Custom URL for raw JSON.
Where is the submit API documented?
See /docs/api for POST /api/v1/forms/{formId}/submit from server or mobile clients.

Compare on the checklist buyers use.

Slack, Sheets, and Zapier on the same $9 plan.

Upgrade to Pro