How to Connect WPForms to Google Sheets
The complete 2026 guide for sending WPForms entries to Google Sheets - without paying for Zapier tasks or the $199/year WPForms Google Sheets addon.
TL;DR
Install SheetLink Forms, deploy a Google <a href="/docs/google-sheets-setup">Apps Script</a> webhook, paste the URL into SheetLink settings, select your WPForms form, map fields to columns, and test. Takes about 5 minutes. No Zapier, no $199/yr WPForms addon, no recurring fees.
WPForms is the most popular premium WordPress form builder, with over 6 million active installs. It ships with a polished drag-and-drop builder, entry storage in the WordPress database, conditional logic, payment integrations, and more than 30 paid addons. One of those addons is the Google Sheets integration - but it's only available on the Elite plan at $199/year (billed annually, renewal not discounted).
For many WPForms users that's a frustrating paywall. You might be running WPForms Lite (free) or the Basic plan ($49.50/yr) and only need one feature: rows in a spreadsheet. Paying $199/year just to unlock Sheets writes is a hard sell - especially when the functionality itself is simple (append row, on submit).
SheetLinkWP fills that gap. It's a separate WordPress plugin that adds Google Sheets delivery to WPForms at any tier - Lite, Basic, Plus, Pro, Elite - for a one-time $39 payment. No recurring fee, no addon dependency, and it also works with six other form plugins if you ever migrate. This tutorial walks through the complete WPForms-specific setup, including Smart Tag handling, payment field capture, and how to co-exist with the native WPForms addon during a migration.
Why WPForms -> Google Sheets Is Worth Setting Up
WPForms stores entries in WordPress - specifically in the wp_wpforms_entries and wp_wpforms_entry_meta tables. That's good for day-to-day access inside the admin, but it creates three limitations. First, only WordPress administrators can see entries (sharing with a sales team or client means giving them a WP login). Second, reporting is limited to what WPForms' admin UI offers - no pivot tables, no custom filters, no ability to combine with other data. Third, entries are locked to your WP install; if you move hosts or rebuild, migration is manual.
A Google Sheet solves all three. Row-based data is sortable, filterable, and shareable with view-only or edit permissions to specific email addresses. You can build pivots, charts, and Looker Studio dashboards on top of it. And the Sheet persists independently of your WordPress install - if your site goes down, the historical data is safe in Google Drive.
For most WPForms users, the Sheet becomes the working view of leads and submissions. The WordPress admin becomes a fallback. SheetLinkWP makes this setup trivial: one plugin, one webhook, five minutes.
How SheetLinkWP Connects WPForms to Google Sheets
SheetLinkWP hooks into WPForms' processing pipeline and extracts the entry data before it would otherwise be stored or emailed. The flow:
- 1. WPForms processes the submission: Standard WPForms validation runs, including required field checks, reCAPTCHA, and conditional logic evaluation. Only valid submissions proceed.
- 2. SheetLinkWP fires on wpforms_process_complete: This hook runs after validation and before the confirmation message is shown. SheetLinkWP reads the full
$fieldsarray plus the$entryand$form_datacontexts. - 3. Smart Tags are resolved: If you've mapped Smart Tags like
{user_ip},{page_title}, or{query_var key="utm_source"}, SheetLinkWP resolves them through WPForms' own Smart Tag engine - no reimplementation, no drift. - 4. Payment fields join the payload: If your form uses Stripe or PayPal fields, the
amount,currency,payment_status, andtransaction_idare appended to the payload before it's sent. - 5. Row written to Google Sheets: The payload is POSTed to your Apps Script webhook, which appends a new row. The entire round-trip typically takes 300-600ms.
- 6. Entry still lands in WordPress: Unless you explicitly disable WPForms entry storage, your entries continue to appear in the WP admin. SheetLinkWP is additive, not replacement.
What You Need
- A WordPress site with WPForms installed (Lite or any paid tier) and at least one form
- 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 descriptively - "WPForms Leads" or "Contact Submissions 2026". Leave it blank; SheetLinkWP will generate column headers automatically from your first submission.
- 2
Deploy the Apps Script webhook
In your Google Sheet, go to Extensions > <a href="/docs/google-sheets-setup">Apps Script</a>. Replace the default code with the SheetLinkWP receiver script (found in your WordPress admin under SheetLink > Settings > Setup Guide). Click Deploy > New deployment, select "Web app", set access to "Anyone", and deploy. Copy the generated URL.
- 3
Install SheetLink Forms
Download SheetLink Forms from sheetlinkwp.com or install from WordPress.org. Upload via Plugins > Add New > Upload Plugin, then activate. The SheetLink menu appears in your admin sidebar.
- 4
Connect the webhook
Go to SheetLink > Settings, paste your Apps Script URL, and save. The plugin tests the connection automatically and shows a success indicator.
- 5
Map WPForms fields
Navigate to SheetLink > Field Mapping. Select "WPForms" as the form plugin, then pick your specific form. SheetLinkWP reads your WPForms form structure and lists every field. Map each field to a Sheet column. WPForms field IDs are numeric (like field_1, field_2), but SheetLinkWP displays the field labels alongside IDs so you can easily identify them.
- 6
Enable enrichment data (optional)
Toggle on UTM capture, click ID tracking (GCLID, fbclid, msclkid), and metadata fields like submission timestamp, page URL, and referring URL. These appear as additional columns in your Sheet.
- 7
Test your setup
Submit a test entry through your WPForms form on the front end. Check your Google Sheet within a few seconds for the new row. Verify all fields are in the correct columns.
WPForms Field & Smart Tag Reference
WPForms identifies fields by numeric ID assigned at the time the field was created. SheetLinkWP shows these IDs alongside the field label you see in the builder. Compound fields (Name, Address) expose sub-values as separate mappable items. Smart Tags - WPForms' dynamic placeholders - can be mapped directly into columns. The common ones:
| Field / Smart Tag | Source | Notes |
|---|---|---|
field_N | Single-value field | Text, email, URL, textarea, number, phone, hidden. Straight value capture. |
field_N.first | Name field (first) | WPForms name field split. Map .first, .middle, .last to separate columns. |
field_N.last | Name field (last) | Pair with .first for full name segmentation. |
field_N.address1 | Address line 1 | Address fields also expose .address2, .city, .state, .postal, .country. |
field_N.value | Checkbox / radio / dropdown | Single-select value. Multi-select checkboxes write comma-separated values. |
field_N.amount | Payment fields | Stripe/PayPal/Square. Pair with .currency, .status, .transaction_id. |
field_N.file | File upload URL | Returns the WordPress media URL (not a Drive link unless the Drive add-on is enabled). |
{admin_email} | WPForms Smart Tag | Site admin email. Useful for audit columns. |
{user_ip} | WPForms Smart Tag | Submitter IP address (respects your WP privacy settings). |
{user_id} | WPForms Smart Tag | WordPress user ID if the submitter is logged in, otherwise empty. |
{user_email} | WPForms Smart Tag | Authenticated user's email. Pair with {user_id} for B2B SaaS lead capture. |
{page_title} | WPForms Smart Tag | Title of the page containing the form. Best way to segment same-form-multiple-pages scenarios. |
{page_url} | WPForms Smart Tag | Full URL including query string. UTMs are included by default. |
{query_var key="utm_source"} | WPForms Smart Tag | Any URL query parameter. Use for custom attribution or referral codes. |
{form_name} | WPForms Smart Tag | Name of the form as defined in the WPForms editor. |
{entry_id} | WPForms Smart Tag | Numeric WPForms entry ID (when entry storage is enabled). Use this as a cross-reference key between Sheets and the WP admin. |
{date format="Y-m-d H:i:s"} | WPForms Smart Tag | Submission timestamp. Specify any PHP date format. |
Real-World Use Cases
Skip the Elite plan - keep Basic or Pro
You're on WPForms Pro ($99.50/yr), which covers conditional logic, payment integration, and user registration. You don't need file-upload branding or Salesforce sync. The only reason to upgrade to Elite ($199.50/yr) is the Google Sheets addon. SheetLinkWP eliminates that single reason - and pays for itself in under 5 months of the $100/yr tier gap.
{page_title}, {date}, and {entry_id} as metadata columns. Keep WPForms' native entry storage on for local backup. Dual-write payment data for finance reconciliation
Your form takes Stripe payments via WPForms Pro. Finance wants a running spreadsheet of transactions they can reconcile with Stripe's monthly export - without giving them admin access to your WordPress site. Map the payment amount, currency, transaction ID, and status to a dedicated Sheet tab.
field_N.amount, field_N.currency, field_N.transaction_id, field_N.status, plus {entry_id} for Stripe-side cross-reference. Route to a Sheet tab named "Stripe Reconciliation" using SheetLinkWP's conditional routing. Share WPForms leads with non-admin team members
Your sales team wants real-time access to lead submissions, but you don't want to create WordPress admin accounts for five salespeople. A shared Google Sheet with view or comment permissions gives them everything they need - new rows appear instantly, sortable by date or source.
Paginated multi-step forms without losing context
Long WPForms forms with page breaks sometimes produce partial submissions if users abandon mid-form. WPForms Pro's Form Abandonment addon captures partials - SheetLinkWP can write those partials to a second Sheet tab for nurture campaigns.
{entry_status} = "abandoned", route to "Abandoned" tab with a shorter column set (email + last-page-reached). Advanced Tips
Use {entry_id} as the primary key between systems
WPForms' numeric entry ID is unique per form and stable forever. Mapping {entry_id} to column A of your Sheet gives you a permanent reference back to the WP admin. If you ever need to pull the full entry data (attached files, IP history, admin notes), you can find it instantly by ID.
Smart Tags inside Smart Tags work
You can combine tags like {page_title} - {date format="Y-m-d"} into a single Sheet cell. This is useful for building human-readable lead labels: "Pricing Page - 2026-04-18" makes scanning rows at a glance much faster than two separate columns.
Hidden fields are the attribution sweet spot
WPForms supports hidden fields with Smart Tag defaults. Add a hidden field with default {query_var key="ref"} to capture any custom referral parameter your marketing uses (e.g., ?ref=newsletter_2026_q2). SheetLinkWP reads hidden fields just like visible ones, giving you per-campaign attribution without visible clutter on the form.
Conditional logic still writes every mapped field
If a field is hidden by WPForms conditional logic, it's not submitted. SheetLinkWP writes an empty cell in that column. This is usually correct behavior, but if you need to know which branch a user took, add a hidden field in each branch with a sentinel value (e.g., hidden field "branch" with default "contact" on the contact path, default "demo" on the demo path).
Run the WPForms Sheets addon and SheetLinkWP side-by-side
If you already have WPForms Elite and the native addon installed, you can run SheetLinkWP alongside it temporarily. Point them at different Sheets (or different tabs of the same Sheet). This dual-write setup is the safest way to validate SheetLinkWP's output before you cancel Elite at renewal.
Troubleshooting
WPForms entries appear in the WordPress dashboard but not in Google Sheets
Verify the webhook URL is correct in SheetLink > Settings. Check the Delivery Log for errors. The most common issue is an expired Apps Script deployment - create a new deployment and update the URL.
Multi-part name fields show as blank
WPForms splits name fields into first/last. In SheetLink field mapping, you'll see separate entries for "Name (First)" and "Name (Last)". Map each to its own column.
File upload fields only show the filename, not the file
SheetLinkWP sends the file URL (the WordPress media URL) to Google Sheets, not the file binary. You can click the URL in the Sheet to access the uploaded file.
Stripe payment fields are empty in the Sheet
Stripe payment confirmation is asynchronous - WPForms fires the submission hook before Stripe returns the final status. In SheetLink > Settings, enable "Wait for payment confirmation" (adds ~500ms to submission but guarantees populated payment fields). Alternatively, let the row write twice: first with status "pending", then updated via webhook when Stripe confirms.
Smart Tags show as literal {user_ip} text in the Sheet
This happens when SheetLinkWP's Smart Tag resolution is disabled. Go to SheetLink > Settings and enable "Resolve WPForms Smart Tags". If it's already on, a plugin conflict may be preventing WPForms' Smart Tag engine from loading - check the Delivery Log for resolution errors.
Conditional logic fields I expect to see are missing
Fields hidden by conditional logic aren't submitted. SheetLinkWP writes an empty cell for those columns. If you want to know which branch was taken, add a hidden sentinel field inside each conditional branch with a unique default value.
WPForms to Google Sheets: Your Options Compared
| Feature | WPForms Addon | Zapier | SheetLinkWP | |
|---|---|---|---|---|
| Price | $199/yr (Elite plan) | $29.99+/mo | $39 one-time | |
| Works with WPForms Lite | No (Elite only) | Yes | Yes | |
| Per-submission fee | No | Yes ($0.01-0.03/task) | No | |
| UTM capture | No | Extra steps | Automatic | |
| Retry on failure | No public info | Auto-retry | Built-in queue | |
| Conditional routing | No | Multi-path Zap | Built-in | |
| Works with other form plugins | No (WPForms only) | Yes (per-Zap setup) | Yes (12 plugins, 1 setup) | |
| Total 3-year cost | $597 | $1,080+ | $39 |
Frequently Asked Questions
Does SheetLinkWP work with WPForms Lite (the free version)?
Yes. SheetLinkWP works with WPForms Lite, Basic, Plus, Pro, and Elite. Unlike the native WPForms Google Sheets addon which requires the $199/yr Elite plan.
Can I replace the WPForms Google Sheets addon with SheetLinkWP?
Yes. SheetLinkWP provides the same core functionality - sending form entries to Google Sheets - plus UTM capture, conditional routing, retry queue, and support for 6 other form plugins.
Will SheetLinkWP capture WPForms conditional logic field values?
Yes. SheetLinkWP captures whatever field values are submitted, including fields shown/hidden by WPForms conditional logic.
Can I send WPForms payments data to Google Sheets?
Yes. Payment fields (amount, status, transaction ID) from WPForms Stripe or PayPal are captured and sent to your Sheet alongside the form data.
What happens if I switch from WPForms to another form plugin?
SheetLinkWP supports 12 form plugins. If you switch from WPForms to Gravity Forms (or any other supported plugin), you just update the field mapping. The same webhook URL and Google Sheet continue to work.
Do I need to keep WPForms entry storage enabled?
No. If you disable storage to keep your database lean, SheetLinkWP still captures every submission from the WPForms processing hook. Your Sheet becomes the system of record, and the WordPress database stays light. For most teams, we recommend leaving entry storage on for 30 days as a local fallback.
Does SheetLinkWP work with the WPForms Form Abandonment addon?
Yes. Partial/abandoned submissions captured by the WPForms Abandonment addon fire the same processing hooks, and SheetLinkWP writes them to your Sheet just like complete submissions. Use conditional routing to send abandoned entries to a separate tab for nurture follow-up.
Can I run the native WPForms Google Sheets addon alongside SheetLinkWP?
Yes. They don't conflict - both hook into WPForms separately. Running them in parallel is the safest way to validate SheetLinkWP's output before you cancel the Elite plan at renewal.
Are UTM parameters captured for WPForms?
Yes. Enable UTM capture in SheetLink > Settings and five columns (utm_source, utm_medium, utm_campaign, utm_term, utm_content) are added to every row automatically. No hidden field setup required.
Related How-To Guides
Connect WPForms to Google Sheets - No Subscription Required
One-time $39 payment. Works with WPForms Lite through Elite. No per-submission fees.