How to Connect Gravity Forms to Google Sheets

The complete 2026 guide for piping Gravity Forms entries into Google Sheets - without Zapier tasks and without the official addon's Elite price tag. Connect with one click, or self-host the classic webhook.

Last updated: 2026-07-247 min read

TL;DR

Install SheetLink Forms, click Connect Google, pick or create a Sheet in the Google file picker, map your Gravity Forms fields to Sheet columns, and test. The connection takes about a minute - or use the classic Apps Script webhook for a fully self-hosted setup. No recurring fees.

Gravity Forms is the form builder of choice for WordPress agencies and enterprise sites - over 1 million active licenses. It's not cheap: Basic is $59/year, Pro is $159/year, and Elite is $259/year. The native Google Sheets addon is locked to Elite, putting Sheets delivery behind a $200+/year tier jump if you're on Pro.

Gravity Forms also has an Add-On Framework that lets third-party addons hook into its submission pipeline at every stage. SheetLinkWP uses that framework to deliver submissions to Google Sheets directly - one-click Google connect, or the classic Apps Script webhook if you prefer fully self-hosted - and works with Basic, Pro, and Elite alike.

This guide covers the full setup: connecting Google Sheets (one click, or the classic webhook), mapping Gravity Forms' numeric field IDs (including compound fields like Name.3 / Address.1), and handling the Gravity-specific scenarios that differ from other form plugins - multi-page forms, entry updates, partial entries, and payment feed coexistence. The setup takes a few minutes (the Google connection itself is about a minute) and produces production-ready delivery with a built-in retry queue.

Why Gravity Forms Users Need Google Sheets

Gravity Forms stores entries in a first-class database table (wp_gf_entry and wp_gf_entry_meta) with a rich admin UI for browsing, filtering, and exporting. That's more than most form plugins offer - but it still keeps the data inside WordPress, visible only to users with Gravity Forms capabilities.

Teams using Gravity Forms at scale hit three pain points: clients and stakeholders can't see entries without WP admin access, the built-in reporting isn't enough for real analytics, and CSV export is a manual chore when you want daily reconciliation. A live-updating Google Sheet solves all three. Share with anyone via email, build pivot tables and Looker Studio dashboards, and treat the Sheet as the source of truth for downstream workflows.

The native Gravity Forms Google Sheets addon does this - but it requires Elite ($259/yr) and relies on OAuth tokens that occasionally need reauthorization. SheetLinkWP achieves the same outcome via a stateless Apps Script webhook, works on any Gravity Forms tier, and the core delivery is free.

How SheetLinkWP Plugs Into Gravity Forms

SheetLinkWP registers as a Gravity Forms add-on using the GF Add-On Framework. That means it fires at the same points the native Stripe, Mailchimp, and Slack addons do - cleanly, predictably, and with full access to Gravity's entry lifecycle.

  1. 1. Entry submitted: Gravity Forms runs its standard validation (required fields, anti-spam, conditional logic) and creates an entry in wp_gf_entry.
  2. 2. gform_after_submission fires: SheetLinkWP listens on this hook, which runs after the entry is saved and after any feeds (notifications, payments) have been processed. Payment status and transaction IDs are already populated at this point.
  3. 3. Field data extracted via GFAPI: SheetLinkWP uses GFAPI::get_entry() to read the entry - the same method Gravity's own addons use. This guarantees consistent field handling for compound fields (Name.3, Address.1), list fields, and file uploads.
  4. 4. Smart field handling: Compound fields are decomposed to sub-fields. List fields (repeater-style) are JSON-serialized into a single cell. Pricing fields include total and currency automatically.
  5. 5. UTM / click ID enrichment: If enabled, SheetLinkWP adds source attribution columns from the referring URL or a persistent cookie.
  6. 6. Delivery with retry: The row is delivered to Google Sheets - directly via the Sheets API on one-click connections, or via your Apps Script web app on the classic method. On failure, the entry ID is queued for retry - and because Gravity Forms preserves the entry regardless, you can always replay failed deliveries from the admin.

What You Need

  • A WordPress site with Gravity Forms installed (any license tier) and at least one form
  • A Google account with access to Google Sheets
  • SheetLink Forms plugin (free tier or any paid license)

Step-by-Step Setup

