Skip to content

Add Google Search Console plugin#63

Open
Daniel-Hodgson-SquaredUp wants to merge 9 commits into
mainfrom
add-gsc-plugin
Open

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

Conversation

@Daniel-Hodgson-SquaredUp

@Daniel-Hodgson-SquaredUp Daniel-Hodgson-SquaredUp commented Jun 15, 2026

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

Summary by CodeRabbit

  • New Features
    • Added a full Google Search Console plugin with ready-made dashboards for site and page overviews.
    • Introduced new views for queries, pages, country and device breakdowns, performance over time, ranking distribution, and previous-period comparisons.
    • Added page URL and page-scope selection options to help focus reports on specific pages.
    • Included setup documentation and required connection fields for easier configuration.

@Daniel-Hodgson-SquaredUp Daniel-Hodgson-SquaredUp requested a review from a team June 15, 2026 12:53
@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
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pages.js Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPagePerformance.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodQueriesByPage.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/queries.json Outdated
@clarkd

clarkd commented Jun 17, 2026

Copy link
Copy Markdown
Member

@claude review

Comment thread plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/metadata.json
Dan H added 2 commits June 19, 2026 14:40
…he "Biggest Ranking Changes" tile of the "Page Overview" dashboard
…he "Organic Search Performance " tile of the "Site Overview" dashboard
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrls.json
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/countryBreakdown.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json Outdated
@clarkd

clarkd commented Jun 22, 2026

Copy link
Copy Markdown
Member

@Daniel-Hodgson-SquaredUp let me know when this is ready for re-review!

