To send WordPress form entries to Google Sheets, connect the form to the sheet with a form plugin add-on, a no-code tool such as Zapier or Make, or a small PHP hook that posts each submission to the sheet as it arrives. For Taxocity, a tax and compliance firm running paid ads, I wrote a PHP hook so every Bricks form submission lands in a Google Sheet. The team follows up from that one live list, and their CRM reads from it too.
Why send form entries to a Google Sheet?
Because leads hidden in the WordPress admin get followed up late, or not at all. Taxocity's brief was about the sales process more than the site. The team wanted to follow up on every enquiry fast and keep a record of who asked about what, without anyone logging into WordPress to find submissions.
A sheet solved that because it matched how the team already worked:
- They already used Google Sheets every day.
- Their CRM could read from a sheet.
- A sheet can be sorted, filtered and shared with whoever is on follow-up that week.
I evaluated two alternatives first: a direct TeleCRM webhook and moving the forms to Forminator. The sheet won because it fitted the client's habits rather than a developer's preference.
What are the ways to connect WordPress forms to Google Sheets?
| Route | How it works | Good for | Trade-off |
|---|---|---|---|
| Form plugin add-on | The plugin's own Google Sheets integration | Teams already on a plugin that offers one | Tied to that plugin |
| Zapier or Make | A webhook or plugin trigger feeds a no-code workflow | Teams who want to change the flow without a developer | Monthly cost that grows with volume |
| Custom PHP hook | Code runs on submit and posts the entry to the sheet | Builder forms, such as Bricks, and steady lead volume | Needs a developer to maintain |
On Taxocity the forms are Bricks Builder forms, so a PHP hook was the shortest path.
How does the custom hook route work?
A simplified sketch of the idea, not the production code, using Bricks' custom form action and a Google Apps Script web app that appends a row:
add_action( 'bricks/form/custom_action', function ( $form ) {
$fields = $form->get_fields();
wp_remote_post( SHEET_ENDPOINT, [
'timeout' => 10,
'body' => [
'secret' => SHEET_SECRET,
'name' => sanitize_text_field( $fields['form-field-name'] ?? '' ),
'phone' => sanitize_text_field( $fields['form-field-phone'] ?? '' ),
'service' => sanitize_text_field( $fields['form-field-service'] ?? '' ),
'page' => esc_url_raw( wp_get_referer() ),
],
] );
} );
For this to run, the form's actions in Bricks must include Custom, which is what fires the hook. On the Google side, a short Apps Script checks the secret and appends the values as a new row. Field IDs differ on every form, so map them to your own, and define the endpoint and secret in wp-config.php rather than in the theme.
What should each row contain?
The minimum the team needs to act, plus enough context to prioritise:
- Date and time, so the newest leads are at the top.
- Name and contact details.
- The service asked about. On Taxocity each service, such as GST filing, taxation and company registration, has its own page and its own call to action, so the sheet shows which service each lead came from.
- The page URL, which tells you which ad or page produced the lead.
- A status column the team fills in: contacted, quoted, won or lost.
How do you keep the setup reliable and secure?
- 1
Keep a copy in WordPress or email
If the request to the sheet fails, the lead still exists somewhere.
- 2
Protect the endpoint
Require a secret in every request and keep the endpoint URL out of public code.
- 3
Limit sharing
Only the people who follow up should have access. Leads are personal data.
- 4
Validate on the server
Sanitise every field before sending it, as in the sketch above.
- 5
Test after changes
Submit a test lead after any change to the form, plugins, caching or hosting.
Silent failures cost leads
A form that shows a thank-you message but never writes the row is the worst outcome, because nobody notices. On two client sites, a host cache layer swallowed submissions until PHP was upgraded from 8.0 to 8.3. Check the sheet, not just the thank-you message.
Can data flow the other way, from a sheet into WordPress?
Yes. On IPL Biologicals I set up bulk MRP updates from a sheet, so the marketing team updates prices across the store in one go instead of editing products one by one. The same principle applies in both directions: put the data where the team already works.
What else makes a lead form worth sending to a sheet?
Clean leads. If fake numbers are a problem, verify them before they reach the sheet, as I describe in how to add OTP phone verification to WordPress forms. If your team lives in HubSpot rather than Sheets, see how to add HubSpot forms to WordPress.
I build lead pages with Sheets, HubSpot or CRM integration through my landing pages with GA4, GTM and HubSpot service. Tell me where your team works and I will reply with a plan.



