How to Connect Elementor Forms to Google Sheets
Send every Elementor Pro form submission to Google Sheets automatically - including popup forms, dynamic fields, and multi-step forms. No Zapier. No per-submission fees.
TL;DR
Install SheetLink Forms, deploy a Google <a href="/docs/google-sheets-setup">Apps Script</a> webhook, paste the URL in SheetLink settings, map your Elementor form fields to Sheet columns, and test. Works with popup forms and dynamic tags. Requires Elementor Pro (the free version doesn't include forms).
Elementor is the most popular WordPress page builder, with over 10 million active installs. Its Pro version (starting at $59/year) unlocks the form widget - a clean, drag-and-drop form builder tightly integrated with Elementor's design system. But there's no native Google Sheets integration at any Elementor Pro tier.
Elementor Pro's built-in form actions include Email, Email 2, Redirect, Webhook, MailChimp, ActiveCampaign, and a few others - but not Google Sheets. Users who need Sheets delivery have historically turned to Zapier (per-task fees), the built-in Webhook action (DIY code required), or third-party automation plugins (more moving parts).
SheetLinkWP adds Sheets delivery as a first-class Elementor action. It hooks into the elementor_pro/forms/new_record action - the same pipeline Elementor's own MailChimp and ActiveCampaign integrations use - which means every Elementor form on your site (page forms, popup forms, sticky bar forms, lightbox forms) is captured automatically. This guide covers the setup, explains Elementor-specific patterns (custom field IDs, dynamic tags, popup forms, multi-step forms), and shows the realistic configurations Elementor Pro users need.
Why Elementor Pro Users Pick Google Sheets
Elementor Pro doesn't store form submissions in the WordPress database by default. Without storage, your only record of a submission is the email notification - and if that email fails, bounces, or gets spam-filtered, the lead is gone. Many Elementor users don't realize this until they discover missed leads weeks later.
A Google Sheet gives you a durable system of record that's independent of email deliverability. Every submission lands in a row. Sales teams can access it without WordPress admin logins. Marketing can build dashboards on top of it. If your site goes down, the Sheet persists in Google Drive.
SheetLinkWP makes Sheets delivery a standard Elementor action - configured once, runs on every form site-wide. You don't need to edit each form individually or paste webhook URLs into form builders. Configure SheetLinkWP once; it captures every form Elementor ever submits.
How SheetLinkWP Hooks Into Elementor Forms
Elementor Pro's form widget fires a standard WordPress action when a submission passes validation. SheetLinkWP listens on this action with the same priority native Elementor integrations use:
- 1. Form submitted on any Elementor widget: Page forms, popup forms, sticky bar forms, lightbox forms - any form built with the Elementor Pro form widget fires the same
new_recordaction when submitted. - 2. Elementor validates and runs built-in actions: Required field checks, custom regex validators, reCAPTCHA v3, and honeypot spam checks run. Valid submissions proceed to registered actions.
- 3. elementor_pro/forms/new_record fires: SheetLinkWP registers as an action on this hook, alongside Elementor's native Email, MailChimp, Webhook, and other actions. Field data comes in as a fully resolved array - dynamic tags are pre-resolved.
- 4. Field IDs mapped to Sheet columns: Elementor forms use custom field IDs you set in the form widget (like
email,phone,company). SheetLinkWP displays these IDs with their labels for mapping. - 5. Context metadata captured: Form name, popup ID (if applicable), current page URL, Elementor template ID, and submission timestamp are all added to the payload automatically.
- 6. Webhook POST with retry: JSON payload sent to Apps Script. On network failure or quota hit, submission queued for retry with exponential backoff.
What You Need
- A WordPress site with Elementor Pro installed (forms are a Pro feature)
- A Google account with access to Google Sheets
- SheetLink Forms plugin (free tier or any paid license)
Step-by-Step Setup
- 1
Create your Google Sheet
Open Google Sheets and create a new blank spreadsheet. Name it - "Elementor Form Leads" or similar. Leave it blank for auto-generated headers.
- 2
Deploy the Apps Script webhook
In your Sheet, go to Extensions > Apps Script. Paste the SheetLinkWP receiver script, deploy as a Web app, and copy the URL.
- 3
Install SheetLink Forms
Download from sheetlinkwp.com or WordPress.org. Upload, install, and activate.
- 4
Connect the webhook
In SheetLink > Settings, paste the Apps Script URL and save.
- 5
Map Elementor form fields
Go to SheetLink > Field Mapping. Select "Elementor Forms" and choose your specific form. Elementor uses custom IDs you set in the form widget (like "name", "email", "phone"). SheetLinkWP detects these and displays them in the mapping interface. Map each to a Sheet column.
- 6
Test with a page form and a popup
First test with a standard page form - submit and verify the row appears in Google Sheets. Then test a popup form to confirm popup submissions are also captured. SheetLinkWP hooks into Elementor's core submission action, so all form locations are supported.
Elementor Forms Field ID & Context Reference
Each field in an Elementor form widget has an ID you assign in the Advanced tab of the field settings. That ID is what SheetLinkWP uses for mapping. Elementor also exposes context about the form itself (form name, template ID, popup ID if relevant) that you can map to columns:
| Field ID / context | Source | Notes |
|---|---|---|
name | Name field | Default ID for a name field. Rename via Advanced > Custom ID in the Elementor field settings. |
email | Email field | Elementor validates email format before firing the action. |
phone | Phone field | No format enforcement by default - consider a validation regex if you need E.164 or national-format numbers. |
message | Textarea field | Elementor allows you to set min/max character limits. Enforced before submission. |
field_abc123 | Auto-generated field ID | If you don't set a Custom ID, Elementor auto-generates something like field_a1b2c3. Strongly recommended to override with readable IDs. |
acceptance | Acceptance field | GDPR-style consent checkbox. Writes "1" or empty. |
select | Select dropdown | Writes the selected option value. For multi-select, values join with commas. |
checkbox | Checkbox group | Multi-checked values comma-joined. Individual option columns available via advanced settings. |
upload | File upload | Requires Elementor Pro. Writes file URL. Pair with SheetLinkWP Drive add-on for Google Drive mirroring. |
_form_name | Elementor context | Human-readable form name from the Form Name field in the widget. Useful for multi-form sites. |
_form_id | Elementor context | Internal Elementor form ID (auto-generated). |
_post_id | Elementor context | ID of the post/page containing the form widget. Useful when the same form template is used on multiple pages. |
_post_title | Elementor context | Title of the containing page. Pair with _post_id for fast filtering. |
_popup_id | Elementor context | If submitted from an Elementor popup, the popup ID. Empty for in-page forms. |
_page_url | Elementor context | Full URL including query string. UTMs captured automatically when SheetLinkWP UTM tracking is enabled. |
_submitted_at | Elementor context | Timestamp in site timezone when the action fired. |
_user_ip | Elementor context | Submitter IP. Respects WordPress privacy settings. |
Real-World Use Cases
Landing page conversion tracking with popup forms
You're running paid traffic to a landing page with an exit-intent popup form. You need a single Sheet that captures both in-page submissions and popup submissions, with a column that identifies which variant converted. SheetLinkWP writes _popup_id automatically, so filtering is trivial.
name, email, phone plus _form_name, _popup_id, _page_url, and UTM columns. Use a Sheet formula: =IF(G2="", "In-page", "Popup") to classify. Multi-step Elementor form with progress tracking
Elementor Pro's multi-step form widget splits long forms across pages. SheetLinkWP captures the complete submission after the final step, so all fields arrive in one row - but you also know each step was completed (because partial submissions don't fire the new_record hook).
_submitted_at. Abandoned multi-step forms aren't written by default - enable "Capture partial submissions" in SheetLink settings to route them to a separate tab. Dynamic tag-driven form with contextual capture
You're using Elementor's dynamic tags to pre-fill hidden fields with page metadata (post title, ACF field values, user role if logged in). SheetLinkWP receives the resolved values - dynamic tags are evaluated before the form action fires.
source_page field with dynamic tag Post Title, a hidden referrer_ref field with dynamic tag URL Variable: ref. Newsletter signup with CRM fan-out
A lightweight Elementor popup form captures email addresses for a newsletter. You want the email in both a Google Sheet (for backup and Looker Studio dashboards) and your CRM (HubSpot or ActiveCampaign). SheetLinkWP writes to Sheets; the optional CRM Fan-Out add-on delivers to the CRM in parallel.
email, _page_url, _popup_id, UTM columns. Sheet acts as the durable backup; CRM handles nurture. If CRM is briefly down, Sheet row is still written. Advanced Tips
Always set Custom IDs on every field
Elementor auto-generates field IDs like field_a1b2c3 if you don't set a Custom ID. Those auto-IDs change when you duplicate or rebuild a form, silently breaking your SheetLinkWP mapping. Set Custom IDs in every field's Advanced tab (email, phone, company, etc.) so mappings survive redesigns.
Popup forms and in-page forms can share a mapping
If your popup form has the same fields as your page form and the same Form Name, SheetLinkWP applies the same mapping to both. To differentiate in the Sheet, just map _popup_id to a dedicated column - in-page submissions write empty, popup submissions write the popup ID.
Dynamic tags are resolved before SheetLinkWP sees them
Elementor's dynamic tag engine runs server-side before any form action fires. That means when SheetLinkWP receives the payload, Post Title, URL Variable, ACF fields, and User Info tags are already resolved to their final string values. No shortcode pass-through issues.
Run SheetLinkWP alongside Elementor's built-in Webhook action
If you already use Elementor's built-in Webhook action for something else (like a Slack notification), keep it. Elementor fires all registered form actions in sequence. SheetLinkWP is additive - it doesn't replace or conflict with your existing actions.
Hidden fields + URL variables for attribution
Add a hidden field to every form with a dynamic tag of URL Variable: utm_source (and another for campaign, medium, etc.). Even if SheetLinkWP's automatic UTM capture is off, this pattern ensures UTM data is attached to the submission directly through Elementor's own mechanism.
Troubleshooting
Popup form submissions aren't captured
Verify the popup form has a unique form name in Elementor. SheetLinkWP uses the form name to identify which mapping to apply. If the popup form has the same name as a page form, they'll share the same mapping (which is fine if they have the same fields).
Dynamic tag values appear as raw shortcodes
This typically means the dynamic tag isn't resolving before submission. Elementor should resolve dynamic tags before the form action fires. If you see raw shortcodes, check that your Elementor Pro version is up to date.
Fields I added show up with IDs like field_a1b2c3 in the mapping UI
You forgot to set Custom IDs on the new fields. Open the form widget in the Elementor editor, click each field, go to the Advanced tab, and set a readable Custom ID. Re-save the form - SheetLinkWP will pick up the new IDs on the next page load.
Multi-step form partial submissions aren't in the Sheet
By design. Elementor's multi-step form only fires <code>new_record</code> when the final step submits. To capture partials (e.g., the user completed steps 1 and 2 but abandoned step 3), enable "Capture partial submissions" in SheetLink > Settings > Elementor - they'll route to a separate Sheet tab.
Submissions duplicate on retry
Rare, but happens if Elementor's action pipeline is interrupted mid-run (e.g., server timeout). Map <code>_submission_id</code> to column A and use SheetLinkWP's deduplication Apps Script template, which checks for existing rows with the same submission ID and updates rather than appending.
Elementor Forms to Google Sheets: Options Compared
| Feature | Zapier | Webhook Pro | SheetLinkWP | |
|---|---|---|---|---|
| Monthly cost | $29.99+/mo | $0 + dev time | $0 (one-time $39) | |
| Popup form support | Yes | Yes | Yes | |
| Dynamic field capture | Yes | Partial | Yes | |
| UTM capture | Extra steps | Manual | Automatic | |
| Retry on failure | Auto-retry | No | Built-in queue | |
| Setup time | ~10 minutes | ~30+ minutes | ~5 minutes |
Frequently Asked Questions
Do I need Elementor Pro for this to work?
Yes. The free version of Elementor does not include a form widget. Elementor Pro (any tier) is required for forms.
Does SheetLinkWP capture popup form submissions?
Yes. SheetLinkWP hooks into Elementor Pro's core form submission action, which fires for all form locations: page content, popups, sticky bars, and slides.
Can I map Elementor's conditional fields?
Yes. SheetLinkWP captures the field values as submitted. If a field is hidden by conditional logic and no value is submitted, that column is left blank in the Sheet row.
What about Elementor's built-in form actions?
SheetLinkWP runs alongside Elementor's built-in actions. Your email notifications, redirect actions, and other integrations continue working.
Does it capture form submissions from Elementor templates on multiple pages?
Yes. Even if the same form template is reused across dozens of pages, SheetLinkWP captures every submission and writes _post_id and _post_title so you know which page generated the lead.
Will SheetLinkWP work with Elementor popups?
Yes. Elementor popup forms fire the same new_record action as page forms. SheetLinkWP even writes the popup ID to a column so you can filter popup-generated leads separately.
Can I capture dynamic tag values in the Sheet?
Yes. Elementor resolves dynamic tags before firing the form action, so values like Post Title, ACF fields, and URL variables arrive at SheetLinkWP as plain strings ready to be written to columns.
Is Elementor Free compatible?
No. The Elementor form widget is a Pro-only feature. You need Elementor Pro (any tier, starting at $59/year) for SheetLinkWP's Elementor integration to have anything to hook into.
Related How-To Guides
Connect Elementor Forms to Google Sheets in 5 Minutes
Pages, popups, sticky bars - every Elementor form captured. One-time price, no Zapier.