Field mapping tip: Gravity Forms uses numeric field IDs (1, 2, 3, etc.) with sub-IDs for complex fields (1.3 for First Name, 1.6 for Last Name in a Name field). SheetLinkWP displays the full label path so you can map "Name (First)" and "Name (Last)" to separate columns.
  1. 1

    Install SheetLinkWP

    Download from sheetlinkwp.com or WordPress.org, upload and activate via Plugins > Add New > Upload Plugin.

  2. 2

    Connect Google Sheets (one click)

    In your WordPress admin, go to SheetLink > Google Sheets (OAuth) - or use the setup wizard's "Connect Google (one click)" card. Click Connect Google and approve the standard Google consent screen. SheetLink uses Google's drive.file permission, so it can only see and write to the spreadsheets you pick or create - never the rest of your Drive. The whole connection takes about a minute.

  3. 3

    Pick or create your destination spreadsheet

    After you connect, the Google file picker opens. Pick an existing spreadsheet or create a new one on the spot - name it something you'll recognize, like "GF Entries" or "Client Leads 2026". On new sheets, SheetLink seeds the header row automatically, and when a column header matches a form field name, that field is matched to the column for you.

  4. 4

    Alternative: deploy the classic Apps Script webhook

    Prefer a fully self-hosted setup with no OAuth? The classic Apps Script webhook method still works and is fully supported. Create a Google Sheet, go to Extensions > Apps Script, paste the SheetLinkWP receiver script (from SheetLink > Settings > Setup Guide), deploy it as a Web app with "Anyone" access, then paste the deployment URL into the "Webhook URL" field in SheetLink > Settings. Data flows WordPress -> your own Apps Script -> your sheet, with no SheetLink-hosted service in the auth path. Skip this step if you used one-click connect.

  5. 5

    Map Gravity Forms fields

    Go to SheetLink > Field Mapping, select "Gravity Forms" as the form plugin, and choose your form. SheetLinkWP reads the Gravity Forms field structure - including multi-column layouts, sections, and conditional fields. Map each field to a Sheet column. Gravity Forms uses numeric field IDs, but SheetLinkWP shows the field labels alongside them.

  6. 6

    Configure advanced options

    Enable UTM capture, click ID tracking, and metadata fields. If you use Gravity Forms conditional logic, note that SheetLinkWP captures the final submitted values - hidden fields are excluded from the payload.

  7. 7

    Submit a test entry

    Fill out your Gravity Forms form on the front end and submit. Check your Google Sheet for the new row. Verify field mapping is correct and adjust if needed.

Gravity Forms Field ID Reference

Gravity Forms assigns a numeric ID to every field when you create it. Compound fields (Name, Address, Time) use decimal sub-IDs. Entry metadata - not visible in the form editor but always present on every entry - can also be mapped directly:

