Title: SheetLink Forms to Google Sheets &amp; Excel &#8211; CF7, WPForms, Elementor, Gravity Forms (Free Zapier Alternative)
Author: sheetlink
Published: <strong>12 de març de 2026</strong>
Last modified: 26 de juliol de 2026

---

Cerca extensions

![](https://ps.w.org/sheetlink-forms/assets/banner-772x250.png?rev=3620690)

![](https://ps.w.org/sheetlink-forms/assets/icon-256x256.png?rev=3513890)

# SheetLink Forms to Google Sheets & Excel – CF7, WPForms, Elementor, Gravity Forms (Free Zapier Alternative)

 Per [sheetlink](https://profiles.wordpress.org/sheetlink/)

[Baixa](https://downloads.wordpress.org/plugin/sheetlink-forms.1.14.0.zip)

 * [Detalls](https://ca.wordpress.org/plugins/sheetlink-forms/#description)
 * [Ressenyes](https://ca.wordpress.org/plugins/sheetlink-forms/#reviews)
 *  [Instal·lació](https://ca.wordpress.org/plugins/sheetlink-forms/#installation)
 * [Desenvolupament](https://ca.wordpress.org/plugins/sheetlink-forms/#developers)

 [Suport](https://wordpress.org/support/plugin/sheetlink-forms/)

## Descripció

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](https://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

 1. Install SheetLink Forms
 2. Create a sync rule – pick your form plugin, map fields to spreadsheet columns
 3. 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
 4. 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.file` scope: 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](https://sheetlinkwp.com/pricing) for tiers.

 * **Advanced Routing** – multi-destination fan-out with priority order and optional
   fallback webhooks (Multi-Node 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 uses `https://www.googleapis.com/drive/v3/` and loads
   Google’s Picker JavaScript from `https://apis.google.com/` in wp-admin only.
 * **Scope:** `drive.file` only – 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) and `googleapis.
   com` (Google’s API) as data processors in your privacy notice.
 * **Google Sheets API documentation:** [https://developers.google.com/sheets/api](https://developers.google.com/sheets/api)
 * **Google Terms of Service:** [https://policies.google.com/terms](https://policies.google.com/terms)
 * **Google Privacy Policy:** [https://policies.google.com/privacy](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/` or `https://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](https://developers.google.com/apps-script)
 * **Google Terms of Service:** [https://policies.google.com/terms](https://policies.google.com/terms)
 * **Google Privacy Policy:** [https://policies.google.com/privacy](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/verify` and `https://
   sheetlinkwp.com/api/sheetlinkwp/entitlements`, over HTTPS. (Installs older than
   1.13.1 contact `siteanswerai.com` for 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-score` over
   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.com` as a data processor in your own privacy notice before enabling
   this feature.
 * **Terms of Service:** [https://sheetlinkwp.com/terms](https://sheetlinkwp.com/terms)
 * **Privacy Policy:** [https://sheetlinkwp.com/privacy](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 Online` and 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}/rows` over HTTPS, authenticated with an OAuth access 
   token. Token refresh goes through SheetLink’s OAuth broker at `https://sheetlinkwp.
   com/api/sheetlinkwp/oauth/microsoft/refresh` so 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 to `wp_options`.
   The access token is short-lived (~1 hour) and is also stored in `wp_options`.
 * **Privacy considerations:** If your forms collect personal data and you enable
   the Excel mirror, list `sheetlinkwp.com` (the OAuth broker) and `graph.microsoft.
   com` (the Microsoft 365 API) as data processors in your privacy notice.
 * **Microsoft Privacy Policy:** [https://privacy.microsoft.com/](https://privacy.microsoft.com/)
 * **Terms of Service:** [https://sheetlinkwp.com/terms](https://sheetlinkwp.com/terms)
 * **Privacy Policy:** [https://sheetlinkwp.com/privacy](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.

## Captures

[⌊Delivery dashboard - total submissions synced, estimated savings vs Zapier, active
rules, and retry queue at a glance.⌉⌊Delivery dashboard - total submissions synced,
estimated savings vs Zapier, active rules, and retry queue at a glance.⌉[

Delivery dashboard – total submissions synced, estimated savings vs Zapier, active
rules, and retry queue at a glance.

[⌊Multiple destinations - send form entries to Google Sheets and mirror them to 
Excel Online (Microsoft 365), Airtable, and Notion.⌉⌊Multiple destinations - send
form entries to Google Sheets and mirror them to Excel Online (Microsoft 365), Airtable,
and Notion.⌉[

Multiple destinations – send form entries to Google Sheets and mirror them to Excel
Online (Microsoft 365), Airtable, and Notion.

[⌊Per-form sync rules with a live delivery log showing HTTP status for every send,
plus one-click test.⌉⌊Per-form sync rules with a live delivery log showing HTTP 
status for every send, plus one-click test.⌉[

Per-form sync rules with a live delivery log showing HTTP status for every send,
plus one-click test.

[⌊Automatic retry queue - failed deliveries retry every 15 minutes (up to 3 attempts),
with manual retry.⌉⌊Automatic retry queue - failed deliveries retry every 15 minutes(
up to 3 attempts), with manual retry.⌉[

Automatic retry queue – failed deliveries retry every 15 minutes (up to 3 attempts),
with manual retry.

[⌊Ad conversion tracking - capture GCLID / wbraid / gbraid, fbclid, and msclkid,
then export offline conversions.⌉⌊Ad conversion tracking - capture GCLID / wbraid/
gbraid, fbclid, and msclkid, then export offline conversions.⌉[

Ad conversion tracking – capture GCLID / wbraid / gbraid, fbclid, and msclkid, then
export offline conversions.

## Instal·lació

#### From your WordPress admin (recommended)

 1. In your WordPress admin, go to **Plugins  Add New**.
 2. Search for «SheetLink Forms».
 3. Click **Install Now**, then **Activate**.
 4. The setup wizard opens automatically and walks you through connecting your first
    form to Google Sheets in about three minutes.

#### Manual upload

 1. Download the `sheetlink-forms.zip` file.
 2. In WordPress, go to **Plugins  Add New  Upload Plugin** and upload the zip, or 
    extract it into `/wp-content/plugins/sheetlink-forms/`.
 3. Activate the plugin from the Plugins menu.
 4. 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

## PMF

### 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 (only `script.google.com` and `script.googleusercontent.com` URLs 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 to `https://sheetlinkwp.com/api/sheetlinkwp/lead-score`.
Every other feature of the plugin runs locally on your WordPress server.

### What happens if the Google Sheet is unavailable?

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.

## Ressenyes

No hi ha ressenyes per a aquesta extensió.

## Col·laboradors i desenvolupadors

«SheetLink Forms to Google Sheets & Excel – CF7, WPForms, Elementor, Gravity Forms(
Free Zapier Alternative)» és programari de codi obert. La següent gent ha col·laborat
en aquesta extensió.

Col·laboradors

 *   [ sheetlink ](https://profiles.wordpress.org/sheetlink/)

[Traduïu «SheetLink Forms to Google Sheets & Excel – CF7, WPForms, Elementor, Gravity Forms (Free Zapier Alternative)» a la vostra llengua.](https://translate.wordpress.org/projects/wp-plugins/sheetlink-forms)

### Interessats en el desenvolupament?

[Navegueu pel codi](https://plugins.trac.wordpress.org/browser/sheetlink-forms/),
baixeu-vos el [repositori SVN](https://plugins.svn.wordpress.org/sheetlink-forms/),
o subscriviu-vos al [registre de desenvolupament](https://plugins.trac.wordpress.org/log/sheetlink-forms/)
per [fisl de subscripció RSS](https://plugins.trac.wordpress.org/log/sheetlink-forms/?limit=100&mode=stop_on_copy&format=rss).

## Registre de canvis

#### 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 Forms `name_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.com` for licence activation and
   entitlement checks**, instead of `siteanswerai.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 listed `siteanswerai.
   com` as a data processor in your privacy notice, update it to `sheetlinkwp.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 as
   metadata-only. Fields are captured under their field_N keys, with field labels
   working as mapping aliases, and the correct form ID is recorded.
 * Fix: **Kali Forms integration now fires.** The plugin listened on the wrong hook
   name (and detection checked a wrong class name), so Kali submissions were never
   captured. Internal keys (nonce, form id bookkeeping) are excluded from the row.
 * Fix: **JetFormBuilder submissions now capture field values and the correct form
   ID.** The handler read a success flag as the form ID and looked for field data
   where JetFormBuilder does not store it.
 * Fix: **Beaver Builder Contact Form submissions now capture field values** under
   the module’s fixed field keys (name, subject, email, phone, message). The previous
   capture iterated a settings collection that the stock module does not have.
 * Fix: **Gravity Forms multi-input fields are no longer dropped.** Name and Address
   fields now arrive as dotted sub-fields (name.first, name.last) plus a combined
   column, and Checkbox/Multiselect/List selections arrive comma-separated. Simple
   fields are unchanged.
 * Fix: **Send Test now uses the same HTTP transport as live deliveries.** It previously
   followed the Apps Script redirect in a way Google’s redirect endpoint rejects,
   reporting HTTP 400 against healthy deployments.
 * Improvement: **clearer diagnosis when an Apps Script deployment requires sign-
   in.** A redirect to a Google login page is now logged as an explicit failure 
   with the fix («redeploy with access: Anyone») instead of a success that quietly
   writes nothing.
 * Improvement: Everest Forms fields are now captured under their stable Meta Key(
   labels still work as mapping aliases); Elementor rules match the form name as
   well as the element id; Forminator and Everest checkbox/multiselect values arrive
   comma-separated instead of raw arrays; fields whose labels sanitize to an empty
   string no longer collapse into one column.
 * Internal: add-on form sources dispatch through the shared engine statically, 
   removing a duplicate-delivery risk.

#### 1.11.2

 * Fix: **rules can now be saved with an empty field map**, enabling the documented
   auto-sync mode (every captured form field becomes a column, no configuration 
   needed). The editor previously required at least one mapping row for Google Sheets
   rules, which made auto-sync impossible to set up even though the interface described
   mapping rows as optional.
 * Fix: **Divi form IDs are accepted in both spellings.** A rule’s Form ID can be
   the internal divi_0 / divi_1 form number or the et_pb_contact_form_0 identifier
   visible in Divi’s markup – previously the et_pb_… spelling silently matched nothing,
   so the rule never fired. The Form ID field’s help text now documents both.
 * Compatibility: the Divi integration (including the 1.11.1 Field ID fix) is verified
   end to end on both Divi 4 (4.27) and Divi 5.

#### 1.11.1

 * Security: **hardening release – please update.** This release addresses the findings
   of a full security audit of the plugin and its SheetLink cloud services. Highlights:
   the Microsoft 365 connection to SheetLink’s OAuth broker is now authenticated
   with your site’s activation token; two-way sync payloads support full HMAC-SHA256
   verification with a replay window; license entitlement responses support signature
   verification; stored CRM, Twilio, and AI-key credentials are now encrypted at
   rest (re-save existing credentials to encrypt them); Airtable and Notion deliveries
   are pinned to their official API hosts; all outbound destination and webhook 
   URLs get stricter validation (DNS-resolved, private network ranges blocked); 
   the spreadsheet formula-injection guard now catches whitespace and encoding bypasses.
 * Privacy: several data captures are now **off by default** and opt-in: consent
   logging (sheetlink_consent_log_enabled), raw submission payloads in the delivery
   log (sheetlink_log_payloads), and personal data in WordPress User Sync / ACF 
   Sync exports (sheetlink_user_sync_include_pii, sheetlink_acf_sync_include_pii).
   If you relied on any of these, re-enable the matching option after updating. 
   Phone numbers used for ad-platform exports are hashed in E.164 form; set sheetlink_default_country_code
   if your site’s local numbers are not +1.
 * New: **destination-aware Retry Queue.** Failed Excel Online deliveries now retry
   through Microsoft Graph just like Sheets deliveries retry through Apps Script;
   the queue records each entry’s destination and the Retry Now buttons in the queue
   and Delivery Log use the same delivery path as the original attempt. Non-retryable
   failures (invalid credentials, revoked access) are marked permanently failed 
   instead of retrying pointlessly.
 * Fix: **Divi field mapping now matches the documented Field IDs.** Divi Contact
   Form fields are captured under the Field ID set in the module (e.g. name, email),
   as the docs describe, instead of a sanitized copy of the field label. Explicit
   field maps created against the old label-style keys (e.g. email-address) keep
   working – both key styles now resolve in field maps, conditional routing, and
   consent capture. Fixes rows arriving with correct headers but blank values when
   a field map used Field IDs.
 * Fix: Divi fields with an empty label no longer collapse into a single unnamed
   column.

#### 1.11.0

 * New: **Excel Online as primary destination.** Pick Microsoft 365 Excel as the
   place every submission lands – the Google Sheets delivery becomes optional. The
   rule editor now has a Primary Destination dropdown at the top of every rule; 
   the existing Sheets fields only appear when Sheets is selected. Licensed under
   the Agency Growth + Agency Plus bundles, or available standalone as the Excel
   Primary add-on ($29/mo). Existing Excel-mirror rules continue to work unchanged.
 * New: **Pluggable destination registry** (SheetLink_Destination + SheetLink_Destination_Registry).
   Each destination type is now a registered class with deliver() / validate_rule()/
   ping() / transform_payload() hooks. Third-party plugins can register their own
   destinations via the new sheetlink_register_destinations action without touching
   the core dispatch engine. The Sheets path was extracted into SheetLink_Sheets_Destination
   and is byte-equivalent to v1.10.0.
 * New: **Destination column in Activity Log + Dashboard + Webhook Health.** Each
   log entry now shows which destination handled the delivery (Google Sheets, Excel
   Online, etc.). Pre-1.11.0 entries display as «Google Sheets» for backward compatibility.
 * New: **Destination-aware webhook health checks.** Excel rules now ping Microsoft
   Graph /me to verify the OAuth connection; Sheets rules continue to ping the Apps
   Script /exec URL with the existing tagged payload. Hourly sweep + the on-demand«
   Test now» button both respect the rule’s primary destination.
 * Improvement: setup wizard now offers Excel as a destination on the welcome step
   so new customers can pick Excel without going through a Sheets-first flow.
 * Internal: one-time migration backfills primary_destination=’sheets’ on every 
   rule saved by v1.10.0 or earlier. Idempotent; no-op on subsequent runs. The dispatch
   engine also defaults to ‘sheets’ at runtime when the field is missing, so existing
   customers don’t have to wait for the migration to run.

#### 1.10.0

 * New: Excel Online destination. Mirror every form submission into a Microsoft 
   365 Excel workbook on OneDrive alongside the primary Google Sheets delivery. 
   Per-rule field mapping picks which form fields land in which Excel columns. Connection
   uses OAuth via a SheetLink-hosted broker so the customer’s Microsoft refresh 
   token is encrypted at rest (AES-256-GCM) with no Microsoft client secret in the
   plugin. The Sheets delivery remains primary; Excel is a non-blocking mirror via
   the sheetlink_after_delivery hook, same shape as the existing Airtable + Notion
   destinations.
 * New: shared encrypted-tokens helper (SheetLink_Tokens_Encrypted) for at-rest 
   encryption of OAuth refresh tokens. Reusable by future OAuth destinations (HubSpot,
   Salesforce, etc.). HKDF-SHA256 key derivation from wp_salt(‘auth’) with per-context
   info string.
 * New: Excel Online entry in the Destinations admin tab strip (alongside Airtable
   and Notion).

#### 1.9.5

 * Tested and confirmed compatible with WordPress 7.0.
 * Fix: the retry-queue cron interval’s display label is now wrapped in an is_textdomain_loaded()
   check. Pre-init callers of wp_get_schedules() (WordPress core, other plugins)
   previously triggered the filter callback’s __() call before the SheetLink textdomain
   had loaded, producing the WP 6.7+ _load_textdomain_just_in_time _doing_it_wrong
   notice. Filter registration stays at plugins_loaded so the recurrence remains
   available during the plugin activation hook.

#### 1.9.4

The largest single release since 1.7.0. 15 new feature classes, 6 industry templates,
and a series of internal plumbing changes that let non-form sources dispatch to 
the same delivery pipeline. Existing rules continue to work unchanged. Customers
wanting the new row-upsert behavior on existing rules must regenerate the Apps Script(
SheetLink -> [rule] -> Get Script) and redeploy.

**Security**

 * New: **Formula injection guard** (`SheetLink -> Features -> Formula Guard`). 
   Sanitises every payload value before dispatch so spreadsheet formula-injection
   attempts (`=HYPERLINK(...)`, `=cmd|...`, leading `@`/`+`/`-` etc.) cannot be 
   embedded in form input. Defaults ON.

**Ad attribution**

 * New: **Meta Ads CSV export** (`SheetLink -> Meta Ads Conversions`). Capture `
   fbclid` from Meta traffic and export completed conversions as a Meta-compliant
   CSV (hashed email/phone, SHA-256 normalized).
 * New: **Microsoft Ads CSV export** (`SheetLink -> Microsoft Ads Conversions`).
   Same pattern as Meta for `msclkid` traffic.
 * New: **Shared ad-export base** – one Apps Script property (`SHEETLINK_ADS_TOKEN`)
   now authorizes Google + Meta + Microsoft ads exports. Existing Google Ads token
   continues to work.
 * New: **Meta CAPI server-side** (`SheetLink -> Meta CAPI`). Sends a server-side
   conversion event to Meta on every successful delivery using a long-lived system-
   user token. Fires at hook priority 30 on `sheetlink_after_delivery`.

**Operations**

 * New: **Email digest cron** (`SheetLink -> Email Digest`). Daily or weekly summary
   email of submission volume and delivery health. Frequency configurable.
 * New: **Webhook health check** (`SheetLink -> Webhook Health`). Hourly cron pings
   every active rule’s destination plus an in-admin «Test now» button. Surfaces 
   a wp-admin notice if a destination has been failing for the last hour. Uses a
   new `_sheetlink_ping=1` payload marker that newly-generated Apps Scripts handle
   silently; older deployed scripts ignore it.
 * New: **Duplicate prevention** (`SheetLink -> Duplicates`). SHA-1 hash store in
   transients with configurable key field + window. Modes: suppress (drop the duplicate)
   or reroute to a `Duplicates` sheet tab.
 * New: **Row upsert mode** (per-rule UI on the rule edit page). Per-rule toggle
   for upsert vs append. When upsert is enabled, the Apps Script scans a chosen 
   key column and updates the matched row in place, falling back to append on no-
   match. Requires regenerating + redeploying the Apps Script on existing rules.

**New sources**

 * New: **User registration sync** (`SheetLink -> User Sync`). New non-form source:`
   user_registration`. Dispatches a row whenever a WordPress user registers (configurable
   role filter, configurable fields).
 * New: **Form abandonment capture** (`SheetLink -> Form Abandonment`). Frontend
   partial-capture writes to a transient store on every keystroke; hourly cron sweeps
   abandoned sessions into a `Abandoned` sheet tab. Defaults OFF (privacy-sensitive).
 * New: **ACF + CPT sync** (`SheetLink -> ACF Sync`). Register one source per enabled
   custom post type (`acf_book`, `acf_event`, …) via the new `sheetlink_register_dynamic_sources`
   filter. Fires on post save with ACF field values flattened into the payload.

**New destinations**

 * New: **Airtable destination** (`SheetLink -> Airtable`). Free, decoupled from
   the Integrations Bundle. Mirrors every successful delivery into an Airtable base
   via the official API. Fires at hook priority 40 on `sheetlink_after_delivery`.
 * New: **Notion destination** (`SheetLink -> Notion`). Smart-typed property mapping
   infers Notion property types from field values (Number, Date, Email, URL, etc.).
   Fires at priority 45.
 * New: **Kit (ConvertKit V4)** added to CRM Fan-Out. Existing HubSpot / Salesforce/
   Zoho / Pipedrive / Mailchimp / ActiveCampaign destinations continue unchanged.
 * New: **SMS / WhatsApp alerts via Twilio** (`SheetLink -> SMS Alerts`). Per-rule
   condition gating + `{field}` placeholder rendering. Internal-key fields (`_*`)
   are excluded from rendering. Fires at priority 50 on `sheetlink_after_delivery`
   so external destinations fan out before notifications.

**Vertical templates**

 * New: **Vertical packs** (`SheetLink -> Vertical Packs`). 6 industry-specific 
   rule templates that pre-fill column maps, conditional routing rules, and CRM/
   destination configuration: real estate, legal intake, healthcare, education, 
   e-commerce quote, agency client intake. One-click apply per pack.

**White-Label hardening**

 * New: **Reset to defaults** button on `SheetLink -> White-Label`. Clears the active
   profile’s branding back to «SheetLink» defaults – recovery path when a customer
   accidentally saves a placeholder string into the menu label.
 * Fix: whitespace-only or accidentally-empty values for `plugin_name`, `menu_label`,`
   menu_icon`, `accent_color`, or `support_email` now fall back to defaults at save
   time rather than persisting a blank that would render as an invisible sidebar
   entry. Applies to the legacy single-config and per-client profiles.

**Admin menu de-clutter**

 * Renamed: **Multi-CRM Routing** (was «CRM Fan-Out») – matches the sheetlinkwp.
   com marketing copy. Display label only; the `crm_fanout` slug, option keys, and
   license entitlement type are unchanged so no data migration is needed.
 * New: **Conversions** parent page that groups the four ad-conversion tools (Google
   Ads, Meta Ads, Microsoft Ads, Meta CAPI) under one sidebar entry with a tab strip
   at the top of each child page.
 * New: **Destinations** parent page that groups the two secondary destinations (
   Airtable, Notion) under one sidebar entry.
 * Tabs: the existing **Dashboard** page now has Overview | User Sync | Duplicates
   tabs; **Sync Rules** now has Rules | Templates tabs. Each tab links to a child
   page that keeps its original URL (deep links unchanged).
 * Removed from sidebar: User Sync, Duplicates, Templates, Google Ads Conversions,
   Meta Ads Conversions, Microsoft Ads Conversions, Meta CAPI, Airtable, Notion,
   SMS Alerts, Upgrade. All ten URLs continue to work; the entries are reachable
   via their new parent tab strips or via the Features Hub.
 * Moved: the **Upgrade** CTA is now a banner at the top of the License page rather
   than its own submenu entry.
 * Result: SheetLink top-level sidebar drops from 21 submenu items to ~12 (or fewer
   if you’ve disabled some features via the Features Hub).

**Developer / internal**

 * Refactored `SheetLink_Sync_Engine::dispatch()` to a `public static` method. Required
   so non-form sources (user sync, form abandonment, ACF, vertical packs) can dispatch
   through the same pipeline without instantiating a second sync engine (which would
   double-register form hooks). Existing `$instance->dispatch(...)` calls continue
   to work.
 * New filter: `sheetlink_register_dynamic_sources` applied by `SheetLink_Settings::
   get_all_sources()` so feature classes can register sources at runtime. Static
   sources cannot be clobbered.
 * Features Hub: render code now honors a `default_on` flag per feature, so newly-
   shipped features can default-enable without a one-shot migration. Used by Formula
   Guard, Email Digest, Notion, Airtable, Webhook Health, SMS Alerts.
 * Hook priority ordering documented on `sheetlink_payload_before_dispatch` (10 
   ad-conversion columns -> 20 Formula Guard sanitisation -> 50 Duplicate Prevention)
   and `sheetlink_after_delivery` (30 Meta CAPI -> 40 Airtable -> 45 Notion -> 50
   SMS).
 * Apps Script generator emits two new payload markers – `_sheetlink_ping=1` (webhook
   health check) and `_updateMode=1` + `_updateKey=<col>` + `_updateValue=<val>`(
   upsert). Older deployed scripts ignore both harmlessly; new behavior requires
   regenerating + redeploying the script.
 * 4 new cron events registered, all unscheduled in `sheetlink_deactivate()`: `sheetlink_email_digest_cron`,`
   sheetlink_form_abandonment_sweep`, `sheetlink_webhook_health_sweep`. Existing`
   sheetlink_retry_queue` continues unchanged.

#### 1.9.3

 * New: Google Ads offline conversion tracking. Capture GCLID, wbraid, and gbraid
   from Google Ads traffic; export completed conversions as a formatted CSV for 
   Google Ads offline conversion import. Configure per rule under SheetLink -> Google
   Ads Conversions.
 * Enhancement: wbraid and gbraid click IDs now captured alongside GCLID – required
   for iOS and in-app Google Ads traffic.
 * Enhancement: UTM cookie TTL extended from 30 minutes to 90 days, matching the
   Google Ads attribution window.
 * Developer: new `sheetlink_payload_before_dispatch` filter for extending the outbound
   payload after data enrichment but before delivery.

#### 1.9.2

 * New: **Auto pass-through field mapping**. Leave the Field Mapping rows empty 
   and SheetLink syncs every form field to your sheet automatically, in form order,
   header row keyed by field name. Internal WordPress fields (nonces, `_wp_http_referer`,
   embed post id) are filtered out. Add explicit field-map rows only when you want
   to pin specific fields to specific spreadsheet columns, skip fields, or reorder.
 * New: Nested form-field flattening for Fluent Forms composite fields. The Fluent«
   Name» field (which emits `names => {first_name, last_name}`) is now addressable
   as `names.first_name` and `names.last_name` in explicit field maps. The flat `
   names` key still works and now produces a space-joined display value (was comma-
   imploded).
 * UI: Field Mapping section on the rule setup page now explains the auto-sync default
   and when explicit mapping is needed.
 * Fix: prior to this release, explicit field maps using human-readable labels (
   e.g. «First Name», «Email») silently dropped values because the dispatcher reads
   the form’s raw payload keys. Existing rules using lowercase payload keys (`email`,`
   subject`, `message`) continue to work; rules built with the wizard’s label keys
   should be re-saved or simply cleared to use the new pass-through default.

#### 1.9.1

 * New: **Bulk Site Management – Network Template** (Agency / Enterprise / Agency
   Bundle / Plus). New `Network Template` admin page lets the license owner snapshot
   one site’s rules and settings, publish it as the canonical fleet template via
   the customer portal, and pull-and-apply it on every other licensed site. Webhook
   URLs and per-site secrets are deliberately excluded from the template – each 
   site keeps its own destination credentials. Settings are merged; rules are replaced
   wholesale with local URLs preserved by rule ID.
 * New: Backend infrastructure for the **AI Analytics weekly email digest**, **delivery
   failure alerts**, and **Fan-Out bundle analytics dashboard**. Sites with the 
   corresponding entitlement begin receiving emails on the next cron tick (Mondays
   09:00 UTC for digests, every 30 minutes for alerts).
 * New: Backend cross-site fleet view at /api/sheetlinkwp/portal/fleet returns the
   activation roster + 7-day delivery health for fleet-wide reporting.
 * Security: SSRF allowlist on the CRM Fan-Out backend – Slack webhooks must end
   in hooks.slack.com; Salesforce instance URLs must end in salesforce.com / force.
   com / salesforce.mil; ActiveCampaign API URLs are restricted to *.api-{us1,us2,
   au,eu}.com. Two-Way Sync inbound relay validates the activation domain before
   forwarding.
 * Security: Zod input validation on the CRM Fan-Out and Two-Way Sync inbound endpoints;
   malformed requests now return 400 with a precise error message instead of being
   silently ignored.
 * Security: Per-IP rate limit (30 requests/minute) and constant-time secret comparison
   on the SheetLinkWP admin and scoring-worker endpoints.
 * No plugin-side breaking changes. No schema migration on the plugin database (
   the new fleet-template fields live on the SheetLinkWP backend, not in the WordPress
   site).

#### 1.9.0

 * New: **Two-Way Sync echo suppression**. When the plugin writes to a Google Sheet
   that also has the Two-Way Sync onEdit Apps Script wired up, the resulting onEdit
   echo is now suppressed via a 60-second fingerprint cache. Listeners of `sheetlinkwp_sheet_update`
   no longer receive the plugin’s own writes bouncing back. Eliminates the most 
   common loop-risk scenario on the Two-Way Sync add-on.
 * New: **GDPR consent audit log**. Per-submission audit trail …

## Meta

 *  Versió **1.14.0**
 *  Darrera actualització **fa 10 hores**
 *  Instal·lacions actives **20+**
 *  Versió del WordPress ** 5.8 o posterior **
 *  Provada fins a **7.0.2**
 *  Versió del PHP ** 7.4 o posterior **
 *  Idioma
 * [English (US)](https://wordpress.org/plugins/sheetlink-forms/)
 * Etiquetes
 * [contact form 7](https://ca.wordpress.org/plugins/tags/contact-form-7/)[excel](https://ca.wordpress.org/plugins/tags/excel/)
   [Google Sheets](https://ca.wordpress.org/plugins/tags/google-sheets/)[gravity forms](https://ca.wordpress.org/plugins/tags/gravity-forms/)
   [WPForms](https://ca.wordpress.org/plugins/tags/wpforms/)
 *  [Vista avançada](https://ca.wordpress.org/plugins/sheetlink-forms/advanced/)

## Valoracions

Encara no s'ha enviat cap ressenya.

[Your review](https://wordpress.org/support/plugin/sheetlink-forms/reviews/#new-post)

[Visualitzeu totes les ressenyes](https://wordpress.org/support/plugin/sheetlink-forms/reviews/)

## Col·laboradors

 *   [ sheetlink ](https://profiles.wordpress.org/sheetlink/)

## Suport

Teniu quelcom a dir? Necessiteu ajuda?

 [Visualitza els fòrums de suport](https://wordpress.org/support/plugin/sheetlink-forms/)