Skip to content

Add Google Search Console plugin#63

Open
Daniel-Hodgson-SquaredUp wants to merge 1 commit into
mainfrom
add-gsc-plugin
Open

Add Google Search Console plugin#63
Daniel-Hodgson-SquaredUp wants to merge 1 commit into
mainfrom
add-gsc-plugin

Conversation

@Daniel-Hodgson-SquaredUp

Copy link
Copy Markdown

What does this change do?

Adds a new Google Search Console plugin that enables users to connect a GSC property via OAuth 2.0 and visualize search performance data directly within SquaredUp.

The plugin includes the following data streams. along with default dashboards for both site-level and page-level SEO analysis:

  • Country breakdown
  • Device breakdown
  • Page distribution
  • Page performance over time
  • Page performance summary
  • Page URLs
  • Pages
  • Queries
  • Queries by page
  • Site performance over time
  • Site performance summary

Why is it useful?

Google Search Console contains valuable SEO data and is one of the most widely used tools in the industry. It is also currently a gap in the SquaredUp plugin catalog.

This plugin allows users to:

  • Monitor clicks, impressions, CTR, and average position over time
  • Identify top-performing and under-performing pages
  • Analyse search queries driving traffic to specific pages
  • Break down performance by country and device
  • Scope dashboards to indexed GSC page objects
  • Compare current performance against previous periods

The included dashboards provide an out-of-the-box SEO reporting experience with minimal configuration required.

Testing performed

Validation

  • Plugin successfully validated when deployed via the CLI
  • Confirmed all plugin components were bundled correctly

Manual testing

Tested against a live Google Search Console property. A Google Pages test site was created and populated with content, with impressions and clicks generated over several weeks to produce representative Search Console data:

https://danielchodgson.github.io/gsc-lcp-test-site/index.html

Verified:

  • Authentication and configuration flow
  • All data streams return expected data
  • Page indexing returns all discovered pages
  • Dashboard variable integration using indexed GSC page objects
  • Default Site Overview dashboard loads successfully
  • Default Page Overview dashboard loads successfully
  • Timeframe handling functions correctly
  • Page scoping functions correctly

Screenshots

image image image image

Known limitations / follow-ups

  • Search Console API data is subject to Google's normal reporting delays and sampling behavior
  • Testing has only been performed against a relatively small dataset; additional validation against larger Search Console properties would be beneficial

@Daniel-Hodgson-SquaredUp Daniel-Hodgson-SquaredUp requested a review from a team June 15, 2026 12:53
@github-actions

Copy link
Copy Markdown

🧩 Plugin PR Summary

📦 Modified Plugins

  • plugins/GoogleSearchConsole/v1

📋 Results

Step Status
Validation ✅ Passed
Deployment 🚀 Deployed

🔍 Validation Details

google-search-console
{
  "valid": true,
  "pluginName": "google-search-console",
  "pluginType": "hybrid",
  "summary": {
    "Data Streams": 14,
    "Import Definitions": 1,
    "UI Configuration": true,
    "Has Icon": true,
    "Has Default Content": true,
    "Config Validation": false,
    "Custom Types": false
  }
}

@clarkd

clarkd commented Jun 17, 2026

Copy link
Copy Markdown
Member

@claude review

@clarkd clarkd added the new-plugin Used to PR newly added plugins label Jun 17, 2026
Country: row.keys?.[0],
Clicks: row.clicks,
Impressions: row.impressions,
CTR: Number((row.ctr * 100).toFixed(2)),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you clarify the intent here? You're rounding/stringifying and then converting back to a number which might lose some precision.

Date: new Date(row.keys?.[0]),
Clicks: row.clicks,
Impressions: row.impressions,
CTR: Number((row.ctr * 100).toFixed(2)),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above

Page: row.keys?.[0],
Clicks: row.clicks,
Impressions: row.impressions,
CTR: Number((row.ctr * 100).toFixed(2)),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above

{
"name": "pageUrLs",
"displayName": "Page URLs",
"description": "Returns a list off URLs with impressions in the last year",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't look quite right - the timeframe is 'now -> whatever end date selected in SquaredUp'

"dimensions": [
"page"
],
"rowLimit": 25

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do this or other streams need paging configured?

"getArgs": [],
"headers": [],
"postBody": {
"startDate": "{{new Date(new Date(timeframe.start).getTime() - (new Date(timeframe.end).getTime() - new Date(timeframe.start).getTime()) - 86400000).toISOString().split('T')[0]}}",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't quite get my head around what happens if selected yearly ranges or something here - do we need to restrict the available timeframes?

@@ -0,0 +1,59 @@
{
"name": "previousPeriodQueriesByPage",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given we have data/time selection in SquaredUp - do we need these 'previous period' streams, or can the user effectively create them by setting the date appropriately on two tiles?

"rowLimit": 25000,
"dataState": "final"
},
"postRequestScript": "postRequest/script2.js",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worth renaming this script name (and script1) to be more identifiable

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-plugin Used to PR newly added plugins

Development

Successfully merging this pull request may close these issues.

2 participants