Skip to main content
RapidDev - Software Development Agency
bubble-tutorial

How to build an SEO tracker in Bubble

You can build an SEO tracking dashboard in Bubble that monitors keyword rankings, organic traffic, and page performance by connecting to Google Search Console via the API Connector. This tutorial covers setting up the API integration, storing ranking data over time, building visual dashboards with charts, and alerting on significant ranking changes.

What you'll learn

  • How to connect Bubble to Google Search Console API via OAuth
  • How to store and track keyword ranking data over time
  • How to build SEO performance dashboards with charts
  • How to set up alerts for significant ranking changes
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner7 min read25-35 minAll Bubble plans (Google Search Console access required)March 2026RapidDev Engineering Team
TL;DR

You can build an SEO tracking dashboard in Bubble that monitors keyword rankings, organic traffic, and page performance by connecting to Google Search Console via the API Connector. This tutorial covers setting up the API integration, storing ranking data over time, building visual dashboards with charts, and alerting on significant ranking changes.

Overview: Building an SEO Tracker in Bubble

This tutorial guides you through building an SEO monitoring dashboard in Bubble. You will connect to the Google Search Console API to fetch keyword rankings, clicks, and impressions data. The data is stored in your Bubble database for historical tracking, displayed in visual charts, and monitored for significant changes. This is ideal for founders who want to track their SEO performance without paying for expensive third-party tools.

Prerequisites

  • A Bubble account with the API Connector plugin installed
  • A Google Cloud Console account with Search Console API enabled
  • A website verified in Google Search Console
  • Basic understanding of API Connector OAuth setup in Bubble

Step-by-step guide

1

Set up Google Search Console API access

Go to console.cloud.google.com. Create a new project or select an existing one. Navigate to APIs & Services → Library, search for Google Search Console API, and click Enable. Then go to APIs & Services → Credentials → Create Credentials → OAuth 2.0 Client ID. Select Web application. Add your Bubble OAuth redirect URI: https://yourapp.bubbleapps.io/api/1.1/oauth_redirect. Copy the Client ID and Client Secret.

Pro tip: You can also use a Service Account for server-to-server access without user OAuth, but OAuth is simpler for a single-user tool.

Expected result: Google Search Console API is enabled and OAuth credentials are ready.

2

Configure the API Connector with OAuth