Field ID / meta keySourceNotes
NSingle-value fieldSimple text, email, URL, number, phone, hidden, date. The ID you see in the Gravity Forms editor.
N.3Name (First)Name field subfield. .2 = prefix, .3 = first, .4 = middle, .6 = last, .8 = suffix.
N.1Address (Street 1)Address subfields: .1 street, .2 street 2, .3 city, .4 state, .5 zip, .6 country.
NCheckbox groupMulti-checked values join with commas. SheetLinkWP preserves checkbox order as defined in the form.
N.1, N.2, N.3Checkbox individual optionsFor granular reporting, map each checkbox option to its own column. Writes 1 or blank.
NFile uploadURL to the file (absolute, public if Gravity's protected uploads are off). For multiple files, JSON array stringified.
NList fieldRepeater-style list data. JSON-serialized into a single cell by default. Enable "Expand lists" in settings to write one row per list item instead.
totalPricing totalTotal cart/order value for forms with product fields. Includes tax if Gravity calculates it.
currencyPayment currencyISO currency code from the entry's payment meta.
payment_statusEntry metaPaid, Processing, Failed, Active, Cancelled. For Stripe/PayPal Gravity feeds.
transaction_idEntry metaPayment gateway transaction reference (Stripe ch_..., PayPal transaction ID, etc.).
idEntry metaGravity entry ID. Permanent, unique, globally stable. Use as Sheet primary key.
form_idEntry metaNumeric Gravity form ID. Handy for multi-form Sheets filtering.
date_createdEntry metaUTC timestamp when the entry was saved. Format: YYYY-MM-DD HH:MM:SS.
source_urlEntry metaFull URL the form was submitted from (includes any UTM query string).
user_agentEntry metaSubmitter's browser user agent.
ipEntry metaSubmitter's IP. Respects Gravity Forms' IP anonymization if enabled.
created_byEntry metaWordPress user ID if the submitter was logged in, otherwise empty.

Real-World Use Cases

Drop from GF Elite to Pro and save $100/yr

You're paying for Gravity Forms Elite solely for the Google Sheets addon. Elite is $259/year, Pro is $159/year. SheetLinkWP unlocks Sheets delivery on Pro (or Basic at $59/year) for free - the savings start the day you downgrade.

Field mapping: Map field IDs 1 through N to Sheet columns, plus entry meta id, date_created, source_url, and any payment meta if applicable.

Event registration with payment status mirror

Gravity + Stripe feed handles ticket purchases. Finance wants a live-updating spreadsheet of paid, pending, and refunded registrations without granting them access to the WP admin or Stripe dashboard. SheetLinkWP runs after the Stripe feed completes, so payment_status and transaction_id are already resolved when the row is written.

Field mapping: Attendee fields (N.3, N.6, email, ticket_type) + total, currency, payment_status, transaction_id, id, date_created. Route refunds/failed payments to a separate tab via conditional routing.

Multi-page B2B lead form with scoring

Your Gravity form is three pages (company -> use case -> budget) with conditional logic. SheetLinkWP captures the complete submission after the final page. Add a Google Sheets formula column that calculates a lead score based on budget and team-size fields for instant sales prioritization.

Field mapping: All visible fields + entry meta. In the Sheet, add formula column: =IF(AND(budget>5000, team_size>50), "Hot", IF(budget>1000, "Warm", "Cold")). Sort newest to oldest, filter by score.

Quiz / survey with per-question response analysis

Gravity's Survey add-on captures individual question responses. SheetLinkWP writes each survey field to its own column, enabling response-frequency pivots and per-question trend charts in the Sheet.

Field mapping: Map every survey question field individually (not the aggregate). Consider enabling SheetLinkWP's "Expand checkbox options" so each answer becomes its own boolean column - ideal for response-frequency pivots.

Advanced Tips

Use entry ID as the Sheet primary key

Map Gravity's id entry meta to column A. This gives you a permanent, unique reference back to the Gravity admin (/wp-admin/admin.php?page=gf_entries&view=entry&lid=ENTRY_ID). If you ever need to pull admin notes, attached files, or full history for a row, one click gets you there.

GFAPI compatibility guarantees consistency

SheetLinkWP uses GFAPI::get_entry() for field reads - the same function Gravity's own addons use. That means quirks like checkbox encoding, list field serialization, and pricing field calculation are handled identically to what Stripe/Mailchimp/Slack addons see. No drift, no edge cases where SheetLinkWP shows different data than other feeds.

Preserve Gravity feeds alongside SheetLinkWP

If you have existing Gravity feeds (notifications, Stripe, Zapier, Mailchimp), keep them. SheetLinkWP runs after feeds on the gform_after_submission hook, so payment data and email delivery are resolved before your row is written. You can run SheetLinkWP and the Gravity Zapier addon side-by-side during migration as a dual-write safety net.

Route payment status changes to a follow-up tab

Gravity fires hooks when payment status changes (refund, chargeback, etc.). SheetLinkWP's "Status change" option writes an additional row to a separate Sheet tab every time a payment updates. This preserves your original submission row and gives you an audit trail of status changes - useful for revenue reconciliation and dispute tracking.

Handle multi-file uploads cleanly

For multiple file upload fields, Gravity stores a JSON array. SheetLinkWP can either JSON-serialize into one cell (default) or split into multiple columns with a configurable cap (up to 10 columns per file field). For most use cases, split-mode is easier to scan - each filename / URL gets its own sortable cell.

Troubleshooting

Gravity Forms entries show in WP admin but not in Google Sheets

Check SheetLink > Delivery Log for errors. On one-click connections, confirm the Google connection is active under SheetLink > Google Sheets (OAuth). On the classic method, ensure the webhook URL is current - Apps Script URLs change when you create a new deployment. Also verify that SheetLink's form mapping is pointing to the correct Gravity Forms form ID.

Address fields only show partial data

Gravity Forms Address fields have sub-IDs for street, city, state, zip, country. Each sub-field appears separately in SheetLink's mapping interface. Map each sub-field to its own column.

Product/pricing fields aren't captured

Gravity Forms product fields (pricing, quantity, total) are supported. Make sure they're included in your field mapping. The total is calculated by Gravity Forms before submission, so SheetLinkWP receives the final value.

List field data shows as a single JSON blob

By default, SheetLinkWP writes list fields as JSON into one cell. To split into separate columns (one per list row) or write one Sheet row per list item, enable "Expand list fields" in SheetLink > Settings > Gravity Forms.

Partial entries (Gravity's save-and-continue) aren't showing up

Partial entries fire gform_entry_created but not gform_after_submission until the form is completed. SheetLinkWP only writes completed submissions by default. To capture partials too, enable "Include partial entries" in settings - they route to a separate Sheet tab.

Stripe refunds don't update the Sheet row

Gravity fires gform_post_payment_refunded when a refund is processed. SheetLinkWP can listen on this hook and either update the original row's status or write a new row to a "Status Changes" tab. Enable in SheetLink > Settings > Payment Tracking.

Gravity Forms to Google Sheets: Your Options

FeatureGF Native AddonZapierSheetLinkWP
Price$259/yr (Elite plan)$29.99+/moFree
Works with GF Basic/ProNo (Elite only)YesYes
Auth methodOAuth 2.0OAuth via ZapierOne-click OAuth (drive.file) or Apps Script webhook
UTM captureNoExtra stepsAutomatic
Retry on failureBasic retryAuto-retryBuilt-in retry queue
Conditional routingFeed-basedMulti-path ZapBuilt-in rules
Works with other pluginsNoYes (per-Zap)Yes (12 plugins)
Total 3-year cost$777$1,080+$0

Frequently Asked Questions

Does SheetLinkWP work with all Gravity Forms license tiers?

Yes. SheetLinkWP works with Gravity Forms Basic, Pro, and Elite. Unlike the native Google Sheets addon which requires Elite ($259/year).

Can I use Gravity Forms feeds alongside SheetLinkWP?

Yes. SheetLinkWP operates independently of Gravity Forms' feed system. Your existing email notifications, Stripe payments, and other feeds continue to work.

Does SheetLinkWP support Gravity Forms multi-page forms?

Yes. SheetLinkWP captures the complete submission after all pages are completed. Fields from every page are included in the Sheet row.

Can I route different Gravity Forms to different Sheets?

Yes. Use SheetLinkWP's conditional routing to send different forms (or submissions matching certain conditions) to different Sheets or tabs.

What about Gravity Forms quiz and survey fields?

Quiz scores, survey responses, and other specialty field types are captured as their submitted values. The score or response text appears in the mapped Sheet column.

Does SheetLinkWP update existing Sheet rows when an entry is edited?

Yes, optionally. By default, SheetLinkWP appends a new row per submission. Enable "Sync entry edits" in settings to update the existing Sheet row (matched by entry ID) when a Gravity entry is edited from the WP admin. Useful for CRM-style workflows where entries get updated over time.

Can I import historical Gravity entries into a Sheet?

Yes. Use SheetLinkWP's bulk export tool (SheetLink > Tools > Bulk Export) to push existing Gravity entries to your Sheet retroactively. Useful when you're migrating from the native addon or starting fresh with a Sheet for historical analysis.

How does this compare to Gravity Forms' Webhooks addon?

Gravity Webhooks (Elite-only) can POST to any URL - including your own Apps Script - but doesn't handle retries, UTM capture, field mapping UI, or Google Sheets-specific formatting. SheetLinkWP is purpose-built for Sheets and includes all of that out of the box.

Is there a limit on Gravity Forms entries per day?

No limit on the SheetLinkWP side. Google Sheets has a 10-million-cell limit per spreadsheet and the classic Apps Script method has a 6-minute execution quota per invocation. For high-volume forms (over 10k entries/day), split across multiple Sheets or use monthly rotation.

Related How-To Guides

Connect Gravity Forms to Google Sheets - Any License Tier

Works with Basic, Pro, or Elite. Free plugin. No per-entry fees.