> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Sheets audit profile, Vortex IQ

> What the Vortex IQ Google Sheets health audit checks: Google Sheets: Source-of-Truth Freshness, Schema Integrity & Catalogue Drift

**[Nerve Centre KPIs](/nerve-centre/kpi-cards/google-sheets) · [Audit Profile](/nerve-centre/kpi-cards/google-sheets/audit) · [Sentiment Settings](/nerve-centre/kpi-cards/google-sheets/sentiment)**

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
