Blog
How to Send Webhooks to Google Sheets with FastHook
Sometimes the best webhook destination is not another API. It is a spreadsheet.
Google Sheets is easy to share with support, ops, finance, QA, or anyone who needs to inspect events without opening logs. A new order, checkout event, failed payment, form submission, GitHub deployment, or Shopify order can become a row in a sheet.
In FastHook, Google Sheets is a first-class destination type. You do not need to build a receiver app, deploy a server, or write a Google Apps Script endpoint just to append rows.
The Route
The provider sends the webhook to a stable FastHook Source URL. FastHook accepts the event, routes it through a connection, and writes selected values to Google Sheets through the Google Sheets values.append API.
Provider webhook
-> FastHook Source URL
-> FastHook Connection
-> GOOGLE_SHEET destination
-> Google Sheets rowWhy Google Sheets Needs A Middle Layer
Most webhook providers expect an HTTP URL that can receive a POST request. Google Sheets expects authenticated calls to the Google Sheets API, a spreadsheet id, a tab name, a row layout, and sensible write pacing.
FastHook handles that middle layer. The provider sends normal webhooks to FastHook, while FastHook handles routing, delivery attempts, retry state, and the Google Sheets append call.
- Choose which spreadsheet receives the data.
- Choose which tab should be written to.
- Map payload fields into stable columns.
- Use OAuth2 login or a service account for Google auth.
- Inspect failed writes from the same event and attempt history.
Google Sheet Destination Config
In FastHook, Google Sheets is not treated as a regular HTTP destination. It uses its own destination type: GOOGLE_SHEET.
Instead of a destination URL, the config describes the sheet target, row shape, value input mode, and Google authentication.
{
"spreadsheet_id": "1xcIMwZ...",
"sheet_name": "Orders",
"range": "Orders!A:Z",
"value_input_option": "RAW",
"insert_data_option": "INSERT_ROWS",
"columns": ["customer.email", "order.id", "order.total"],
"include_metadata": false
}Create A Source
First, create a FastHook source. The source gives you a webhook URL that your provider can call.
Paste that URL into the service that sends your webhook events, such as Stripe, Shopify, GitHub, Typeform, HubSpot, or your own application.
https://hook-xxxxxx.fasthook.io/Create A Google Sheet Destination
Next, create a destination with type GOOGLE_SHEET. You need the spreadsheet id, sheet name, Google auth, and optionally the payload fields that should become columns.
The spreadsheet id comes from the Google Sheet URL. FastHook derives the write range from the sheet name, so a sheet named Orders becomes Orders!A:Z.
- Use OAuth2 login when a human Google account owns or manages the spreadsheet.
- Use a service account for production automation.
- When using a service account, share the target sheet with the service account email as an editor.
- A missing share permission is a common cause of Google Sheets 403 responses.
Map Payload Fields To Columns
For a useful spreadsheet, avoid dumping the whole JSON payload into one cell. Map the fields humans actually need.
FastHook reads dotted paths in order and appends one row per delivered event. Explicit columns keep the sheet stable even if the provider adds new fields later.
customer.email
customer.name
order.id
order.total
order.currency
event.typeAPI Example
The same setup can be created through the API. This example creates an OAuth-backed Google Sheet destination with explicit columns.
curl -X POST "https://api.fasthook.io/v1/destinations" \
-H "Authorization: Bearer fhp_xxx" \
-H "x-team-id: tm_3b5335b627084a838b" \
-H "Content-Type: application/json" \
-d '{
"name": "Orders to Google Sheets",
"type": "GOOGLE_SHEET",
"config": {
"spreadsheet_id": "1xcIMwZ...",
"sheet_name": "Orders",
"value_input_option": "RAW",
"insert_data_option": "INSERT_ROWS",
"columns": [
"customer.email",
"order.id",
"order.total",
"event.type"
],
"include_metadata": false,
"auth_type": "GOOGLE_OAUTH_REFRESH_TOKEN",
"auth": {
"client_id": "google-client-id",
"client_secret": "google-client-secret",
"refresh_token": "google-refresh-token"
}
}
}'Send A Test Event
After the source, destination, and connection are in place, send a test webhook to the FastHook Source URL. The selected fields should appear as a new Google Sheets row.
curl -X POST "https://hook-xxxxxx.fasthook.io/" \
-H "Content-Type: application/json" \
-d '{
"customer": {
"email": "ada@example.com"
},
"order": {
"id": "ord_123",
"total": 49
},
"event": {
"type": "order.created"
}
}'Rate Limits
Google Sheets is great for operational workflows, but it is not a high-volume event database. FastHook keeps Google Sheet destinations paced at one request per second to avoid write bursts.
For high-volume webhook streams, filter before the sheet destination or fan out to both a production API and a filtered Google Sheet branch.
Webhook source
-> production API
-> archive destination
-> filtered Google Sheet destinationDebugging Checklist
- If no row appears, check that the provider request reached the FastHook source.
- Confirm that the connection is enabled and the event passed your filters.
- Inspect the destination delivery attempt for the Google response.
- Check the spreadsheet id and sheet name.
- Check Google auth and spreadsheet sharing permissions.
- If columns are wrong, compare your dotted paths with the captured webhook payload.
When This Pattern Is Useful
Sending webhooks to Google Sheets works well for lead capture, order review, payment operations, QA logs, internal audit trails, support handoffs, webhook debugging, and lightweight reporting.
The provider keeps sending normal webhooks. FastHook handles routing, delivery attempts, retries, replay, and the Google Sheets append call. The team gets a spreadsheet they can filter, share, and inspect without building another internal tool.