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.

Last updated: 2026-03-13 7 min read

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. 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_record action when submitted.
  2. 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. 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. 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. 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. 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

Field mapping tip: Elementor form fields use the ID you assign in the widget (e.g., "name", "email", "company"). If you haven't customized IDs, Elementor generates defaults like "field_1", "field_2". SheetLinkWP shows these IDs in the mapping interface. Dynamic tag values from Elementor are captured as their resolved text.
  1. 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. 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. 3

    Install SheetLink Forms

    Download from sheetlinkwp.com or WordPress.org. Upload, install, and activate.

  4. 4

    Connect the webhook

    In SheetLink > Settings, paste the Apps Script URL and save.

  5. 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. 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.

Field mapping: 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).

Field mapping: Map all fields from all steps + _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.

Field mapping: Visible fields + hidden fields with dynamic tag values. Common patterns: a hidden 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.

Field mapping: 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

FeatureZapierWebhook ProSheetLinkWP
Monthly cost $29.99+/mo$0 + dev time$0 (one-time $39)
Popup form support YesYesYes
Dynamic field capture YesPartialYes
UTM capture Extra stepsManualAutomatic
Retry on failure Auto-retryNoBuilt-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.