Fixed inverted datasets
Fixed typos
Updated CTR shape to be handled by SquaredUp metadata
Renamed Organic search performance tiles to "Period performance change"
Added tags to data streams
Updated author to use GitHub handle
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • plugins/GoogleSearchConsole/v1/icon.svg is excluded by !**/*.svg

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 68a1d74d-07b3-4c45-89b5-e2a2fb5b75e6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR introduces a complete Google Search Console plugin v1. It adds plugin identity files (metadata, OAuth2 config, UI schema), a page-URL index definition, 14 data stream definitions (site and page-scoped) with corresponding post-request JavaScript transforms, hidden previous-period comparison streams, two default dashboards (Site Overview and Page Overview) with embedded SQL tiles, a scope definition, and a README.

Changes

Google Search Console Plugin v1

Layer / File(s) Summary
Plugin identity, OAuth2, UI config, and page index
plugins/GoogleSearchConsole/v1/metadata.json, plugins/GoogleSearchConsole/v1/ui.json, plugins/GoogleSearchConsole/v1/defaultContent/scopes.json, plugins/GoogleSearchConsole/v1/dataStreams/pageUrls.json, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pageUrls.js, plugins/GoogleSearchConsole/v1/indexDefinitions/default.json
Defines the plugin manifest with OAuth2 authCode flow targeting the Search Analytics query endpoint, the four-field UI input schema, the page scope entry with single-object variable, the pageUrls POST stream and its {label, value} row transform, and the default index definition that imports pages from pageUrls.
Site-level data streams
plugins/GoogleSearchConsole/v1/dataStreams/sitePerformanceSummary.json, plugins/GoogleSearchConsole/v1/dataStreams/sitePerformanceOverTime.json, plugins/GoogleSearchConsole/v1/dataStreams/countryBreakdown.json, plugins/GoogleSearchConsole/v1/dataStreams/deviceBreakdown.json, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/sitePerformanceSummary.js, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/sitePerformanceOverTime.js, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/countryBreakdown.js, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/deviceBreakdown.js
Adds four site-scoped POST streams (summary, over time, country breakdown, device breakdown) with timeframe-derived date parameters, CTR percent metadata, and corresponding scripts that normalize data.rows into typed result arrays.
Page-scoped data streams
plugins/GoogleSearchConsole/v1/dataStreams/pages.json, plugins/GoogleSearchConsole/v1/dataStreams/queries.json, plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceSummary.json, plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceOverTime.json, plugins/GoogleSearchConsole/v1/dataStreams/pageDistribution.json, plugins/GoogleSearchConsole/v1/dataStreams/queriesByPage.json, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/*.js
Defines six page-scoped POST streams: pages, queries, pagePerformanceSummary, pagePerformanceOverTime, pageDistribution, and queriesByPage. Streams filtered by scope use a required single-object UI selector constrained to sourceType == "page". Scripts transform rows into typed metric objects; pageDistribution.js buckets positions into threshold ranges.
Hidden previous-period comparison streams
plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPagePerformance.json, plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPerformanceOverTime.json, plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodQueriesByPage.json, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/previousPeriodPerformanceOverTime.js, plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/previousPeriodQueriesByPage.js
Adds three hidden streams that compute startDate/endDate for the prior period from timeframe, apply the same scope-based page filtering, and map rows to typed results. previousPeriodPagePerformance reuses postRequest/pagePerformanceSummary.js.
Default dashboards, manifest, and README
plugins/GoogleSearchConsole/v1/defaultContent/manifest.json, plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json, plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json, plugins/GoogleSearchConsole/v1/docs/README.md
Registers siteOverview and pageOverview in the manifest. Site Overview wires seven tiles (Top Queries, Site Summary, Period Performance Change with COALESCE/CASE SQL, Site Performance Over Time line chart, Top Pages, Country Breakdown, Device Breakdown bar chart). Page Overview wires eight tiles (Page Summary, Period Performance Change SQL, Biggest Ranking Changes SQL join, Ranking Distribution bar chart, Query Opportunities SQL filter, Top Queries, Page Performance Over Time, Ranking Over Time). README documents OAuth2 setup, plugin fields, and troubleshooting.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding a Google Search Console plugin.
Description check ✅ Passed The description covers what changed, why it is useful, testing, screenshots, and known limitations, so it is sufficiently complete.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands.

@Daniel-Hodgson-SquaredUp

Copy link
Copy Markdown
Author

Hey @clarkd ! Heads up I've committed changes from all the feedback, good to go for another review :)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 19

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceOverTime.json`:
- Around line 39-54: The metadata for the time-series stream is missing an
explicit shape for the Date column, so it is being matched by the catch-all
pattern instead of rendering as a time axis. Update the metadata in
pagePerformanceOverTime.json to add a timestamp shape entry for the Date field
alongside the existing CTR shape, and keep the fallback pattern after the
explicit column definitions so Date is recognized correctly by the stream
metadata.

In `@plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceSummary.json`:
- Around line 6-35: The pagePerformanceSummary stream is single-object scoped
because it always queries one page via the page dimension and equals filter on
scope[0].name. Update this stream’s config to declare single-object semantics by
either switching it to the httpRequestScopedSingle dataSource or adding
objectLimit: 1, and keep the change localized to the pagePerformanceSummary
stream definition.

In `@plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json`:
- Line 2: The stream name has inconsistent camel casing in pageUrLs, with an
unintended capital L. Rename the stream to pageUrls in the JSON definition and
update every matching reference in the related index definition and script path
so the identifiers stay consistent across the GoogleSearchConsole v1 data stream
setup.

In
`@plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPerformanceOverTime.json`:
- Line 4: The description for previousPeriodPerformanceOverTime is misleading
because it mentions a selected page even though this stream is site-wide and has
no page-scoping fields like dimensionFilterGroups or a scope UI field. Update
the description text in the JSON so it describes daily performance for the
previous period of the given timeframe without referencing a page. Keep the
wording aligned with the stream’s actual behavior and metadata.

In `@plugins/GoogleSearchConsole/v1/dataStreams/queriesByPage.json`:
- Around line 19-29: The page filter in the queriesByPage stream is using
scope?.[0]?.rawId?.[0], which only passes the first character of the selected
page value. Update the dimensionFilterGroups expression to use scope?.[0]?.name
so the full page URL is sent, matching the other page-scoped stream definitions
and the surrounding query builder structure.

In
`@plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pageDistribution.js`:
- Around line 4-11: The bucket assignment in pageDistribution.js is counting
missing Google Search Console positions as top-ranked because row.position
defaults to 0, which then matches the "1-3" branch. Update the logic around the
position-to-Bucket mapping so missing or invalid positions are not treated as
valid rankings—either skip those rows entirely or default them to a value that
falls into "51+". Keep the fix localized to the position/Bucket handling in the
pageDistribution script.

In
`@plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pagePerformanceOverTime.js`:
- Line 4: The timestamp field in pagePerformanceOverTime.js is returning a Date
object instead of the required ISO 8601 string. Update the mapping in the
postRequest logic so the Date property derived from row.keys?.[0] is serialized
to an ISO 8601 string before returning it, keeping the change localized to the
data-stream transform that builds the row object.

In
`@plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/sitePerformanceOverTime.js`:
- Around line 3-11: The `rows.map` transformation in `sitePerformanceOverTime`
is converting the GSC `date` value into a `Date` object, but the data stream
should keep timestamps as ISO 8601 strings. Update the `Date` field to use the
raw `row.keys?.[0]` value directly instead of `new Date(...)`, so the output
remains an ISO string and avoids invalid date coercion when the key is missing.

In `@plugins/GoogleSearchConsole/v1/dataStreams/sitePerformanceSummary.json`:
- Around line 6-22: The sitePerformanceSummary stream is a single-object
response but its config does not limit output to one object. Update the stream
configuration for sitePerformanceSummary to either use the
httpRequestScopedSingle dataSource or add objectLimit: 1 alongside the existing
postRequestScript/postBody settings so the stream explicitly declares it only
emits one aggregate object.

In `@plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json`:
- Line 38: Update the dashboard tile titles in pageOverview.dash.json to use
title case consistently. The "title" fields for the affected tiles should be
changed from sentence case to title case, and the same normalization should be
applied to the other referenced tile entries in the dashboard JSON. Use the tile
title strings in the JSON object definitions as the target locations.
- Around line 133-145: The default tile definitions still include
environment-specific scope bindings with hardcoded node IDs, which should be
removed from the default content. Update the affected tile objects in
pageOverview.dash.json so the scope no longer depends on fixed graph
identifiers, and keep the default tiles portable outside the authoring
workspace. Apply the same cleanup to the repeated scope blocks referenced in the
other tile sections as well.

In `@plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json`:
- Line 153: The period-change query in the GoogleSearchConsole site overview SQL
is not fully null-safe when either period has no rows or zero totals, causing
the change metrics to return null. Update the SQL in the siteOverview dashboard
to match the page dashboard’s handling by adding COALESCE/CASE guards around the
change calculations in the current_period/previous_period comparison, using the
existing CTEs and the final SELECT aliases like "Clicks Change %", "Impressions
Change %", "CTR Change %", and "Position Change" so the tiles always return
stable numeric values.
- Line 42: Update the dashboard tile names in the GoogleSearchConsole
siteOverview.dash.json content to use title case consistently. The issue is that
several tile titles, including the one at Top Queries and the other referenced
title entries in the same dashboard, are currently not title-cased. Rename each
affected title string in the dashboard JSON so it matches the coding guideline
and the existing title-case pattern used by other tiles like Site Summary and
Period Performance Change.
- Around line 157-169: The default dashboard content includes a hardcoded scope
binding tied to a specific node ID, which should not ship in OOTB content.
Update the siteOverview.dash.json scope block to remove the static
bindings/queryDetail values or replace them with variable-driven scope
generation so the dashboard resolves correctly in any workspace. Use the
existing scope object in the dashboard JSON as the location to clean up this
environment-specific node reference.

In `@plugins/GoogleSearchConsole/v1/docs/README.md`:
- Around line 31-33: The README has markdownlint issues in several fenced code
blocks and at EOF. Update the affected fenced blocks in the GoogleSearchConsole
docs to include blank lines before and after each fence, add an explicit fence
language such as text, and make sure the document ends with exactly one trailing
newline. Use the fenced code sections in the README as the locations to fix
consistently across all mentioned occurrences.

In `@plugins/GoogleSearchConsole/v1/indexDefinitions/default.json`:
- Around line 13-15: The source type name is incorrectly prefixed with the
plugin abbreviation, so update the default definition in the GoogleSearchConsole
v1 index metadata to use the upstream concept name instead of gsc-page. Change
the value in the source type definition to the unprefixed type used by the
API/product, and keep related identifiers in the plugin’s default JSON
consistent with that rename so scopes, dashboards, and metadata don’t inherit
the plugin prefix.

In `@plugins/GoogleSearchConsole/v1/metadata.json`:
- Around line 1-42: The metadata for google-search-console is missing the
required links array. Update the metadata.json structure to include a links
field alongside the existing top-level properties, and add both a source link to
the GitHub repository and a documentation link to the README, following the same
metadata conventions used by other plugins.
- Line 9: Update the metadata description in the GoogleSearchConsole v1 manifest
so it is a single short full sentence with terminal punctuation; expand the
“GSC” abbreviation to the full product name and end the description with a
period.

In `@plugins/GoogleSearchConsole/v1/ui.json`:
- Line 6: The GoogleSearchConsole v1 ui.json fields are using an unsupported
description property for the URL, client ID, and client secret copy. Update the
field definitions in ui.json to use help instead of description so the guidance
appears correctly for those inputs, and keep the existing text attached to the
relevant field entries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: da6527ab-bc2e-4849-9096-98b588be3ef0

📥 Commits

Reviewing files that changed from the base of the PR and between efb12f9 and ef0bde4.

⛔ Files ignored due to path filters (1)
  • plugins/GoogleSearchConsole/v1/icon.svg is excluded by !**/*.svg
