Boosterpack Forms

Send Form Submissions to Google Sheets

Log every form submission to a Google Sheet automatically — for free, with no Zapier or other middleware required. Just a simple Google Apps Script that acts as a webhook endpoint.

Free — no paid tools
No Zapier needed
Takes 5 minutes

How It Works

Boosterpack Forms sends a webhook (JSON POST) for every submission. Google Apps Script can receive webhooks as a free web app. You connect the two — no middleware needed.

Flow:Form submissionBoosterpack Forms webhookGoogle Apps ScriptYour spreadsheet
1
Create a Google Sheet

Open sheets.new to create a blank spreadsheet. Name it whatever you like (e.g. "Form Submissions").

2
Open Apps Script

In your spreadsheet, go to Extensions → Apps Script. Delete any existing code and paste the script below.

3
Deploy as a web app

Click Deploy → New deployment. Set the type to Web app.

  • Execute as: Me
  • Who has access: Anyone

Click Deploy and copy the Web app URL. It looks like https://script.google.com/macros/s/.../exec.

4
Add the webhook URL to your form

In your Boosterpack Forms dashboard, edit your form and set the Webhook URL to the Apps Script URL you just copied.

Or via the API:

Set webhook via API
curl -X PATCH "https://boosterpackforms.com/api/forms/<FORM_ID>" \
  -H "Authorization: Bearer $BPF_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "addWebhookUrl": "https://script.google.com/macros/s/.../exec" }'
5
Test it

Submit your form. Within a few seconds, a new row should appear in your Google Sheet with the timestamp, form ID, and all submitted fields as columns.

The Apps Script

Copy this into your Apps Script editor. It automatically creates column headers on the first submission.

Code.gs
Google Apps Script — paste into Extensions → Apps Script
function doPost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = JSON.parse(e.postData.contents);

  // First submission? Add header row
  if (sheet.getLastRow() === 0) {
    var headers = ['Timestamp', 'Form ID'];
    var fieldNames = Object.keys(data.fields || {});
    headers = headers.concat(fieldNames);
    sheet.appendRow(headers);
  }

  // Build the row
  var row = [
    data.submittedAt || new Date().toISOString(),
    data.formId || '',
  ];

  // Match field values to existing headers (skip Timestamp & Form ID)
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  for (var i = 2; i < headers.length; i++) {
    var val = (data.fields && data.fields[headers[i]]) || '';
    row.push(val);
  }

  sheet.appendRow(row);

  return ContentService
    .createTextOutput(JSON.stringify({ ok: true }))
    .setMimeType(ContentService.MimeType.JSON);
}
What this script does
  • Receives the JSON webhook from Boosterpack Forms
  • On the first submission, creates a header row with Timestamp, Form ID, and all your field names
  • Appends a new row for every submission, matching fields to the correct columns
  • Returns a 200 JSON response so the webhook is marked as delivered

Webhook Payload

This is the JSON that Boosterpack Forms sends to your Apps Script on every submission:

Example payload
{
  "event": "form.submission",
  "formId": "a1b2c3d4-...",
  "submittedAt": "2026-03-04T12:00:00.000Z",
  "fields": {
    "name": "Jane Smith",
    "email": "jane@example.com",
    "message": "Hi, I'd like to learn more about your services."
  },
  "meta": {
    "host": "example.com"
  }
}

Updating the script? If you modify the Apps Script, you need to create a new deployment (Deploy → New deployment) for changes to take effect. The old URL keeps using the old version.

Email + Sheets: You still receive submissions via email as usual. The webhook to Google Sheets runs alongside email delivery — you get both.

A note on security

Boosterpack Forms signs every webhook with HMAC-SHA256 (see webhook verification docs). However, Google Apps Script web apps cannot access custom request headers, so the Apps Script above does not verify the signature. The security relies on the obscurity of the Apps Script URL (a long random string that only Boosterpack Forms knows).

For most use cases this is perfectly fine. If you need full HMAC verification, you can place a proxy server in front that verifies the signature and forwards to the Google Sheets API — but this is rarely necessary for form submissions.

Plan requirement

Webhooks are available on the Professional and Business plans. Email delivery works on all plans including Free.

Other integrations

Boosterpack Forms has native support for Slack, Discord, Teams, Google Chat, and Telegram — just paste the webhook URL. Connect to thousands more apps via Zapier, Make, n8n, Google Sheets, Notion, Airtable, and HubSpot.

Set up your form now

Webhooks available on Professional & Business plans