Connect Google Sheets
Append accepted leads to a Google Sheet through an Apps Script web app.
Append selected fields from accepted HoneyFalcon leads to a shared Google Sheet through a customer-owned Apps Script web app.
Why it matters
A Sheet can provide a lightweight shared register for a team that does not yet need a full CRM. The connector keeps the field allowlist and HTTP result visible, while the customer-owned script controls the row layout and access to the spreadsheet.
Where to work
Prepare the destination Sheet and Apps Script first. Then open Company -> Connectors, select New connector, choose Google Sheets via Apps Script, and select Load preset.
Steps
- Create the destination Sheet and add column headers in the order expected by the script.
- Open Extensions -> Apps Script and add a doPost handler that parses the JSON body and appends one row.
- Deploy a new web app version with Execute as: Me and an access level that permits HoneyFalcon's server request, then copy the final /exec URL.
- Load the Google Sheets preset in HoneyFalcon and paste the /exec URL into Destination URL.
- Review Payload fields and keep the JSON keys, script properties, and Sheet columns aligned.
- Confirm Successful HTTP statuses 200 and 302, then run Test draft with synthetic data.
- Verify the test row in the Sheet, Create connector or Save changes, Activate the saved revision, and verify a separate real synthetic delivery.
See it in HoneyFalcon

Step 1 of 3: Google Sheets preset selected in the connector editor.

Step 2 of 3: Google Sheets destination and protected credential controls.

Step 3 of 3: Google Sheets endpoint and Successful HTTP statuses to review before creation.
Build a small, observable Sheets handoff
Prepare the row contract
Create explicit Sheet headers before writing the script. The example below appends email, first name, last name, phone, and HoneyFalcon lead ID in that order.
The generic payload also includes delivery_id. Keep lead_id when the row should identify the HoneyFalcon lead; use delivery_id when you need to correlate one outbound delivery.
If you change the columns, update the script, Payload fields, and JSON template together.
1function doPost(e) {2 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()3 const lead = JSON.parse(e.postData.contents)45 sheet.appendRow([6 lead.email,7 lead.first_name,8 lead.last_name,9 lead.phone,10 lead.lead_id,11 ])1213 return ContentService14 .createTextOutput(JSON.stringify({ ok: true }))15 .setMimeType(ContentService.MimeType.JSON)16}
Deploy the script as a web app
The script needs a doPost handler that parses the request and returns a small response. Deploy it as a web app, choose Execute as: Me, and use the access setting required for HoneyFalcon's server request.
After changing the code, deploy a new web app version. Editing the project alone may not update the version already serving the /exec URL.
Keep the final /exec URL private
Paste the deployed /exec URL into the Google Sheets preset. Do not publish it in screenshots or support tickets and do not add reusable secret material to its query string.
The preset sends JSON and normally does not need a HoneyFalcon credential.
Understand HTTP 302
Google Apps Script ContentService can answer through a one-time redirect. The preset accepts 200 or 302 as final successful responses and does not follow the cross-origin output redirect.
Delivered therefore records an accepted HTTP boundary. Confirm the actual row in Google Sheets separately.
Separate the test row from real delivery
Test draft can append a synthetic row, but it does not save or activate the connector and does not create Delivery history.
After saving and activating, accept a new synthetic lead and confirm both its separate Delivery history record and its own Sheet row.
Keep the deployed /exec URL private and accept 302 only as defined by this preset. A successful HTTP response is not proof of a row until you verify the Sheet.
The Sheets handoff is ready when
- The deployed /exec URL, selected fields, JSON keys, script properties, and Sheet columns agree.
- The connector retains Successful HTTP statuses 200 and 302.
- Test draft adds only the expected synthetic values without saving or activating the connector.
- A separate accepted synthetic lead has both a Delivery history result and the expected row in the Sheet.