📒 Files selected for processing (34)
  • plugins/GoogleSearchConsole/v1/dataStreams/countryBreakdown.json
  • plugins/GoogleSearchConsole/v1/dataStreams/deviceBreakdown.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pageDistribution.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceOverTime.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceSummary.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pages.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPagePerformance.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPerformanceOverTime.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodQueriesByPage.json
  • plugins/GoogleSearchConsole/v1/dataStreams/queries.json
  • plugins/GoogleSearchConsole/v1/dataStreams/queriesByPage.json
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/countryBreakdown.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/deviceBreakdown.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pageDistribution.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pagePerformanceOverTime.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pagePerformanceSummary.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pageUrLs.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pages.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/previousPeriodPerformanceOverTime.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/previousPeriodQueriesByPage.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/queries.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/sitePerformanceOverTime.js
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/sitePerformanceSummary.js
  • plugins/GoogleSearchConsole/v1/dataStreams/sitePerformanceOverTime.json
  • plugins/GoogleSearchConsole/v1/dataStreams/sitePerformanceSummary.json
  • plugins/GoogleSearchConsole/v1/defaultContent/manifest.json
  • plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json
  • plugins/GoogleSearchConsole/v1/defaultContent/scopes.json
  • plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json
  • plugins/GoogleSearchConsole/v1/docs/README.md
  • plugins/GoogleSearchConsole/v1/indexDefinitions/default.json
  • plugins/GoogleSearchConsole/v1/metadata.json
  • plugins/GoogleSearchConsole/v1/ui.json

Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPerformanceOverTime.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/dataStreams/queriesByPage.json
Comment thread plugins/GoogleSearchConsole/v1/docs/README.md Outdated
Comment thread plugins/GoogleSearchConsole/v1/indexDefinitions/default.json
Comment thread plugins/GoogleSearchConsole/v1/metadata.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/metadata.json Outdated
Comment thread plugins/GoogleSearchConsole/v1/ui.json Outdated
Use help instead of description for UI fields
The metadata no longer uses the product abbreviation
This metadata now includes the links array
Removed plugin abbreviation from source type
Fixed markdown violations
Made period-change SQL null-safe for empty periods
Tiles now title-case
Default position of 0 no longer mis-bucketed
Use the full page URL in the filter for queriesByPage
Fixed description for previousPeriodPerformanceOverTime
Fixed casing for pageUrLs (now pageUrls)

