Skip to content

Add Bing Webmaster Tools as a second first-party data source - #411

Open
viztor wants to merge 1 commit into
every-app:mainfrom
viztor:feat/bing-webmaster-tools
Open

viztor wants to merge 1 commit into
every-app:mainfrom
viztor:feat/bing-webmaster-tools

Conversation

@viztor

@viztor viztor commented Oct 7, 2026 •

Copy link
Copy Markdown

Read Bing Webmaster Tools data inside a project

TL;DR

OpenSEO can only read Google data. A site owner who also ranks in Bing has no way to see Bing's search performance, crawl stats, or URL inspection in a project, and no way to point an agent at that data. Connecting a verified Bing site should make it readable next to the Google data.

What is happening?

A project can connect Search Console and GA4, but nothing reads Bing. People who care about Bing visibility open Bing's own reports by hand, and agents have no Bing data at all.

What should happen?

A project can connect to a verified Bing site with a per-user API key or a delegated OAuth grant. Once connected:

  • Search Performance gains a Google/Bing source toggle. The Bing view shows a site summary (clicks, impressions, average position), a daily traffic trend, and top queries and pages tables.
  • Crawl stats, crawl issues, and URL inspection are available.
  • Three read-only MCP tools expose the same data to agents: get_bing_search_performance, inspect_bing_urls, and get_bing_crawl_stats.

Bing's API has no device, country, or date-range filters, so the Bing view offers only the filters it supports and says so rather than showing dead controls.

Extra context

  • The site summary's clicks and impressions come from GetRankAndTrafficStats, Bing's only whole-site total; its query and page reports are each a top-N subset. That endpoint reports no position, so the summary's average position is impression-weighted over the top-N query rows and can differ from a true whole-site average. The MCP tool description states this.
  • Bing throttles Cloudflare Workers' shared egress IPs (HTTP 400, ErrorCode 17 "ThrottleIP"). When BING_EGRESS_NETWORK_ID names the account's Cloudflare Mesh network, the worker binds it and routes Bing traffic through that egress; otherwise it falls back to the default. Self-hosters don't need this.
  • Google and Bing link flows share one redirect guard so a single return page doesn't open two consent screens.
  • Setup notes for self-hosters: docs/SELF_HOSTING_BING_WEBMASTER.md. Design record: docs/maintainers/specs/0016-bing-webmaster-tools-integration.md.
  • Bumps the plugin to 1.0.22 (main is on 1.0.21).

@viztor
viztor force-pushed the feat/bing-webmaster-tools branch from 981a486 to 2f7ae3c Compare October 7, 2026 22:23
@viztor
viztor requested a review from bensenescu as a code owner October 7, 2026 22:23
@viztor
viztor force-pushed the feat/bing-webmaster-tools branch 4 times, most recently from 910a85b to 0257d62 Compare October 10, 2026 14:10
Connect a project to a verified Bing site with a per-user API key or a
delegated OAuth grant, then read it like Search Console:

- Bing client and service (JSON/HTTP API): query, page, and whole-site
  traffic, URL inspection, and crawl stats/issues. The site summary comes
  from GetRankAndTrafficStats — the only whole-site total, since the query
  and page reports are each a top-N subset.
- MCP tools: get_bing_search_performance, inspect_bing_urls, and
  get_bing_crawl_stats (read-only, unmetered).
- Search Performance gains a Google|Bing source toggle and a Bing view
  (Striking distance / Queries / Pages) with the site summary and table on
  independent skeletons, plus a daily traffic trend. Filters are limited to
  what Bing supports; Bing has no device, country, or date-range filter.
- Connection UI on the integrations page and an account settings surface,
  the dashboard card, and DB schema plus migrations for both dialects.

Bing throttles Cloudflare Workers' shared egress IPs (HTTP 400 ErrorCode
17, "ThrottleIP"), so when BING_EGRESS_NETWORK_ID names the account's
Cloudflare Mesh network the worker binds it and routes Bing through that
egress; otherwise it falls back to the default. Bumps the plugin to 1.0.22,
newer than main's.

Notes for review:

- The site summary's clicks and impressions come from Bing's traffic
  endpoint, but that endpoint reports no position, so the summary's average
  position is impression-weighted over the top-N query rows and can differ
  from a true whole-site average. Stated in the MCP tool description.
- The Bing link flow shares one redirect guard with Google's
  (linkRedirect.ts). Separate guards let a Google connect and a Bing connect
  each pass their own check and open two consent screens for one return page.
- The dashboard card labels its window in the card body, like GscCard and
  Ga4Card, so the two cards' metric tables line up in the two-column grid.
- Bing reuses the existing search-performance formatters rather than
  defining Bing-specific copies.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant