Description
Send WordPress form submissions to Google Sheets or Excel automatically with SheetLink Forms.
SheetLink connects the forms you already use to a spreadsheet in real time. Every submission becomes a properly mapped row – no manual exports, no per-submission fees, and no Zapier account.
Stop paying Zapier every month just to land form submissions in a spreadsheet. SheetLink delivers submissions from 12 major WordPress form plugins directly to Google Sheets – free, unlimited, and with no third-party middleware in the path – and can mirror every submission to Excel Online, Airtable, and Notion at no extra cost.
Setup takes about three minutes: pick your form plugin, map fields to spreadsheet columns, and connect your Google account in one click – SheetLink creates the sheet for you (or you pick an existing one with Google’s own file picker) and rows start appearing immediately. Prefer not to connect an account? The classic Apps Script method is still built in: paste the generated script into your sheet and nothing but your own Google script ever touches the data. Either way, every submission flows straight from your WordPress server to your sheet over HTTPS, with automatic retries if Google is briefly unavailable.
Who this is for
- Marketers and lead-gen teams who need lead data in Sheets for triage, reporting, and handoff – without adding another monthly SaaS line item.
- Agencies managing forms across many client sites who want one consistent tool instead of ten different form-to-sheets plugins.
- Developers and site owners who want a local-first tool that doesn’t call home, doesn’t require registration, and doesn’t break when a third-party API changes.
Why SheetLink
- Free Zapier alternative. Unlimited form submissions at $0/month – no per-task fees, no trial caps, no feature gates on the core delivery pipeline.
- 12 form plugins, one interface. Contact Form 7, WPForms, Gravity Forms, Elementor Pro, Fluent Forms, Formidable, Ninja Forms, Forminator, Everest Forms, Beaver Builder, Divi, and WS Form – all from the same admin screen.
- More destinations than Google Sheets. Mirror the same submission into Excel Online, Airtable, and Notion for free – or make any one of them your rule’s only destination with the Primary Destinations add-on. Multi-CRM Routing (HubSpot, Salesforce, Pipedrive, Zoho) is a separate paid add-on.
- Never lose a lead. Automatic retry queue recovers failed deliveries up to three times, so a brief Google outage doesn’t cost you a customer.
- Full marketing attribution. UTM parameters, GCLID, fbclid, msclkid, IP, page URL, and referrer captured automatically on every submission and mapped to columns you control.
- Local-first architecture. Form submissions go directly from your WordPress server to Google – never through SheetLink’s servers. The one-click connection talks to SheetLink’s sign-in broker only to link and renew your Google account (your form data never passes through it), and the classic Apps Script method contacts nothing but Google at all. No telemetry, no activation pings, no required account.
The free core plugin covers the entire delivery pipeline (12 form integrations, retry queue, delivery logs, UTM capture, conditional routing, GDPR tools, local analytics, smart mapping, and a guided setup wizard) and works on any WordPress site without registration or account creation. Premium add-ons – Advanced Routing, CRM Fan-Out, Two-Way Sync, WooCommerce Sync, Extra Integrations, White-Label, Branded Reports, Agency Dashboard, and Role-Based Menu Visibility – require an active SheetLink license; see sheetlinkwp.com/pricing for tiers.
Supported Form Plugins
- Elementor Pro Forms
- Contact Form 7
- Gravity Forms
- WPForms
- Fluent Forms
- Formidable Forms
- Ninja Forms
- Forminator
- Everest Forms
- Beaver Builder
- Divi
- WS Form
How It Works
- Install SheetLink Forms
- Create a sync rule – pick your form plugin, map fields to spreadsheet columns
- Connect Google Sheets in one click: sign in with Google, and SheetLink creates a sheet for you or lets you pick an existing one with Google’s file picker
- Every form submission automatically appears in your Google Sheet
Prefer a zero-account setup? Use the classic method instead of step 3: copy the generated Google Apps Script into your sheet and deploy it as a web app. Both methods are free and fully supported.
Free features (no license required)
- All 12 form integrations – Elementor Pro, Contact Form 7, Gravity Forms, WPForms, Fluent Forms, Formidable, Ninja Forms, Forminator, Everest Forms, Beaver Builder, Divi, WS Form
- One-click Google Sheets connect – sign in with Google, create a new sheet in one click or pick an existing one with Google’s file picker, and rows appear with a labeled header. Uses Google’s most restrictive
drive.filescope: SheetLink can only ever see sheets it creates or that you pick – never the rest of your Drive - Unlimited sync rules – different forms to different sheets
- Field mapping – choose exactly which fields go to which columns
- Smart mapping suggestions – local heuristic that proposes Google Sheets column headers from your form field names (no external calls)
- Guided setup wizard – first-run wizard walks new installs from activation to a working Google Sheet connection in three minutes
- Auto-timestamps – optional timestamp column on every submission
- Delivery logs – see every submission with status and error details
- Automatic retry queue – failed deliveries are retried up to 3 times
- UTM & marketing data capture – auto-append IP, page URL, UTM parameters, GCLID/fbclid/msclkid
- Conditional routing – route submissions to different sheets or tabs based on field values
- Local analytics – submissions-per-day, peak hours, top forms, duplicate detection, week-over-week trend; stored in your own WordPress database
- Test button – send sample data to verify your setup
- Classic Apps Script method – prefer no connected account? SheetLink generates the Google Apps Script for you, just copy & paste
- GDPR data export and deletion – integrates with WordPress privacy tools
- Multisite central management – network admin overview of all subsites
Premium features (require an active SheetLink license)
The following features require a license key activated on the SheetLink License page. See sheetlinkwp.com/pricing for tiers.
- Multi-Destination Routing – fan one submission out to several destinations with priority order and optional fallback webhooks (Multi-Destination Routing add-on, or any MRR tier with fan-out slots)
- CRM Fan-Out – mirror submissions into HubSpot, Salesforce, Zoho, or Pipedrive alongside your Google Sheet (CRM Fan-Out add-on)
- Two-Way Sync – edit a row in Google Sheets and have the change arrive back in WordPress via REST hook (Two-Way Sync add-on)
- WooCommerce Sync – push orders, refunds, and customers to Google Sheets in real time (WooCommerce Sync add-on)
- Primary Destinations – make Excel Online, Airtable, or Notion a rule’s sole destination, with no Google Sheet involved. One add-on covers all three; mirroring to them alongside Google Sheets stays free (Primary Destinations add-on)
- Extra Integrations – JetFormBuilder, Bricks Builder, MetForm, Kali Forms, HappyForms (Integrations Bundle)
- White-Label Admin – replace the plugin menu label, logo, and colors (White-Label add-on or Agency Plus)
- Agency Dashboard – multisite summary across all network sites (Agency Plus)
- Branded Reports – generate client-facing HTML reports with your own branding (Agency Plus)
- Role-Based Menu Visibility – hide SheetLink menu items from non-administrator roles (Agency Plus)
- Hosted Lead Scoring – optional 0-100 lead scoring via the SheetLink scoring API (AI Lead Scoring add-on; still requires an explicit consent checkbox before any data is transmitted)
External services
This plugin contacts the following external services. Google is core to the plugin’s function – via the Google Sheets API (one-click connection) or a user-deployed Google Apps Script, depending on which connection method you choose per rule. The others are optional: Microsoft Graph only when you connect Excel Online, the SheetLink License Server only if you activate a paid license, and the SheetLink Lead Scoring API only behind an explicit consent checkbox (disabled by default).
Google Sheets API + Google Drive (one-click connection, v1.12.0+)
- What it is: Google’s official Sheets and Drive APIs, used when you connect a Google account with the one-click method.
- When it is called: Only after you click “Connect Google” on the SheetLink settings page and grant consent at Google’s own sign-in screen. With no connected account, no calls are made.
- What data is sent: Per matching submission, the form field values mapped by the user (plus optional enrichment data such as timestamps, UTM parameters, IP address, and page URL if enabled), written directly from your WordPress server to
https://sheets.googleapis.com/. Creating a sheet and listing tabs use the same API; the file picker useshttps://www.googleapis.com/drive/v3/and loads Google’s Picker JavaScript fromhttps://apis.google.com/in wp-admin only. - Scope:
drive.fileonly – SheetLink can access only spreadsheets it creates or that you explicitly pick with the picker. It can never see the rest of your Google Drive. - Token broker: The OAuth sign-in and periodic token renewal go through SheetLink’s broker at
https://sheetlinkwp.com/api/sheetlinkwp/oauth/google/so the Google client secret stays on SheetLink’s servers and not in the plugin. Your form submission data never passes through the broker. The refresh token is stored encrypted in your own WordPress database and is cleared the moment you disconnect. - Privacy considerations: If your forms collect personal data and you use the one-click connection, list
sheetlinkwp.com(the OAuth broker) andgoogleapis.com(Google’s API) as data processors in your privacy notice. - Google Sheets API documentation: https://developers.google.com/sheets/api
- Google Terms of Service: https://policies.google.com/terms
- Google Privacy Policy: https://policies.google.com/privacy
Google Apps Script (classic method)
- What it is: A user-deployed Google Apps Script web app that receives form data and writes it to your Google Sheet.
- What data is sent: The form field values mapped by the user, plus optional enrichment data (timestamps, UTM parameters, IP address, page URL) if enabled by the site administrator.
- When it is called: Each time a WordPress form submission matches a sync rule that uses the classic method.
- Where data goes: User-deployed Google Apps Script web app URLs hosted at
https://script.google.com/orhttps://script.googleusercontent.com/. The plugin validates that all receiver URLs begin with these prefixes. - No account required: With this classic method the plugin does not use Google API keys or OAuth – you deploy a free Google Apps Script receiver in your own Google Sheet, and nothing but Google is ever contacted.
- Google Apps Script documentation: https://developers.google.com/apps-script
- Google Terms of Service: https://policies.google.com/terms
- Google Privacy Policy: https://policies.google.com/privacy
SheetLink License Server (only if you activate a license)
- What it is: The SheetLink activation server that issues and verifies entitlements for paid features.
- When it is called: (a) Once when you paste a license key on the SheetLink License page, (b) every 12 hours in the background to refresh the cached entitlements, and (c) when you click “Re-check entitlements” in the admin. If you never activate a license, this server is never contacted.
- What data is sent: Your license key (or purchase email as a fallback) and this site’s domain (
home_url()). No form submissions, no user accounts, no site content are ever sent to this endpoint. - Where data goes:
https://sheetlinkwp.com/api/sheetlinkwp/verifyandhttps://sheetlinkwp.com/api/sheetlinkwp/entitlements, over HTTPS. (Installs older than 1.13.1 contactsiteanswerai.comfor the same endpoints – a legacy domain the API used to be hosted under, which now forwards to the address above.) - Opt-out: Deactivate from the License page. The free features keep working indefinitely with no further calls.
SheetLink Lead Scoring API (optional, off by default)
- What it is: A hosted lead-scoring service provided by SheetLink. It returns a 0-100 score for each submission.
- When it is called: Only when the Analytics feature is enabled, an API token is configured on the Analytics settings page, AND the administrator ticks the “I understand form submission data will be transmitted…” consent checkbox. If any one of these is missing, no data is sent.
- What data is sent: The submitted form field values, the form identifier, the source form plugin name, and the site URL (
home_url()). No WordPress user account data, admin passwords, or database records unrelated to the submission are sent. - Where data goes:
https://sheetlinkwp.com/api/sheetlinkwp/lead-scoreover HTTPS, authenticated with a Bearer token provided by SheetLink. - Opt-in and opt-out: The feature is off by default. Removing the token, unchecking the consent box, or disabling the Analytics feature immediately stops all requests.
- Privacy considerations: If your forms collect personal data, you should list
sheetlinkwp.comas a data processor in your own privacy notice before enabling this feature. - Terms of Service: https://sheetlinkwp.com/terms
- Privacy Policy: https://sheetlinkwp.com/privacy
3. Microsoft Graph API (only when the Excel Online destination is connected, v1.10.0+)
- What it is: Microsoft’s REST API for OneDrive + Excel Online. Used to insert new rows into a customer-selected Excel table after each form submission.
- When it is called: Only after a customer (a) clicks “Connect Excel” in
SheetLink Forms -> Destinations -> Excel Onlineand grants consent at Microsoft’s sign-in page, (b) picks a workbook + table, and (c) enables the Excel mirror on a specific rule. With no connection, no calls are made. - What data is sent: Per submission, the form field values mapped to your chosen Excel columns. No WordPress user account data, admin passwords, or any field you have not explicitly mapped.
- Where data goes:
https://graph.microsoft.com/v1.0/me/drive/items/{workbook}/workbook/tables/{table}/rowsover HTTPS, authenticated with an OAuth access token. Token refresh goes through SheetLink’s OAuth broker athttps://sheetlinkwp.com/api/sheetlinkwp/oauth/microsoft/refreshso the Azure client secret stays on SheetLink’s servers and not in the plugin. - Opt-in and opt-out: The feature is off by default. Disconnecting the Microsoft account immediately stops all calls and clears the encrypted refresh token from
wp_options. Field mappings are preserved for one-click reconnection. - Token storage: The Microsoft refresh token is encrypted with AES-256-GCM (key derived from
wp_salt('auth')via HKDF) before being written towp_options. The access token is short-lived (~1 hour) and is also stored inwp_options. - Privacy considerations: If your forms collect personal data and you enable the Excel mirror, list
sheetlinkwp.com(the OAuth broker) andgraph.microsoft.com(the Microsoft 365 API) as data processors in your privacy notice. - Microsoft Privacy Policy: https://privacy.microsoft.com/
- Terms of Service: https://sheetlinkwp.com/terms
- Privacy Policy: https://sheetlinkwp.com/privacy
No other external services are contacted by this plugin. All other features – smart mapping suggestions, local analytics charts, duplicate detection, conditional and advanced routing, branded reports, role-based views, white-label, and the agency dashboard – run entirely on your own WordPress server.
Screenshots





Installation
From your WordPress admin (recommended)
- In your WordPress admin, go to Plugins Add New.
- Search for “SheetLink Forms”.
- Click Install Now, then Activate.
- The setup wizard opens automatically and walks you through connecting your first form to Google Sheets in about three minutes.
Manual upload
- Download the
sheetlink-forms.zipfile. - In WordPress, go to Plugins Add New Upload Plugin and upload the zip, or extract it into
/wp-content/plugins/sheetlink-forms/. - Activate the plugin from the Plugins menu.
- The setup wizard opens automatically. If you dismissed it, visit SheetLink in the admin menu and click + Add Rule to configure your first sync rule manually.
What you’ll need
- A WordPress form plugin (Elementor Pro, Contact Form 7, Gravity Forms, WPForms, Fluent Forms, Formidable, Ninja Forms, Forminator, Everest Forms, Beaver Builder, Divi, or WS Form)
- A Google account with access to Google Sheets
- About three minutes
FAQ
-
How do I send Contact Form 7 submissions to Google Sheets?
-
Install SheetLink Forms, create a sync rule, choose your Contact Form 7 form, connect Google, and map the form fields to spreadsheet columns. New submissions are added as rows automatically. Step-by-step guide: Connect Contact Form 7 to Google Sheets.
-
Can I connect WPForms Lite to Google Sheets for free?
-
Yes. Both WPForms Lite and WPForms Pro are supported, and the free SheetLink plugin sends unlimited WPForms submissions to Google Sheets. Step-by-step guide: Connect WPForms to Google Sheets.
-
How do I connect Elementor Forms to Google Sheets?
-
Create a sync rule, select your Elementor Pro form, connect or pick a Google Sheet, and map each Elementor field to a column. Step-by-step guide: Connect Elementor Forms to Google Sheets.
-
Does SheetLink support Gravity Forms to Google Sheets?
-
Yes. Gravity Forms entries go to Google Sheets in real time, with custom field mapping, delivery logs, and automatic retries. Step-by-step guide: Connect Gravity Forms to Google Sheets.
-
Can WordPress forms send entries to Excel Online?
-
Yes. SheetLink mirrors submissions into an Excel Online workbook on Microsoft 365 or OneDrive for free, alongside your Google Sheet. To make Excel a rule’s only destination, the Primary Destinations add-on is required. Note that Microsoft’s Excel API supports business accounts only – personal Outlook.com OneDrive is not supported by Microsoft for this. Step-by-step guide: WordPress forms to Microsoft 365.
-
Do I need to create an account or register?
-
No. SheetLink Forms works immediately after installation. No account, no registration, no license key required.
-
Do I have to paste an Apps Script into my sheet?
-
Not anymore. Connect your Google account in one click and SheetLink writes rows through Google’s official Sheets API – it can create the sheet for you, or you pick an existing one with Google’s own file picker. The classic Apps Script method remains fully supported for users who prefer a zero-account, script-only setup; both are free.
-
Do I need a Zapier account?
-
No. SheetLink Forms sends data directly from WordPress to Google Sheets – through your one-click connected Google account or via a free Google Apps Script. No third-party services needed.
-
Does the plugin call home or track anything?
-
No telemetry, no analytics beacons, no activation pings. Form submissions are sent only to Google (or, if you enable those mirrors, Microsoft, Airtable, or Notion) – never through SheetLink’s servers. If you use the one-click Google or Microsoft connection, the sign-in handshake and periodic token renewal go through SheetLink’s OAuth broker at sheetlinkwp.com; your form data never does. The optional Lead Scoring add-on (disabled by default, requires an API token and an explicit consent checkbox) is the only feature that sends submission data to SheetLink. See “External services” above for the full disclosure.
-
Which form plugins are supported?
-
Elementor Pro Forms, Contact Form 7, Gravity Forms, WPForms, Fluent Forms, Formidable Forms, Ninja Forms, Forminator, Everest Forms, Beaver Builder, Divi, and WS Form.
-
How do I set up the Google Sheet?
-
SheetLink Forms generates the Google Apps Script for you. Click “Get Script” on any rule, copy the code, and paste it into your Google Sheet’s Apps Script editor (Extensions > Apps Script). Then deploy it as a web app.
-
Can I send different forms to different sheets?
-
Yes. Create multiple sync rules, each pointing to a different Google Sheet (a different connected sheet, or a different Apps Script URL with the classic method).
-
Is my data secure?
-
Form submission data is sent directly from your WordPress server to Google over HTTPS: to
sheets.googleapis.com(Google’s official Sheets API) when you use the one-click connection, or to the Google Apps Script URL you configure with the classic method (onlyscript.google.comandscript.googleusercontent.comURLs are allowed as receivers). It never passes through SheetLink’s servers. If – and only if – you enable the optional Lead Scoring add-on on the Analytics page, a copy of each submission is also sent over HTTPS tohttps://sheetlinkwp.com/api/sheetlinkwp/lead-score. Every other feature of the plugin runs locally on your WordPress server. -
The submission is logged as failed and automatically retried up to 3 times (every 15 minutes). You can also retry manually from the Retry Queue page.
-
Is SheetLink a free Zapier alternative?
-
Yes. Zapier’s base plan starts around $20/month and charges per task. SheetLink delivers unlimited form submissions from your WordPress site directly to Google Sheets at no cost – no per-task fees, no subscription, no registration. You own the entire pipeline.
-
Does SheetLink work with WPForms?
-
Yes. WPForms is fully supported in the free core, both Pro and Lite. Every submission is mapped to your chosen Google Sheet with the fields you select.
-
Does SheetLink work with Elementor Pro forms?
-
Yes. Elementor Pro Forms are fully supported in the free core. Create a sync rule, map fields, connect Google in one click (or paste the generated Apps Script) – done.
-
Does SheetLink work with Fluent Forms?
-
Yes. Fluent Forms is fully supported in the free core, along with 11 other form plugins (Contact Form 7, WPForms, Gravity Forms, Elementor Pro, Formidable, Ninja Forms, Forminator, Everest Forms, Beaver Builder, Divi, WS Form).
-
Can I send WooCommerce orders to Google Sheets?
-
Yes, with the WooCommerce Sync add-on. It pushes orders (created, completed, refunded), customers, and product catalogue changes (price, SKU, stock, status) to Google Sheets in real time. This is a premium feature; the free core covers form submissions.
-
How is SheetLink different from GSheetConnector and other single-form plugins?
-
Most CF7-to-Sheets or form-to-Sheets plugins handle one form type. SheetLink supports 12 form plugins from a single admin interface, includes an automatic retry queue that recovers failed deliveries, captures UTM and click-ID parameters for marketing attribution, runs local analytics on your own WordPress database, and ships a guided setup wizard that takes new installs from zero to a working Google Sheet in about three minutes.
-
Does SheetLink work with WordPress Multisite?
-
Yes. The free core includes a network-admin overview of all subsites. Multisite-wide central management and the Agency Dashboard are available in the Agency Plus tier.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“WordPress Forms to Google Sheets & Excel – SheetLink” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “WordPress Forms to Google Sheets & Excel – SheetLink” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.15.0
- Fixed: partial refunds never reached your sheet, leaving the total overstated. WooCommerce only marks an order “refunded” when it is refunded in full, so a partial refund changed nothing SheetLink was listening for – the row kept the original amount and nothing indicated it was wrong. Because full refunds do change the status, the gap only ever swallowed partial ones. Refund rows now arrive for both, and carry the refunded amount, the running total refunded, the net amount kept, and whether the refund was partial.
- Fixed: the Airtable field-mapping help said the opposite of what happens. It stated that unmapped form fields “pass through”, which is only true when the mapping is empty or you have ticked the option below it. With a mapping set, unmapped fields are not sent – so people saw columns arrive blank in Airtable while the same submission was complete in their Google Sheet, and read it as data loss. Both the Airtable and Notion pages now say how many fields are mapped and state plainly that the rest are left out.
- Fixed: White-Label left the SheetLink name in the page headings. The menu was renamed but the Dashboard and Sync Rules headings still read “SheetLink Forms”, so a client handed a rebranded site saw the real product name at the top of the first page they opened.
- Fixed: the Post Type / ACF sync source was hard to find and its setup link went to the wrong page. “Configure rule” opened the dashboard rather than the rule editor, and the source was labelled “ACF: …” even on sites without ACF, so people looking for a post-type source concluded there wasn’t one. It now reads “Post Type: …” when ACF is not installed, and the button opens the rule editor.
- Fixed: the Retry Queue counted deliveries that had used all their attempts as still “pending retry”. They are now reported separately as failed permanently, since nothing further will be attempted for them.
- Fixed: retrying a failed delivery used the old receiver URL, even after you corrected it. The retry queue stored the address at the moment of failure and never re-read the rule, so the fix Webhook Health tells you to make had no effect – you corrected the URL, pressed Retry, and watched the same deliveries fail until they hit the retry limit. Retries now use the rule’s current receiver.
- Fixed: saving a rule with a non-Google Receiver URL looked like nothing happened. The error was displayed at the top of the page, above the fold on a long rule editor, so the Save button appeared dead. The message now also appears beside the button and highlights the field.
- Fixed: the Features screen and upgrade prompts still quoted the old add-on prices. Individual monthly prices and an “Agency Growth” tier that no longer exists were shown in the plugin – including on the message you see when a delivery is refused for lacking an add-on, which is the worst possible place to quote a price nobody can pay. Everything now names the plan that includes the feature, matching sheetlinkwp.com/pricing.
- Renamed in the interface: CRM Fan-Out is now Multi-CRM Routing, and Advanced Routing is now Multi-Destination Routing, matching the names used on the website and in your licence. Nothing to reconfigure – settings, licences and rules are unaffected.
- Added: the Features screen now shows Form Abandonment’s live state – how many partial submissions are held and when they will be sent – because they are deliberately held until a visitor has been inactive for 30 minutes, and a feature you cannot see working is indistinguishable from one that is broken.
- Added: Analytics now says it starts counting from the moment you switch it on, instead of showing a page of zeros on a site that has been taking submissions all day.
- Fixed: Two-Way Sync was sending SheetLink’s own bookkeeping columns back into WordPress. If your sheet had ever been written to by an out-of-date Apps Script, that script added
_sheetlink_ping,rule_idandping_atcolumns to it – and every later edit sent those columns back as though you had typed them. Updating the script stops new junk rows but cannot remove columns already created, so this kept happening after the apparent fix. Those three are now filtered out on the way in. Your attribution columns and the WooCommerce event marker still come through, since they describe the row rather than SheetLink’s plumbing. - Fixed: an out-of-date Google Apps Script could add a junk row to your sheet every hour, and the health check called it healthy. Older versions of the script do not recognise SheetLink’s hourly health check and treat it as a form submission, so they append a row to your sheet roughly 720 times a month. Webhook Health only looked at whether the script replied, not what it said, so it reported the rule as reachable throughout. It now identifies which version of the script your sheet is running and tells you plainly when the script is writing those rows, with the exact steps to replace it. If you copied our template sheet, you are likely affected – check SheetLink Forms -> Webhook Health.
- Changed: a visitor’s campaign is now credited for 30 days instead of 90. When someone arrives from an ad, SheetLink remembers the campaign so a form filled in later still credits the click that earned it. Ninety days meant a single click could be credited for every lead from that browser for three months, including ones that later arrived from search or typed your address in directly – which quietly overstates what your ads produced. Thirty days matches Google Ads’ own default. Sites with long sales cycles can raise it (up to Google’s 90-day limit) with the
sheetlink_attribution_ttl_daysfilter. - Changed: on opt-in sites, click IDs and campaign data are now only recorded for visitors who accept marketing cookies. If your consent plugin is set to opt-in (the default in the EU and UK), a visitor who declines – or who has not answered the banner yet – now has their submission saved without attribution. Their click ID would otherwise have been written to your sheet and uploaded to Google as an offline conversion for advertising measurement they did not agree to. Expect fewer attributed conversions than leads on these sites: this is the change causing it, not a fault. Sites set to opt-out are unaffected except that an explicit refusal is now honoured, and sites with no consent plugin are unaffected entirely. Both behaviours are available via the
sheetlink_attribution_consentfilter, and the Conversions screen states which rule is in force on your site. - Note for sites using a page cache: consent is now checked in the visitor’s own browser rather than trusted from the page HTML. This matters because caches share one stored copy across visitors, and often across query strings too – with W3TC’s “Cache URI with query string variables” enabled, a request for one campaign URL is served the copy generated for a different one. Without this, a page first generated for a visitor who had accepted could have caused the next visitor to be treated as having accepted as well.
- Added: campaign tracking now respects your cookie consent banner. If your site runs a consent plugin that supports the WordPress Consent API, the campaign cookie is only stored for visitors who accept marketing cookies, and it waits if they answer after the page loads. Sites with no consent plugin are unaffected and keep working exactly as before. Tracking parameters on the link a visitor actually clicked are still recorded either way – the consent step covers storing their campaign for later, not the link they arrived on. The Dashboard says which of these applies to your site.
- Fixed: UTM and click-ID attribution now reaches your sheet on the one-click Google connection. Visitor source was always captured and sent, but this connection method never created columns for it, so it was written nowhere – while the classic Apps Script method had always recorded it. A submission that arrives with utm_source, gclid and the rest now gets those columns, added only when a visit actually carries them, so a sheet never fills with empty attribution headers. If your sheet’s header was already fixed before this release, the columns are appended the next time a submission carries them.
- Fixed: choosing a Google Sheet did not stick. Creating or picking a sheet only filled in the form on screen – the choice was not saved until you pressed Save, and the next step in setup (creating a rule) navigated away first. The page then said “No sheet chosen yet” even though the spreadsheet existed in your Drive, and you had to pick it again. Creating or picking a sheet now saves it immediately.
- Fixed: saving the Google Sheets screen can no longer blank the destination sheet.
- Fixed: finishing setup the one-click way now counts as finishing setup. Only the wizard’s own last step marked a site as set up, and the one-click route deliberately ends on the Google Sheets screen instead – so a fully configured site stayed flagged as never-set-up, and the first-run wizard could reappear after an unrelated deactivate and reactivate months later. Creating a rule against a connected sheet now completes setup, whichever route you took to get there.
- Improved: the one-click Google route no longer loses your answers. It finishes on the Google Sheets screen rather than in the wizard, and now carries your form plugin and rule name with it, pre-filled, with a note explaining where you are. Previously both were discarded and you retyped them.
- Improved: the welcome screen described the manual Apps Script route as the only path. It now leads with one-click Google, with Apps Script as the optional alternative it actually is – and the progress step is labelled “Connect Google” rather than “Google Script”.
- Added: the Lead Inbox is now part of SheetLink Forms. Every submission becomes a lead you can own, answer and qualify – including the ones that never reached your sheet – with a response-time clock, notes, assignment and reports. It was previously a separate plugin; it is now built in, like every other add-on, and appears under SheetLink Forms when your licence includes it.
- If you installed the separate “SheetLink Lead Inbox” plugin, nothing breaks: SheetLink Forms leaves it in charge while it is active, and you can deactivate and delete it whenever you like. Your leads, notes and settings live in the same place either way and are not touched.
- Note on removal: deleting SheetLink Forms does not delete your leads. They are your records of real people you have spoken to, so they are kept unless you explicitly opt into deletion.
1.14.9
- Added: a way past “Approval required” when connecting Excel Online. Many Microsoft 365 organizations require an administrator to approve an app before anyone can connect it, so business users saw an approval wall instead of a sign-in screen with nothing on this end to do about it. The Excel Online page now provides a link you can send to whoever administers your Microsoft 365 tenant: they approve SheetLink Forms once for the whole organization, and everyone connects normally after that. They need no SheetLink licence and no login on your site.
- Improved: if Microsoft blocks the connection for that reason, the page you land on now explains why and carries the same link, instead of only saying sign-in did not complete.
1.14.8
- Renamed: the Multi-Node Routing add-on is now Multi-Destination Routing. Same add-on, same price, same settings – the new name says what it does: route one submission to several destinations with priority order and fallback webhooks. Nothing to reconfigure; existing licences and rules are unaffected.
- Improvement: the license key field no longer names a specific key format. Keys are validated by the licensing service, so paste whatever key your purchase email delivered.
- Documentation: clarified an internal code comment in the Excel destination about where the license gate is enforced.
1.14.7
- Security: the Two-Way Sync page displayed a live credential in plain text. The page printed the sync secret that authorises incoming sheet updates, so anyone who saw the screen – a screenshot, a support ticket, a screen-share – could post fabricated row updates to your site. It is no longer rendered; an administrator can reveal it on demand instead. If you have ever shared a screenshot of that page, contact support to reissue your licence key, which changes the secret.
- Fixed: “Recent incoming updates” said “No updates received yet” forever if you use the Google connection. Only the Apps Script route wrote to that table. Sites using the one-click Google connection were syncing edits correctly the whole time, but the page gave no evidence of it, so a working setup looked broken. Entries now record which mechanism delivered them and the table shows it.
- Improved: the Two-Way Sync page now describes the mechanism your site actually uses. If Google is connected it reports that the sync is active, how often it checks, when it last read the sheet, and when it will check next – and it is honest that WordPress cron only runs when someone visits the site, so a quiet site checks less often than the interval suggests. The Apps Script instructions are demoted to “not needed on this site” rather than presented as the setup path.
- Improved: a site with an active licence but no Two-Way Sync add-on now says so. Previously only a missing licence warned, so an unentitled site looked correctly configured while every incoming edit was rejected.
- Added: a warning against running the Apps Script and the Google connection on the same sheet. Both deliver to the same place, and with both live an edit can be applied twice.
1.14.6
- Improved: the setup wizard no longer walks you through an Apps Script you do not need. If you have already connected Google with one click, the “Google Script” step is gone and the remaining steps renumber – previously the wizard asked you to deploy a script and then told you on the very next screen that there was nothing else to set up.
1.14.5
- Fixed: “Fields: 0” again, this time on Send Test. The 1.14.4 fix only reached the path a real form submission takes; Send Test still reported zero. Since Send Test is how most people confirm a rule works, that was the number most people saw.
1.14.4
- Fixed: the Sync Log said “Fields: 0” on deliveries that wrote several columns. Since 1.14.0 you no longer type column names, so the count had nothing left to count and reported zero. It now reports what was actually written to the row.
- Improved: Send Test now confirms itself next to the button. The confirmation only appeared at the top of the page, so on a long list of rules a successful test could look like nothing happened – and a retried test writes another real row to your spreadsheet.
1.14.3
- Fixed: Send Test never tested the Excel mirror. It ran and reported the Airtable and Notion mirrors but skipped Excel entirely – no notice, no Sync Log row, no row in your workbook – so a working Excel mirror and a broken one looked exactly the same. Excel is now included, and reports like the others.
- Fixed: an Excel mirror that is switched on but not finished being set up now says so. It used to skip in silence, which looked identical to having no Excel mirror at all.
- Fixed: the workbook picker could come up empty on a brand-new Microsoft 365 account. Microsoft’s file search needs time to index a newly created OneDrive and returns an error until it has; SheetLink now falls back to listing the files in your OneDrive so you can pick a workbook straight away.
1.14.2
- Fixed: checkboxes that could not be switched off. Unticking a WooCommerce event, or a conditional routing rule, appeared to save and then came back ticked. The browser sent the right value; it was misread on arrival, so the setting was always stored as enabled. Anything you had tried to switch off has been running all along.
- Fixed: opening the WooCommerce screen and pressing Save switched on all six event types, whether or not you ticked them. Events left enabled with no Receiver URL are switched off automatically on update, since they could never have sent anything. An enabled event that has a URL is left exactly as it is.
1.14.1
- Fixed: the setup wizard could not be opened at all. Every visit to it returned “Sorry, you are not allowed to access this page”, including the automatic redirect a new site is sent through immediately after activating the plugin. The page was registered under the main SheetLink menu and then hidden from the sidebar, which left WordPress unable to resolve it. Present since 1.9.4.
- Fixed: the one-click Google route could not finish the wizard. After connecting a Google account, the last step still demanded an Apps Script “Receiver URL” and refused to save without one, so anyone taking the one-click route left the wizard with no sync rule and nothing was ever delivered. That step now recognises the connection, and the Apps Script field is hidden entirely rather than shown and ignored.
- Fixed: an empty Receiver URL on the classic Apps Script route reported that the address “does not look like” a valid URL, when nothing had been typed. It now says what to do instead, including the one-click option.
- Fixed: the wizard’s own stylesheet, script and documentation link stopped loading when the page moved.
1.14.0
- Fixed: Google Sheets deliveries failed with “No form fields are mapped” for most form plugins. SheetLink matched your sheet’s column headers against each form field’s internal key, and several plugins use generated keys – Formidable emits things like
kzn0j, Ninja Formsname_1512...– so a column called “Email” matched nothing and the row was never written. Columns are now matched on the field’s label as well, which is what you actually name your columns after. Gravity Forms and WPForms were unaffected because they happen to key by the label already. - Added: you no longer type column names. Connect a spreadsheet, point a form at it, and the first submission writes the header row for you, taken from that form’s own fields. Existing setups are untouched – if you have already configured columns, they keep being used.
- Added: each form now gets its own tab. A tab has a single header row, so two forms with different fields could never share one – the second form’s answers landed under the first form’s columns. Your first rule keeps using the tab you picked; any additional form gets its own, named after the rule.
- Added: the Google Sheets screen now tells you when a connected spreadsheet has no form pointed at it, and lets you create that rule right there. Connecting a sheet writes its header row, which looked finished while nothing was actually being sent.
- Improvement: seeded column headers use readable labels (“First Name”) rather than internal names (“names.first_name”, “name-1”) for Formidable, Ninja Forms, Forminator, Everest Forms, Fluent Forms, WPForms, WS Form and Divi.
1.13.1
- Change: the plugin now contacts
sheetlinkwp.comfor licence activation and entitlement checks, instead ofsiteanswerai.com– a legacy domain the API happened to be hosted under. Nothing to do on your side, and older installs keep working because the old address forwards to the new one. If you listedsiteanswerai.comas a data processor in your privacy notice, update it tosheetlinkwp.com. - Change: the Primary Destinations add-on (previously “Excel Primary Destination”) now covers Excel Online, Airtable and Notion. One add-on for all three. If you already own Excel Primary, your existing licence unlocks the other two at no extra cost – nothing to do.
- Removed: a long-unreachable legacy Airtable/Notion delivery path inside the Integrations Bundle. It could not be configured from any shipped rule editor, and Airtable and Notion have been free built-in destinations with proper per-rule field mapping since 1.9.4. If a rule from a very old build still references it, an admin notice now points you to the built-in destination instead of the delivery failing quietly.
- Improvement: corrected pricing and add-on descriptions that implied Airtable and Notion were part of the paid Integrations Bundle. They are free core destinations; only using one as your sole destination is paid.
1.13.0
- Security: stored API tokens are no longer written into the settings page’s HTML. The Airtable, Notion, Meta CAPI and SMS (Twilio) screens pre-filled their credential field with the saved token. The browser masked it visually, but it sat in the page source in cleartext – readable by anyone who can view source on that screen, by browser extensions, and by anything that captures the page. The field now renders empty with a masked “Currently set” hint: leave it blank to keep the stored token, or tick Remove the stored value to delete it. If you have entered an API token on any of those screens, consider rotating it.
- New: Airtable and Notion can now be a rule’s primary destination. Previously they could only mirror a successful Google Sheets delivery, which meant you had to set up a Google Sheet you did not want – and if that Sheets delivery ever failed, the Airtable write never happened either. A rule can now deliver straight to Airtable or Notion with no Google Sheets configuration at all. Pick it from the Primary destination dropdown in the rule editor. Requires the Primary Destinations add-on, which covers all three; the free Airtable, Notion and Excel mirror modes are unchanged and stay free.
- New: primary deliveries to Airtable and Notion use the full delivery pipeline – the automatic retry queue (throttling and provider outages retry; a bad token or unknown column does not, because retrying cannot fix those), save-time validation of your credentials, and destination-aware health checks. Mirror deliveries never had retries.
- Fix: failed deliveries to Excel, Airtable and Notion logged a blank error. The Sync Log recorded the correct status and HTTP code but discarded the explanation, so a failure showed up with an empty Error column. The provider’s actual message is now kept.
- Fix: the Sync Log’s Fields count now reflects what was actually written to the destination rather than how many fields arrived from the form – relevant for Airtable and Notion, which only send mapped fields.
1.12.4
- Fix: Contact Form 7 submissions now sync even when the notification email fails. SheetLink captured CF7 submissions on the hook that fires only after CF7’s email is sent successfully, so on a site with broken or unconfigured SMTP not a single submission ever reached the spreadsheet – precisely the situation a spreadsheet is supposed to protect you from. Capture now happens after CF7 finishes its own validation, acceptance, spam and file checks but before the email is attempted, so delivery no longer depends on your mail server. Spam and aborted submissions are still excluded, exactly as before.
- Improvement: rows created by the Send Test button are now labelled “Test” in the Sync Log. Previously a test send and a real form submission produced identical log rows, so a green row proved the destination worked but not that a real submission had ever arrived – awkward when debugging a live site.
1.12.3
- Fix: Airtable and Notion no longer reject every submission when your form has more fields than your table has columns. Airtable refuses the entire record if any field name is not a real column, so a five-field form writing to a three-column table failed 100% of the time with “Unknown field name” – losing the lead. When you have set up a field mapping, only the mapped fields are sent. A new Unmapped fields checkbox on the Airtable and Notion screens restores the old behavior if every one of your form fields has a matching column. With no mapping configured, all fields are still sent, so a table whose column names match your form field names keeps working with no setup.
- Fix: an enabled-but-unconfigured mirror now says so. If Airtable or Notion was switched on but missing its token, Base ID, or table name, the plugin skipped it silently – no Sync Log row – which looked exactly like the feature being broken. It now logs a failed row naming precisely which setting is missing.
- Fix: the Airtable table-name field is now also protected from browser autofill (the token and Base ID fields were covered in 1.12.2).
1.12.2
- Fix: Airtable and Notion deliveries no longer fail silently. When a mirror write was rejected – most often an invalid or mistyped access token – the plugin discarded the error: no entry in the Sync Log, nothing in the retry queue, no notice. That made a broken credential look exactly like a feature that was never running. Every Airtable and Notion attempt is now recorded in the Sync Log, on success and on failure, with the provider’s own error message.
- Fix: the Excel mirror now records successful writes too (it previously only surfaced failures, as an admin notice).
- Fix: Send Test now tests what your rule actually does. It sends through the rule’s real destination – so it works for Google Sheets (OAuth) and Excel rules instead of only classic Apps Script rules – and it also exercises your Airtable and Notion mirrors, reporting each one. A mirror failure now fails the test instead of showing a misleading all-clear.
- Fix: a saved field mapping could be silently reverted. If a Google account token renewal happened at the same moment you saved a rule’s field mapping, the renewal wrote back older settings and discarded the mapping – leaving the rule failing with “No form fields are mapped to the sheet columns”. Renewal now only touches the token.
- Fix: saving an empty field mapping now warns that deliveries will fail, instead of reporting a plain “saved” for a rule that cannot deliver.
- Security/UX: the Airtable Base ID and access-token fields (and the Notion token field) now resist browser password-manager autofill, which could quietly overwrite your Base ID with a saved username and break every write.
1.12.1
- Improvement: Excel deliveries retry when the workbook is open in the desktop Excel app. A workbook locked by desktop Excel (the most common real-world Excel failure) previously failed permanently; it now retries automatically with a clear message, and succeeds once the file is closed.
- Improvement: Excel writes to the same workbook are serialized. Simultaneous submissions (or a retry batch overlapping a new submission) no longer race each other into Microsoft’s same-workbook write conflict.
- Improvement: Microsoft throttling responses are respected. When Microsoft asks SheetLink to wait (HTTP 429/503 Retry-After), the retry queue now waits at least that long instead of retrying on its own schedule.
- Improvement: weekly Microsoft connection keepalive. Microsoft silently expires connections after ~90 days of inactivity; a weekly background refresh keeps a quiet site’s Excel connection alive indefinitely.
- Improvement: Microsoft connections now remember their home tenant, which makes token refresh more reliable for work/school accounts (including guest accounts in another organization).
- Fix: a token refresh finishing at the same moment as a settings save can no longer discard the new Microsoft credentials.
1.12.0
- New: One-click Google Sheets connect. Connect a Google account and write submissions straight to a Google Sheet – no Apps Script, no pasting a script, no webhook URL. Create a new sheet in one click, or pick an existing one with Google’s own file picker. SheetLink only ever sees the sheets it creates for you or that you pick – never the rest of your Google Drive. The classic Apps Script method is unchanged and still available.
- New: Per-rule field mapping for the one-click Google Sheets destination. Map each form field to a sheet column on the settings page. Columns you leave unmapped are filled automatically when a column header matches a form field name.
- Improvement: newly created sheets get a labeled header row automatically, and rows are appended beneath it.
- Fix: the one-click Google Sheets destination no longer writes a blank row when nothing is mapped – it reports a clear, actionable error instead of silently logging a success.
1.11.4
- Fix: queued retries now use the same HTTP transport as first deliveries. A retried Apps Script delivery previously followed Google’s redirect and re-sent the request to the redirect endpoint, which rejects it – logging an HTTP 400 “failure” even though the first hop had already written the row (and each retry could write a duplicate). Retries now treat the redirect as the success it is, and a redirect to a Google sign-in page is a non-retryable configuration error with a clear message.
- Improvement: the Apps Script setup instructions now explain how to update a deployed script. Saving code in the Apps Script editor does not change what the web app runs: you must publish it via Deploy > Manage deployments > edit > Version: “New version”. The instructions warn that the Version dropdown pre-selects the old version, and that “New deployment” creates a second URL instead of updating the existing one. This distinction has cost real users real hours.
1.11.3
- Fix: WS Form submissions now capture field values. The integration listened with the wrong number of hook arguments, so every WS Form delivery arrived …
