Google Search Console integration
Pulls real Search Console data into Magento so editors can see impressions / clicks / CTR / position per URL without leaving the admin — and so the dashboard widget shows actual SEO outcomes alongside the suite's audit counts.
Why integrate
- Close the loop on optimisation. You change a meta title; GSC tells you whether impressions and clicks moved. Without the integration that's a separate browser tab and context switch.
- Cheap dashboard signal. A 7-day clicks + impressions card next to the audit counts is the single most-asked-about admin home metric.
- Wider corpus for the auto-healer. Discovered URLs from GSC can feed the 404 Auto-Heal corpus (roadmapped — currently the corpus is
url_rewrite-only).
Two auth modes
Service account JSON (recommended for agencies)
How:
- In Google Cloud Console: create a service account, download its JSON key
- In Search Console (the property's Settings → Users): add the service account's email as a user (Restricted access is enough for read-only)
- In Magento: paste the JSON into Stores → Configuration → SEO Suite → Google Search Console → Service account JSON
No browser consent dance. The service account email gets the same access in Search Console that the human owner would have. Ideal when you manage many client stores — one SA can be added to every property.
OAuth refresh token (for end-user-owned setups)
How:
- Create an OAuth 2.0 Client ID in Google Cloud Console
- Run through the consent flow once (one-off, manual) to get a refresh token
- Paste the client ID, client secret, and refresh token into Magento
Works when the GSC property is owned by an individual who doesn't want to grant a service account access. More setup steps but more familiar.
Either mode encrypts the credentials via Magento's standard core_config_data encryption.
Configuration
Stores → Configuration → SEO Suite → Google Search Console
| Field | Default |
|---|---|
| Enable GSC sync | No |
| Authentication mode | Service account |
| Service account JSON | (empty) — encrypted |
| OAuth client ID / secret / refresh token | (empty) — secret + token encrypted |
| GSC property URL | (empty) — e.g. https://store.example/ or sc-domain:store.example |
| Look-back window (days) | 7 (max 90) |
| Retention (days) | 90 |
Per-store overrides supported — multi-store installs can map each Magento store to its own GSC property.
What the sync pulls
For each enabled store, daily cron byte8_seosuite_gsc_sync (04:30) calls:
POST https://searchconsole.googleapis.com/webmasters/v3/sites/{property}/searchAnalytics/query
{
"startDate": "<look_back_days ago>",
"endDate": "today",
"dimensions": ["date", "page", "device"],
"rowLimit": 25000
}
Paginates via startRow until exhausted. Each row is an unique combo of (date, page, device). Rows are upserted into byte8_seosuite_gsc_metrics keyed on (store_id, url_hash, metric_date, device) — re-running the sync over an overlapping date window is safe because GSC backfills today's data for ~48 hours.
CLI
bin/magento seosuite:gsc:sync # all enabled stores, configured look-back
bin/magento seosuite:gsc:sync -s 1 # specific store
bin/magento seosuite:gsc:sync -l 28 # override look-back to 28 days
Output:
GSC sync complete — stores synced 2, rows persisted 18420, errors 0.
View at Marketing → SEO Suite → GSC Performance
Useful right after enabling the integration: do an initial 90-day backfill to populate the dashboard chart immediately.
Admin grid
Marketing → SEO Suite → GSC Performance
Sortable columns: date, page, device, impressions, clicks, CTR, position. Date-range filter, store filter, full-text URL search.
Default sort: most recent date desc. Click any column header to re-sort (clicks desc to find your top performers, position asc to find what's nearly ranking page-1).
Toolbar: Sync Now triggers an inline run for admins without cron access.
Dashboard widget integration
The SEO Suite Health widget gains a 5th card showing:
- clicks (7-day total)
- impressions (7-day total)
- last synced timestamp
Card status:
- Grey "Not synced yet" before the first sync
- Green when clicks > 0
- Links to the GSC Performance grid
Performance
A typical store with ~5000 indexed URLs over a 7-day window produces ~30k–80k metric rows. The bulk-upsert is chunked at 1000 rows per query so even huge catalogs stay under MySQL's max_allowed_packet default.
Daily cron typically completes in 10–30 seconds end-to-end.
Token caching
Access tokens are cached for 50 minutes (Google's tokens are 60-min lived) so subsequent API calls within the same cron run reuse the same token. The cache key is per-store so different stores can use different credentials cleanly.
What's NOT in this release
- URL Inspection API — programmatically requesting indexing for new product URLs. Roadmapped for v2.11.x as a follow-up; needs read-write OAuth scope and a per-product action button.
- GSC corpus into the auto-healer — feeding GSC's "Discovered URLs" into the 404 auto-heal corpus to widen what it can match against. Roadmapped — currently the corpus is
url_rewrite-only. - SERP ranking history charts — per-product 90-day position chart on the product edit form. Nice-to-have, not in scope for v2.11.
Limitations
- GSC has a ~48h delay on today's data, so today's metric row will be incomplete and revised over the next two days
- GSC's per-day rowLimit is 25000 rows — for catalogs with more than ~100k URLs, you may not capture every long-tail URL on every sync. The default 7-day look-back keeps within limits for typical stores; reduce if you have a very large catalog
- The integration is read-only — it doesn't write anything back to GSC
Related
- Dashboard widget — the 5th card
- 404 Auto-Heal — future GSC-corpus integration target