App integration · All integrations
Connect Google Sheets to Formfy
Teams collecting intake forms, consent waivers, and signed agreements end up transcribing rows into spreadsheets by hand — copy the name, find the email, note the timestamp, repeat. When a clinic processes a dozen waivers a day or an agency routes signed proposals to an ops sheet, that manual work compounds fast. The data is stale before it lands, typos creep in, and nobody trusts the spreadsheet enough to build a real reporting workflow on top of it.
Formfy's public webhook API fires a structured JSON payload the instant a client signs. Wire that payload into Google Sheets once — via Apps Script, Make, or Zapier — and every future signed form appends a row automatically, with no copy-paste and no manual exports.
The workflow at a glance
Trigger
A client signs a Formfy intake, consent, or waiver form
Action
Formfy fires a form.signed webhook; a relay appends the row to Google Sheets
Result
Signer name, email, form title, and signed timestamp appear in the spreadsheet within seconds
Step-by-step: connect Google Sheets to Formfy
Subscribe to Formfy form.signed webhooks and relay the payload into a Google Sheets spreadsheet using Apps Script or a no-code connector.
Generate a Formfy API key
Open the Formfy dashboard, navigate to Settings → API Keys, and click Create key. Copy the fk_live_… token to a password manager — Formfy shows it only once. Use a fk_test_… key while wiring up the relay so no live submissions burn production credits during development.
Create a Google Sheet with column headers
Open Google Sheets and create a new spreadsheet. Add column headers in row 1 that match the Formfy webhook payload fields you want to capture — for example: form_id, form_title, signer_email, signer_name, signed_at, and submission_id. Having headers in place makes the Apps Script append step straightforward to implement.
Check existing webhook subscriptions
Before creating a new subscription, call GET /api/v1/webhooks with your Bearer token to see what Formfy already publishes. If a form.signed subscription already targets your relay, note its id and update it rather than creating a duplicate — double-subscribing the same endpoint fires every event twice, which doubles your spreadsheet rows.
GET
/api/v1/webhooksSee in the OpenAPI spec →Subscribe to the form.signed event
POST /api/v1/webhooks with target_url set to your relay endpoint — the Apps Script Web App URL, a Make webhook, or a Zapier Catch Hook — and event_types: ["form.signed"]. Formfy returns a webhook id and a signing_secret. Save the secret in your relay so it can verify X-Formfy-Signature on every incoming delivery.
POST
/api/v1/webhooksSee in the OpenAPI spec →Write the relay to append a row in Google Sheets
In the Google Sheet, open Extensions → Apps Script. Paste a doPost(e) function that parses the incoming JSON payload from Formfy and calls sheet.appendRow([...]) with the fields mapped to your header columns. Deploy the script as a Web App (execute as yourself, anyone can access) and copy the deployment URL as your target_url in the webhook subscription.
Test the integration end-to-end
Sign a test form in Formfy using a form under your account. Within 30 seconds, check the Google Sheet — a new row should appear with the signer details. In the Formfy dashboard, inspect the Webhook Deliveries log to confirm a 200 response from your relay. If the relay returned an error, the log shows the response body so you can debug the script directly.
Rotate the webhook secret on schedule
Quarterly — or if you suspect the signing secret was exposed — POST /api/v1/webhooks/{id}/rotate-secret. Formfy issues a new HMAC-SHA256 secret and invalidates the old one immediately. Update the new value in your Apps Script Properties Service right away; deliveries fail closed until both sides agree on the current secret.
POST
/api/v1/webhooks/{id}/rotate-secretSee in the OpenAPI spec →
Subscribe to Formfy form.signed events for Google Sheets logging
Create a webhook subscription pointing at your Google Apps Script relay. Formfy returns a signing secret used to verify every delivery via HMAC-SHA256.
curl -X POST https://formfy.ai/api/v1/webhooks \
-H "Authorization: Bearer fk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_url": "https://script.google.com/macros/s/YOUR_DEPLOY_ID/exec",
"event_types": ["form.signed"]
}'Frequently asked questions
Does Formfy have a native Google Sheets integration built in?
Formfy does not embed a one-click Google Sheets connector in the dashboard UI. Instead, Formfy exposes a clean REST API and webhook system that routes signed-form data to any endpoint you choose — including a Google Apps Script Web App tied directly to your spreadsheet. For teams that prefer a no-code path, the same webhook works as a Zapier or Make trigger that writes rows to Google Sheets with zero custom code.
Which Formfy events can send data to Google Sheets?
Five event types are live in Formfy's v1 webhook API: form.created, form.sent, form.viewed, form.signed, and form.expired. For spreadsheet logging, form.signed is the most useful — it fires when a signer completes the signature flow and carries the full signer object, timestamps, and form metadata. Subscribe to multiple events on the same webhook by listing them all in the event_types array when you POST /api/v1/webhooks.
How do I map Formfy submission fields to Google Sheets columns?
The Formfy form.signed webhook payload includes a top-level submission object with fields like signer_email, signer_name, signed_at, form_id, form_title, and submission_id. In your Apps Script doPost function, parse e.postData.contents as JSON, destructure the fields you need, and pass them as an ordered array to sheet.appendRow(). The array position must match the header column order you set up in row 1 of the spreadsheet.
Can I log multiple Formfy form types to the same Google Sheet?
Yes. Subscribe all your forms to the same webhook target_url by creating one subscription per form using POST /api/v1/webhooks. The payload includes form_id and form_title, so your Apps Script relay can branch — writing clinic intake rows to one sheet tab and waiver rows to another — based on the incoming form_id, all within a single spreadsheet file and a single deployed Web App.
What happens if my Apps Script relay is down when a form is signed?
Formfy queues the webhook delivery and retries with exponential backoff for up to 24 hours. If your Apps Script relay recovers before that window closes, the queued deliveries fire automatically and your spreadsheet rows catch up. You can also replay any specific delivery manually from the Webhook Deliveries log in the Formfy dashboard — useful for backfilling rows after a relay outage without re-asking signers to re-sign.
Can I also store the signed PDF in Google Drive via this integration?
Yes. In your Apps Script relay, after appending the spreadsheet row, call the Formfy API to fetch the signed PDF: GET /api/v1/forms/{id}/signed-pdf returns a short-lived download token, and GET /api/v1/files/pdf/{token} returns the binary PDF. Use UrlFetchApp.fetch() in Apps Script to retrieve it, then DriveApp.createFile() to save it into a Google Drive folder. The row in Sheets can include a direct Drive link alongside the submission metadata.
Does this webhook integration work on the Formfy free trial?
Yes. Formfy API access is included on every paid plan and during the 15-day free trial. Generate a fk_test_… API key during the trial to build and validate your entire Apps Script relay without touching live credits. Rate limits scale with your plan tier; check the X-RateLimit-Remaining and X-RateLimit-Reset response headers on any API response to monitor your current quota.
How do I update an existing spreadsheet row instead of always appending a new one?
The form.signed payload includes a stable submission_id. In your Apps Script relay, use sheet.createTextFinder(submission_id).findNext() to locate the row by that ID before deciding whether to call appendRow or setValues on the existing range. This pattern is useful when you subscribe to both form.sent and form.signed — the sheet pre-populates a pending row on send, then updates the status column to signed when the second webhook fires.
Ready to wire Google Sheets into Formfy?
Spin up an API key, run your first webhook, and route signed forms wherever your team already works.