Ignored suggestions that seemed incorrect or nitpicky

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

♻️ Duplicate comments (2)
plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json (1)

133-145: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove environment-specific scope bindings from default tiles.

These tile-level scope blocks still carry hardcoded node IDs (node-1dwkxV4HX7tME4WtZkj2r04TirpbysXMf3ej9-...), which are export artifacts and can fail outside the authoring workspace. The tiles already define proper variable-driven scope inside dataSourceConfig, so the static scope/queryDetail block should be removed.

Also applies to: 245-257, 341-353, 437-449

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json` around
lines 133 - 145, Remove the environment-specific tile-level scope artifacts from
the dashboard defaults: in pageOverview.dash.json, the affected tile objects
still include hardcoded scope/queryDetail blocks with node IDs, which should be
deleted. Keep the variable-driven scope in dataSourceConfig as the source of
truth, and apply the same cleanup to the other matching tile sections referenced
by the review so the default content is workspace-agnostic.
plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json (1)

157-169: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove hardcoded scope node bindings from default dashboard content.

This scope block is still bound to a specific environment node ID (node-1dwkxV4HX7tME4WtZkj2r04TirpbysXMf3ej9-...) and will break data resolution after install in other workspaces. Use variable-driven scope or remove this static scope from OOTB content.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json` around
lines 157 - 169, The static scope binding in the default dashboard content is
hardcoded to a specific environment node ID and will not resolve correctly in
other workspaces. Update the scope block in siteOverview.dash.json so it does
not reference the fixed node-1dwkxV4HX7tME4WtZkj2r04TirpbysXMf3ej9-* value;
instead use variable-driven scope generation or remove the scope entirely from
OOTB content. Make the change in the dashboard content where the scope.query,
bindings, and queryDetail are defined so the default install stays portable.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json`:
- Around line 133-145: Remove the environment-specific tile-level scope
artifacts from the dashboard defaults: in pageOverview.dash.json, the affected
tile objects still include hardcoded scope/queryDetail blocks with node IDs,
which should be deleted. Keep the variable-driven scope in dataSourceConfig as
the source of truth, and apply the same cleanup to the other matching tile
sections referenced by the review so the default content is workspace-agnostic.

In `@plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json`:
- Around line 157-169: The static scope binding in the default dashboard content
is hardcoded to a specific environment node ID and will not resolve correctly in
other workspaces. Update the scope block in siteOverview.dash.json so it does
not reference the fixed node-1dwkxV4HX7tME4WtZkj2r04TirpbysXMf3ej9-* value;
instead use variable-driven scope generation or remove the scope entirely from
OOTB content. Make the change in the dashboard content where the scope.query,
bindings, and queryDetail are defined so the default install stays portable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: f603af48-0712-44a9-9daf-4df4f80ede64

📥 Commits

Reviewing files that changed from the base of the PR and between ef0bde4 and ffdf9a4.

📒 Files selected for processing (15)
  • plugins/GoogleSearchConsole/v1/dataStreams/pageDistribution.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceOverTime.json
  • plugins/GoogleSearchConsole/v1/dataStreams/pagePerformanceSummary.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPagePerformance.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodPerformanceOverTime.json
  • plugins/GoogleSearchConsole/v1/dataStreams/previousPeriodQueriesByPage.json
  • plugins/GoogleSearchConsole/v1/dataStreams/queriesByPage.json
  • plugins/GoogleSearchConsole/v1/dataStreams/scripts/postRequest/pageDistribution.js
  • plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json
  • plugins/GoogleSearchConsole/v1/defaultContent/scopes.json
  • plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json
  • plugins/GoogleSearchConsole/v1/docs/README.md
  • plugins/GoogleSearchConsole/v1/indexDefinitions/default.json
  • plugins/GoogleSearchConsole/v1/metadata.json
  • plugins/GoogleSearchConsole/v1/ui.json

missed from last commit
@Daniel-Hodgson-SquaredUp

Copy link
Copy Markdown
Author

Hey @clarkd , just had a look at the change request - no idea what went on there / how it happened! I'll delete the outer scope blocks from the four affected SQL tiles in pageOverview.dash.json and the one affected SQL tile in siteOverview.dash.json as Claude suggests

@clarkd

clarkd commented Jun 24, 2026

Copy link
Copy Markdown
Member

Hey @clarkd , just had a look at the change request - no idea what went on there / how it happened! I'll delete the outer scope blocks from the four affected SQL tiles in pageOverview.dash.json and the one affected SQL tile in siteOverview.dash.json as Claude suggests

Yeah give it a go - it might be a quirk with the object picker field not getting properly translated. There was a recent bug that's kind of related so re-exporting might fix it. Presumably those object pickers are just set to use the dashboard variable?

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
plugins/GoogleSearchConsole/v1/indexDefinitions/default.json (1)

6-14: 🗄️ Data Integrity & Integration | 🟠 Major

Fix the postRequestScript casing mismatch

plugins/GoogleSearchConsole/v1/indexDefinitions/default.json is fine (dataStream.name: "pageUrls" and type.value: "page"). The remaining issue is plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json: it points to postRequest/pageUrls.js, but the file on disk is postRequest/pageUrLs.js. Rename one side so the script resolves on case-sensitive filesystems.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/GoogleSearchConsole/v1/indexDefinitions/default.json` around lines 6
- 14, The remaining issue is a casing mismatch in the GoogleSearchConsole page
URLs stream setup: the data stream definition points to a post-request script
name that does not match the actual filename on case-sensitive filesystems.
Update the reference in the page URLs stream definition or rename the script
file so the `postRequestScript` path and the existing `postRequest/pageUrLs.js`
identifier use the same casing consistently.

