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
Open a form → Integrations. Pick a destination, paste the URL from Slack, Discord, Google Apps Script, or your automation tool.
| Integration | Destination type |
|---|---|
| Slack | Slack incoming webhook |
| Discord | Discord webhook |
| Google Sheets | Google Sheets (Apps Script) |
| Zapier / Make / n8n | Custom URL (signed webhook) |
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();
}
}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.
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.
Slack, Sheets, and Zapier on the same $9 plan.
Upgrade to Pro