Skip to main content
Nerve Centre KPIs · Audit Profile · Sentiment Settings The questions every merchant running the business off a Google Sheet asks at 9am on Monday: did the upstream feed actually update the sheet or has it gone stale, did anyone break the header schema the importer depends on, and how many error cells (#REF!/#N/A/#DIV/0!) are silently poisoning rows. Cross-references the ecommerce catalogue on SKU - a pricing/cost master sheet that disagrees with the live storefront, or SKUs in the sheet that don’t exist in the store, is recoverable revenue (wrong price published) or wasted ops time (orphaned overrides).

What this audit checks

Authentication & access

  • OAuth refresh token still valid - token exchange succeeds and is not revoked / expired
  • Granted scopes include spreadsheets.readonly AND drive.metadata.readonly (freshness needs Drive)
  • Configured spreadsheet_id resolves - spreadsheets.get returns 200, not 404 (deleted) or 403 (access revoked)
  • Configured range_a1 / sku_column still resolve against the current tab and header row

Freshness & feed health

  • Sheet not edited within expected cadence - Drive modifiedTime older than refresh threshold (default 168h) signals a stalled upstream job
  • Row count dropped sharply vs the last run (>20% fewer populated rows = truncated export or accidental over-write)
  • Primary tab emptied - populated range collapsed to header-only since last run

Schema integrity

  • Header signature drift - header row differs from the last-known-good signature (renamed / reordered / deleted column)
  • Named range missing or moved - a namedRange the importer references no longer resolves
  • Required column absent - the configured sku_column (or other importer-required header) is gone from the header row

Cell-level data integrity

  • Error-cell rate above threshold - #REF!/#N/A/#DIV/0!/#VALUE!/#NAME?/#NULL!/#NUM! cells in read rows (>1%)
  • Blank-row rate above threshold - empty rows inside the populated range (>10%) break range-based importers
  • Grid bloat - workbook approaching the 10M-cell ceiling (sustained growth from append-only feeds)

Cross-channel: catalogue drift (revenue at risk)

  • Price/cost drift - sheet row diverges from the live storefront price for the same SKU by >5% (sibling = bigcommerce.product / shopify.product / adobe_commerce.product on sku)
  • Orphan SKUs - SKUs in the sheet missing from the live catalogue (stale feed ran ahead of store sync, or typos)
  • Missing SKUs - catalogue SKUs absent from the source-of-truth sheet (override gap; product selling without a managed cost/price row)

Data sources

  • GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheet_id} - Workbook metadata, tab list (sheets[]), named ranges, grid sizes
  • GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheet_id}/values/{range} - Cell values for the read range; FORMATTED_VALUE render surfaces error-cell strings
  • GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheet_id}/values:batchGet - Coalesce multi-tab / multi-range reads into one request to stay under quota
  • GET https://www.googleapis.com/drive/v3/files/{spreadsheet_id} - modifiedTime + owner for freshness (Sheets API does not expose modified-time)
  • GET https://www.googleapis.com/drive/v3/files/{spreadsheet_id}/revisions - Revision history for edit cadence and who-changed-what attribution