How to Connect Gravity Forms to Google Sheets

The complete 2026 guide for piping Gravity Forms entries into Google Sheets - without Zapier tasks, without the official addon's Elite price tag, and without OAuth token headaches.

Last updated: 2026-03-13 7 min read

TL;DR

Install SheetLink Forms, deploy a Google <a href="/docs/google-sheets-setup">Apps Script</a> webhook, connect it in SheetLink settings, map your Gravity Forms fields to Sheet columns, and test. About 5 minutes start to finish. 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 - via Apps Script webhook, not OAuth - and works with Basic, Pro, and Elite alike.

This guide covers the full setup: creating your Sheet, deploying the 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 about 5 minutes 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 costs $39 once.

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. Webhook POST with retry: Payload is POSTed to Apps Script. 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

    Create your destination Sheet

    Open Google Sheets and create a new spreadsheet. Name it - "GF Entries" or "Client Leads 2026". You can add column headers matching your Gravity Forms field labels, or leave it blank and let SheetLinkWP generate them automatically.

  2. 2

    Deploy the Apps Script webhook

    In your Sheet, go to Extensions > Apps Script. Replace the default code with the SheetLinkWP receiver script. Deploy as a Web app with "Anyone" access. Copy the deployment URL.

  3. 3

    Install SheetLink Forms

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

  4. 4

    Connect the webhook

    In SheetLink > Settings, paste the Apps Script URL and save. A green indicator confirms the connection.

  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 key Source Notes
N Single-value field Simple text, email, URL, number, phone, hidden, date. The ID you see in the Gravity Forms editor.
N.3 Name (First) Name field subfield. .2 = prefix, .3 = first, .4 = middle, .6 = last, .8 = suffix.
N.1 Address (Street 1) Address subfields: .1 street, .2 street 2, .3 city, .4 state, .5 zip, .6 country.
N Checkbox group Multi-checked values join with commas. SheetLinkWP preserves checkbox order as defined in the form.
N.1, N.2, N.3 Checkbox individual options For granular reporting, map each checkbox option to its own column. Writes 1 or blank.
N File upload URL to the file (absolute, public if Gravity's protected uploads are off). For multiple files, JSON array stringified.
N List field Repeater-style list data. JSON-serialized into a single cell by default. Enable "Expand lists" in settings to write one row per list item instead.
total Pricing total Total cart/order value for forms with product fields. Includes tax if Gravity calculates it.
currency Payment currency ISO currency code from the entry's payment meta.
payment_status Entry meta Paid, Processing, Failed, Active, Cancelled. For Stripe/PayPal Gravity feeds.
transaction_id Entry meta Payment gateway transaction reference (Stripe ch_..., PayPal transaction ID, etc.).
id Entry meta Gravity entry ID. Permanent, unique, globally stable. Use as Sheet primary key.
form_id Entry meta Numeric Gravity form ID. Handy for multi-form Sheets filtering.
date_created Entry meta UTC timestamp when the entry was saved. Format: YYYY-MM-DD HH:MM:SS.
source_url Entry meta Full URL the form was submitted from (includes any UTM query string).
user_agent Entry meta Submitter's browser user agent.
ip Entry meta Submitter's IP. Respects Gravity Forms' IP anonymization if enabled.
created_by Entry meta WordPress 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 a one-time $39, paying for itself inside of 5 months.

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. Ensure the webhook URL is current - <a href="/docs/google-sheets-setup">Apps Script</a> 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 <code>gform_entry_created</code> but not <code>gform_after_submission</code> 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 <code>gform_post_payment_refunded</code> 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+/mo$39 one-time
Works with GF Basic/Pro No (Elite only)YesYes
Auth method OAuth 2.0OAuth via ZapierApps Script (no tokens)
UTM capture NoExtra stepsAutomatic
Retry on failure Basic retryAuto-retryBuilt-in retry queue
Conditional routing Feed-basedMulti-path ZapBuilt-in rules
Works with other plugins NoYes (per-Zap)Yes (12 plugins)
Total 3-year cost $777$1,080+$39

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 Apps Script 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. One-time $39 payment. No per-entry fees.