In the Plugins tab, open the API Connector. Add a new API called Google Search Console. Set Authentication to OAuth2 User-Agent Flow. Enter the Client ID, Client Secret, Scope (https://www.googleapis.com/auth/webmasters.readonly), Authorization URL (https://accounts.google.com/o/oauth2/auth), and Token URL (https://oauth2.googleapis.com/token). Add an API call named Get Search Analytics. Method: POST. URL: https://www.googleapis.com/webmasters/v3/sites/[site_url]/searchAnalytics/query. Set the body to request search data with dimensions for query, page, and date.

API Connector payload
1POST https://www.googleapis.com/webmasters/v3/sites/[site_url]/searchAnalytics/query
2
3Body:
4{
5 "startDate": "[start_date]",
6 "endDate": "[end_date]",
7 "dimensions": ["query", "date"],
8 "rowLimit": 100
9}
10
11Response:
12{
13 "rows": [
14 {
15 "keys": ["keyword", "2026-03-27"],
16 "clicks": 45,
17 "impressions": 1200,
18 "ctr": 0.0375,
19 "position": 3.2
20 }
21 ]
22}

Expected result: The API Connector is configured with OAuth and can fetch search analytics data from Google Search Console.

3

Create the data model for tracking

Go to the Data tab and create these Data Types. TrackedSite: url (text), name (text), owner (User). KeywordData: site (TrackedSite), keyword (text), date (date), clicks (number), impressions (number), ctr (number), position (number). RankingAlert: site (TrackedSite), keyword (text), old_position (number), new_position (number), change (number), alert_date (date), is_read (yes/no). These types let you store daily snapshots and detect changes over time.

Expected result: Data types are created to store sites, keyword performance data, and ranking change alerts.

4

Build the SEO dashboard with charts

Create a page called seo-dashboard. Add a site selector Dropdown at the top. Below it, create a summary row showing total clicks, total impressions, average position, and average CTR for the selected date range (use Do a search for KeywordData with :each item's clicks :sum etc.). Add a line chart (using the Bubble Chart plugin or Chart.js plugin) showing clicks and impressions over time. Add a Repeating Group below showing the top keywords sorted by clicks descending, with columns for keyword, clicks, impressions, CTR, and average position.

Expected result: A dashboard displays SEO metrics with trend charts and a sortable keyword table.

5

Schedule daily data fetching

Create a backend workflow called fetch-daily-seo-data. This workflow calls the Google Search Console API for each TrackedSite, requesting data for yesterday's date. For each row in the response, create a KeywordData record. Before creating, check if a record for that keyword and date already exists to prevent duplicates. Schedule this workflow to run daily at a fixed time (e.g., 6 AM). Enable backend workflows in Settings → API tab. Set up the initial schedule by triggering it once from a button on the admin page.

Pro tip: Google Search Console data has a 2-3 day delay. Fetch data for 3 days ago to ensure complete numbers. For advanced SEO monitoring needs, RapidDev can help build comprehensive tracking systems with competitor analysis.

Expected result: SEO data is fetched automatically every day and stored in your database for historical tracking.

6

Set up ranking change alerts

In the daily fetch workflow, after storing new data, compare each keyword's current position with its position from 7 days ago (Do a search for KeywordData where keyword = this keyword AND date = Current date - 7 days). If the position changed by more than 3 spots, create a RankingAlert record. On the dashboard, add a Notifications section showing recent alerts. Style position improvements in green and drops in red. Add email notifications for significant drops (position worsened by more than 5 spots) using the Send email action.

Expected result: Significant ranking changes trigger alerts visible on the dashboard and optionally via email.

Complete working example

Workflow summary
1SEO TRACKER WORKFLOW SUMMARY
2=============================
3
4DATA TYPES:
5 TrackedSite: url, name, owner (User)
6 KeywordData: site, keyword, date, clicks,
7 impressions, ctr, position
8 RankingAlert: site, keyword, old_position,
9 new_position, change, alert_date, is_read
10
11API CONNECTOR:
12 API: Google Search Console
13 Auth: OAuth2 User-Agent Flow
14 Scope: webmasters.readonly
15 Call: Get Search Analytics (POST, Action)
16 URL: .../searchAnalytics/query
17 Body: startDate, endDate, dimensions, rowLimit
18
19PAGES:
20 seo-dashboard: Charts, keyword table, alerts
21 manage-sites: Add/remove tracked sites
22
23BACKEND WORKFLOW: fetch-daily-seo-data
24 Runs: Daily at 6:00 AM
25 1. Search TrackedSites (all active)
26 2. For each site:
27 a. Call Get Search Analytics (3 days ago)
28 b. For each row in response:
29 - Check if KeywordData exists for keyword+date
30 - If new: Create KeywordData
31 - Compare position to 7 days ago
32 - If changed > 3 positions: Create RankingAlert
33 3. Schedule self for tomorrow at 6:00 AM
34
35DASHBOARD ELEMENTS:
36 - Summary row: total clicks, impressions, avg position
37 - Line chart: clicks/impressions over last 30 days
38 - Keyword table: sorted by clicks desc
39 - Alerts panel: recent ranking changes
40 - Date range picker for filtering

Common mistakes when building an SEO tracker in Bubble

Why it's a problem: Trying to fetch real-time ranking data

How to avoid: Fetch data for 3 days ago to ensure the numbers are finalized and accurate.

Why it's a problem: Not encoding the site URL parameter properly

How to avoid: URL-encode the site parameter. In Bubble, use the :encoded operator on the text value before passing it to the API call.

Why it's a problem: Storing CTR as a percentage instead of a decimal

How to avoid: Store the raw decimal and multiply by 100 when displaying. Format as percentage using :formatted as with the % suffix.

Best practices

  • Fetch data for 3 days ago to account for Google Search Console's processing delay
  • Store daily snapshots to enable trend analysis and historical comparison
  • URL-encode site URLs before passing them to the API endpoint
  • Set up alerts for significant ranking changes (more than 3-5 position shifts)
  • Display CTR as a percentage in the UI even though the API returns decimals
  • Use pagination when fetching data (rowLimit parameter) to handle sites with many keywords
  • Add date range filtering to the dashboard so users can analyze specific periods

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I want to build an SEO tracking dashboard in Bubble.io that connects to Google Search Console API. I need to fetch keyword rankings, clicks, and impressions daily, store historical data, display trends in charts, and alert me on significant ranking changes. Can you outline the API setup, data model, and workflows?

Bubble Prompt

Build an SEO tracker for my app. Connect to Google Search Console API to fetch keyword data. Create a dashboard with trend charts, a keyword ranking table, and alerts when positions change significantly. Schedule daily data fetching via backend workflows.

Frequently asked questions

Is Google Search Console API free to use?

Yes. The Google Search Console API is free with no usage charges. You only need a Google Cloud project with the API enabled and OAuth credentials configured.

How far back can I fetch historical data?

Google Search Console retains 16 months of data. You can backfill your tracker by fetching historical data in batches when you first set up the integration.

Can I track competitor keywords too?

Google Search Console only provides data for your own verified sites. For competitor tracking, you would need to integrate a third-party SEO API like SEMrush, Ahrefs, or SERPapi.

How many keywords can I track?

The API returns up to 25,000 rows per request. For most sites, the default rowLimit of 100-500 top keywords is sufficient. Increase the limit for large sites.

Will this use a lot of workload units?

A daily fetch for one site with 100 keywords creates about 100 database records per day. This is minimal in terms of workload units. Storing data for 365 days across 100 keywords is about 36,500 records — well within Bubble's capabilities.

Can RapidDev help build advanced SEO tools?

Yes. RapidDev can help build comprehensive SEO platforms with competitor tracking, automated reporting, content optimization suggestions, and integrations with multiple SEO data sources.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.