PIP Google Sheets WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA
Install
Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/carkeek-studios/pip-google-sheets/releases/download/v1.0.0/pip-google-sheets-1.0.0.zipA WordPress plugin that syncs WooCommerce orders and Tribe Events attendee data to Google Sheets. Two independent exports are included:
- Orders export — for each paid WooCommerce order, one row per line item is appended in real time, including product data, Tribe event ticket details, order/customer info, and a configurable "How did you hear about us?" attribution breakdown.
- Attendee export — a nightly cron-driven export that writes one row per attendee for every Tribe event that ended the previous day. Sheet tabs are created automatically per year (e.g. "Attendees 2026").
Requirements
- WordPress 6.4+
- WooCommerce 8.0+
- PHP 8.1+
- A Google Cloud service account with the Google Sheets API enabled
- The Events Calendar + Event Tickets (required for attendee export)
- WP Crontrol (recommended for triggering backfill and nightly export jobs)
Installation
- Download the latest release zip from GitHub Releases.
- In WordPress admin go to Plugins → Add New → Upload Plugin and install the zip.
- Activate the plugin.
- Go to Settings → PIP Google Sheets and configure credentials and sheet URLs.
Automatic updates via Git Updater
Install Git Updater and the plugin will check GitHub for new releases automatically.
Configuration
Option A — Admin UI (development / staging)
- Go to Settings → PIP Google Sheets.
- Paste your service account JSON into the Service Account JSON field.
- Enter the full URL of your Orders Sheet (WooCommerce line-item export).
- Optionally enter a separate Attendees Sheet URL. Leave blank to use the same spreadsheet as orders.
- Optionally set an Orders Tab Name (default:
Sheet1). Attendee tabs are created automatically. - Save, then click Test Connection to verify.
Option B — wp-config.php constant (recommended for production)
Define the service account JSON as a constant before WordPress loads:
define( 'PIP_GS_SERVICE_ACCOUNT_JSON', '{"type":"service_account","project_id":"..."}' );
When this constant is present the admin textarea is hidden and the stored encrypted value is ignored.
Google Sheet setup
Share both Google Sheets (or the single shared sheet) with the service account's client_email as an Editor.
Orders sheet headers
Paste into row 1 of your orders tab:
Product Name Product ID Event Name Event Start Date Order ID Order Date Customer ID Customer Name Returning Customer Newsletter: Fresh Ink Google Search Instagram Facebook Word of Mouth Saw your Storefront Belltown Art Walk Flyer Print Ad Other
Attendees sheet headers
Paste into row 1 of each Attendees YYYY tab (tabs are created automatically on first export for that year):
Event Name Event Start Date Event End Date Category Names Category Slugs Attendee Name Attendee Email Attendee ID Ticket Name
Each column is separated by a tab character — paste directly into Google Sheets.
Column reference
Orders
| # | Column | Source |
|---|---|---|
| 1 | Product Name | WC_Order_Item_Product::get_name() |
| 2 | Product ID | WC_Order_Item_Product::get_product_id() |
| 3 | Event Name | Tribe Event Tickets: linked event post title |
| 4 | Event Start Date | Tribe Event Tickets: _EventStartDate meta |
| 5 | Order ID | WC_Order::get_id() |
| 6 | Order Date | WC_Order::get_date_created() |
| 7 | Customer ID | WC_Order::get_customer_id() |
| 8 | Customer Name | Billing first + last name |
| 9–19 | Heard-about columns | One 1 in the matching column; all others blank |
Attendees
| # | Column | Source |
|---|---|---|
| 1 | Event Name | Tribe event post title |
| 2 | Event Start Date | _EventStartDate meta |
| 3 | Event End Date | _EventEndDate meta |
| 4 | Category Names | tribe_events_cat terms, pipe-separated |
| 5 | Category Slugs | tribe_events_cat slugs, pipe-separated |
| 6 | Attendee Name | Tribe normalised holder_name |
| 7 | Attendee Email | Tribe normalised holder_email (WC billing email fallback) |
| 8 | Attendee ID | Tribe unique printable ticket ID |
| 9 | Ticket Name | Ticket product title |
Heard-about field
The plugin reads the order meta key _additional_wooccm0 (set by WooCommerce Checkout Manager Pro) and maps it to one of the 11 attribution columns. The mapping is filterable:
add_filter( 'pip_gs_heard_about_map', function ( $map ) {
$map['My Custom Option'] = 10; // maps to column 19 ("Other")
return $map;
} );
The map keys are matched case-insensitively against the stored meta value.
Cron jobs (WP Crontrol)
Both the attendee export and the orders backfill are triggered via WP Crontrol action hooks.
Nightly attendee export
Runs each night and exports attendees for any Tribe events that ended the previous day.
| Field | Value |
|---|---|
| Hook name | pip_gs_run_attendee_export |
| Arguments | ["nightly"] |
| Schedule | Daily |
Events already exported are skipped (idempotent — safe to re-run).
Attendee backfill (one-time)
Exports all 2026 events that have not yet been synced. Run once manually from WP Crontrol, then delete the event.
| Field | Value |
|---|---|
| Hook name | pip_gs_run_attendee_export |
| Arguments | ["backfill"] |
| Schedule | Run once (manual) |
Orders backfill (one-time)
Syncs historical WooCommerce orders (processing/completed) placed on or after 2025-07-01 that have not yet been exported. Processes 25 orders per run by default. Repeat until the PHP error log reports Backfill complete.
| Field | Value |
|---|---|
| Hook name | pip_gs_backfill_orders |
| Arguments | [25] (batch size — increase to process more per run) |
| Schedule | Run manually until complete |
Check the PHP error log after each run:
pip-google-sheets order backfill: processed 25, errors 0. More orders may remain — run again.
pip-google-sheets order backfill: processed 12, errors 0. Backfill complete.
Async processing
Real-time order syncing uses Action Scheduler (bundled with WooCommerce) so network latency never affects checkout. Failed jobs are retried automatically.
Cron-triggered exports (attendee nightly, attendee backfill, order backfill) run synchronously within the cron job and log results to the PHP error log.
Security
- Service account credentials are encrypted with AES-256-GCM before being stored in
wp_options. - The REST API is blocked from reading settings (
show_in_rest => false). - The
PIP_GS_SERVICE_ACCOUNT_JSONconstant bypasses database storage entirely.
Changelog
1.1.0
- Added nightly Tribe Events attendee export to a dedicated Google Sheet (or shared sheet with auto-created year tabs).
- Added WooCommerce orders backfill via WP Crontrol (
pip_gs_backfill_ordershook). - Settings page now has separate Orders Sheet URL and Attendees Sheet URL fields.
- Column headers for both exports shown in Settings.
1.0.0
- Initial release.
Releases
5 releases. Each count is every asset in that release; expand a row for the breakdown.