Source: Coding guidelines

♻️ Duplicate comments (1)
plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json (1)

16-21: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

rowLimit: 5000 may silently truncate discovered pages.

This stream backs object discovery over a one-year window with paging.mode: "none", and the GSC API caps a single call at 25,000 rows (default 1,000). Properties with more than 5,000 pages will have indexing silently truncated, so some page objects won't be created/scopable. This relates to the earlier rowLimit follow-up you flagged. Consider raising the limit and/or enabling paging for full coverage.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json` around lines 16 -
21, The Google Search Console page discovery stream is capped too low, which can
truncate discovered pages and miss object creation; update the pageUrLs.json
stream configuration to avoid a hard rowLimit of 5000 and instead use a higher
safe limit and/or enable paging in the discovery flow so all pages returned by
the GSC query can be collected. Adjust the discovery settings in the pageUrLs
stream alongside its paging.mode configuration so the page dimension results are
fully enumerated rather than silently cut off.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json`:
- Line 2: The pageUrls script reference and the actual filename casing do not
match, which can break the stream on case-sensitive filesystems. Update the
script path used by the GoogleSearchConsole data stream to exactly match the
on-disk file name, or rename the file so the `postRequestScript` reference and
the `pageUrls`/`pageUrLs` script name are consistent.

---

Outside diff comments:
In `@plugins/GoogleSearchConsole/v1/indexDefinitions/default.json`:
- Around line 6-14: The remaining issue is a casing mismatch in the
GoogleSearchConsole page URLs stream setup: the data stream definition points to
a post-request script name that does not match the actual filename on
case-sensitive filesystems. Update the reference in the page URLs stream
definition or rename the script file so the `postRequestScript` path and the
existing `postRequest/pageUrLs.js` identifier use the same casing consistently.

---

Duplicate comments:
In `@plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json`:
- Around line 16-21: The Google Search Console page discovery stream is capped
too low, which can truncate discovered pages and miss object creation; update
the pageUrLs.json stream configuration to avoid a hard rowLimit of 5000 and
instead use a higher safe limit and/or enable paging in the discovery flow so
all pages returned by the GSC query can be collected. Adjust the discovery
settings in the pageUrLs stream alongside its paging.mode configuration so the
page dimension results are fully enumerated rather than silently cut off.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 40073bec-18f9-4f2e-b1c4-7fc38898fa92

📥 Commits

Reviewing files that changed from the base of the PR and between ffdf9a4 and 93bcd6f.

📒 Files selected for processing (4)
  • plugins/GoogleSearchConsole/v1/dataStreams/pageUrLs.json
  • plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json
  • plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json
  • plugins/GoogleSearchConsole/v1/indexDefinitions/default.json
💤 Files with no reviewable changes (2)
  • plugins/GoogleSearchConsole/v1/defaultContent/siteOverview.dash.json
  • plugins/GoogleSearchConsole/v1/defaultContent/pageOverview.dash.json

Comment thread plugins/GoogleSearchConsole/v1/dataStreams/pageUrls.json
@Daniel-Hodgson-SquaredUp

Copy link
Copy Markdown
Author

Hey @clarkd , just had a look at the change request - no idea what went on there / how it happened! I'll delete the outer scope blocks from the four affected SQL tiles in pageOverview.dash.json and the one affected SQL tile in siteOverview.dash.json as Claude suggests

Yeah give it a go - it might be a quirk with the object picker field not getting properly translated. There was a recent bug that's kind of related so re-exporting might fix it. Presumably those object pickers are just set to use the dashboard variable?

Yeah I just configured the data streams as normal and set the dashboard variable after saving, I'll have to take a look and see if I can recreate it

@clarkd clarkd left a comment

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.

Looks great - working well for me. Thanks for the back & forth resolving those comments.

Only minor thing is the logo is not the current GSC logo, a small tweak if you wanted to update it but it's not a blocker.

@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
  }
}

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.

3 participants