All postsBuilds

Google Search Console Reports on WhatsApp Every Monday. n8n Plus 199 Rupees a Month.

You open Search Console maybe once a month. Be honest. You log in, stare at the graph, nod, close the tab, and forget it until something feels wrong. That...

Garvit Sharma

Garvit Sharma

19 June 2026 ยท 9 MIN READ

Builds

Google Search Console Reports on WhatsApp Every Monday. n8n Plus 199 Rupees a Month.

webight.com
On this page

You open Search Console maybe once a month. Be honest. You log in, stare at the graph, nod, close the tab, and forget it until something feels wrong. That is most people, and it was me for a long stretch too.

The data is sitting right there. Clicks, impressions, the exact queries people typed to find you. The problem is the friction. Logging in is a tiny tax, and a tiny tax paid weekly is one nobody pays. So the numbers that should shape what you write next just rot inside a dashboard you never open.

Here is the one idea this whole post defends: the report nobody reads is worth zero, and the report that lands in the chat you already check 80 times a day is worth everything. Same data. The only thing that changes is whether it has to wait for you. So I made Search Console come to me. Every Monday at 9am, webight.com's numbers show up on my WhatsApp before I have opened my laptop. Built it on n8n, costs 199 rupees a month, and the whole thing is one workflow you can paste in today.

What lands on my phone

A short message. Clicks this week versus last week, impressions the same way, and the 5 queries pulling the most clicks. Half Hindi, half English, because that is how I actually talk and a stiff English report feels like a bank statement.

It reads roughly like this:

Subah ki report ๐Ÿ“Š webight.com (last 7 days)

Clicks: 142 (last week 118, +24)
Impressions: 4,310 (last week 3,980, +330)

Top queries:
1. webight - 31 clicks
2. web design agency noida - 18 clicks
3. n8n agency india - 12 clicks
4. nextjs developer delhi - 9 clicks
5. supabase cloudflare proxy - 6 clicks

Aaj kya likhna hai, dikh gaya.

That last line is the point. The report ends by telling me what to do, which is decide this week's content from what people are already searching. No tab. No login. It is just there.

The honest part: Search Console auth is the hard bit

Everyone shows you the pretty workflow and skips this. The API auth is 80% of the actual work, so let me walk it straight.

Search Console does not give you a simple API key. You need a Google Cloud service account, which is a robot Google account with its own email, and then you have to add that robot as a user on your Search Console property. Miss the second step and the API returns an empty response with no error, and you will burn 40 minutes thinking your code is broken when your permissions are. I did exactly that the first time.

The setup, in order:

  1. Go to the Google Cloud Console, make a project, and enable the Google Search Console API for it. Search "Search Console API" in the library, hit enable. One click.
  2. Create a service account under that project. APIs and Services, then Credentials, then Create Credentials, then Service account. Give it a name, skip the optional roles, done.
  3. Open the service account, go to Keys, Add Key, Create new key, choose JSON. A .json file downloads. That file is your password. Treat it like one.
  4. Open the JSON and copy the client_email. It looks like something@your-project.iam.gserviceaccount.com.
  5. This is the step people miss. Go to Search Console, open your property, Settings, Users and permissions, Add user. Paste that client_email. Give it Full or Restricted, either reads fine. Now the robot can see your data.

That is the whole auth setup. The robot exists, it has a key, and it has been let into your property. The API will answer now.

Plugging it into n8n

n8n has a Google Service Account credential type built in, which saves you from writing the JWT signing by hand. In n8n, go to Credentials, create a new one, search "Google Service Account API". Open your downloaded JSON, copy the client_email into the email field and the private_key into the key field. Copy the whole private key including the BEGIN and END lines and the \n characters exactly as they appear. One missing newline and the token signing fails silently.

There is a scope field. Set it to:

https://www.googleapis.com/auth/webmasters.readonly

Read-only, because this thing should never be able to change anything in your account. A report that can edit your settings is a report waiting to go wrong.

The full workflow

Four nodes. Schedule trigger fires Monday 9am, an HTTP node hits the Search Console API, a Code node does the math and writes the message, and an HTTP node sends it to WhatsApp. Here is the complete workflow JSON, copy-paste ready into n8n via Import from File or paste into a blank canvas:

{
  "name": "GSC Weekly WhatsApp Report",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            { "field": "weeks", "triggerAtDay": [1], "triggerAtHour": 9 }
          ]
        }
      },
      "name": "Monday 9am",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.1,
      "position": [240, 300]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://www.googleapis.com/webmasters/v3/sites/{{ encodeURIComponent('https://www.webight.com/') }}/searchAnalytics/query",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"startDate\": \"{{ $now.minus({ days: 14 }).toFormat('yyyy-MM-dd') }}\",\n  \"endDate\": \"{{ $now.minus({ days: 1 }).toFormat('yyyy-MM-dd') }}\",\n  \"dimensions\": [\"query\", \"date\"],\n  \"rowLimit\": 5000\n}",
        "options": {}
      },
      "name": "Query Search Console",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [480, 300]
    },
    {
      "parameters": {
        "jsCode": "const rows = $input.first().json.rows || [];\n\n// midpoint splits the 14-day window into this week and last week\nconst cutoff = DateTime.now().minus({ days: 7 }).toFormat('yyyy-MM-dd');\n\nlet thisClicks = 0, lastClicks = 0, thisImpr = 0, lastImpr = 0;\nconst queryClicks = {};\n\nfor (const r of rows) {\n  const query = r.keys[0];\n  const date = r.keys[1];\n  const recent = date >= cutoff;\n  if (recent) {\n    thisClicks += r.clicks;\n    thisImpr += r.impressions;\n    queryClicks[query] = (queryClicks[query] || 0) + r.clicks;\n  } else {\n    lastClicks += r.clicks;\n    lastImpr += r.impressions;\n  }\n}\n\nconst top = Object.entries(queryClicks)\n  .sort((a, b) => b[1] - a[1])\n  .slice(0, 5);\n\nconst clickDiff = thisClicks - lastClicks;\nconst imprDiff = thisImpr - lastImpr;\nconst sign = (n) => (n >= 0 ? '+' + n : '' + n);\n\nconst lines = top.map((t, i) => `${i + 1}. ${t[0]} - ${Math.round(t[1])} clicks`);\n\nconst message =\n  `Subah ki report ๐Ÿ“Š webight.com (last 7 days)\\n\\n` +\n  `Clicks: ${Math.round(thisClicks)} (last week ${Math.round(lastClicks)}, ${sign(Math.round(clickDiff))})\\n` +\n  `Impressions: ${Math.round(thisImpr)} (last week ${Math.round(lastImpr)}, ${sign(Math.round(imprDiff))})\\n\\n` +\n  `Top queries:\\n${lines.join('\\n')}\\n\\n` +\n  `Aaj kya likhna hai, dikh gaya.`;\n\nreturn [{ json: { message } }];"
      },
      "name": "Build Message",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [720, 300]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://graph.facebook.com/v21.0/YOUR_PHONE_NUMBER_ID/messages",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "Authorization", "value": "Bearer YOUR_WHATSAPP_TOKEN" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"YOUR_NUMBER\",\n  \"type\": \"text\",\n  \"text\": { \"body\": {{ JSON.stringify($json.message) }} }\n}",
        "options": {}
      },
      "name": "Send WhatsApp",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [960, 300]
    }
  ],
  "connections": {
    "Monday 9am": { "main": [[{ "node": "Query Search Console", "type": "main", "index": 0 }]] },
    "Query Search Console": { "main": [[{ "node": "Build Message", "type": "main", "index": 0 }]] },
    "Build Message": { "main": [[{ "node": "Send WhatsApp", "type": "main", "index": 0 }]] }
  }
}

A few things in there are doing real work, so let me point at them.

The API call pulls 14 days, not 7. I need last week to compare against this week, so one request grabs both and the Code node splits them at the 7-day cutoff. Cheaper than two calls and the math stays in one place.

The dimensions array asks for query and date together. The date is what lets me bucket each row into this-week or last-week. Drop it and you lose the week-over-week comparison, which is the only number that tells you if you are growing.

Search Console data lags 2 to 3 days. That is why endDate is yesterday, not today. Ask for today and you get a half-empty bucket that makes your week look worse than it was.

The WhatsApp delivery

Two honest paths here, pick by how much you care.

The official one is the WhatsApp Business Cloud API from Meta. It is free for service messages within a 24-hour window and gives you a phone number ID and a token from the Meta developer dashboard. That is what the JSON above uses. The catch: outside that 24-hour window you can only send pre-approved template messages, which is paperwork for a once-a-week report to yourself. For a report you trigger, you can work inside it, but it is fiddly.

The path I actually run for my own alerts is simpler. A small WhatsApp API service that sells you a number and a plain HTTP endpoint, around 199 rupees a month. You swap the Send node's URL and body for theirs, usually a single POST with the message text, and you are done. No template approval, no 24-hour rules, because for messages to your own number nobody is policing spam. If this report ever goes to a client instead of me, I move it to the official Meta API and do the template paperwork properly. For me, 199 a month buys back the friction and I stop thinking about it.

The cost breakdown

Here is everything this runs on, monthly.

Piece Cost per month
Search Console API 0 (free, generous quota)
Google Cloud service account 0
n8n (self-hosted on a VPS I already pay for) 0 extra
WhatsApp API service 199 rupees

So the marginal cost of this whole thing is 199 rupees. If you run n8n Cloud instead of self-hosting, add their plan, but I run it on the same small server that already hosts other automations, so it costs me nothing extra. The real expense was the hour of auth setup, paid once. After that it sends itself forever.

And n8n itself is free and open source if you self-host. I run a stack of these little workflows on one VPS, the same way I moved a whole production app behind a Cloudflare Worker last year for 0 rupees when Jio DNS-blocked Supabase in India. The pattern is the same: when a tool fights you, you do not pay your way out, you route around it for almost nothing.

Why this beats opening the dashboard

There is a behavioral thing under this, and it is not complicated. A habit needs a trigger, and dashboards have a terrible one: you have to remember. WhatsApp has the best trigger that exists, the buzz in your pocket. You are not adding discipline. You are attaching the thing you should do to the thing you already do 80 times a day, so the discipline becomes free.

I went from checking Search Console maybe once in three weeks to reading it every Monday without trying. Not because I got more serious about SEO. Because I removed the one step that was killing it. The data was never the problem. The login was.

So here is the challenge. Stop telling yourself you will check Search Console more often, because you said that last month and you did not. Build the thing that checks it for you and drops the answer where you cannot miss it. Spend the one hour on the service account, paste the workflow, and let Monday morning hand you next week's content idea before you have even sat down. The numbers that grow your traffic are already in there. The only question is whether they have to wait for you to log in.

If you get stuck on the service account permissions, that is the part that trips everyone, my DMs are open.

n8nAutomationGoogle Search ConsoleWhatsAppSEO
Next move

We build custom platforms, websites, and automation.

The two people who build it are the two you talk to, and every price is on the page.

Garvit Sharma

Garvit Sharma

Full-stack developer and co-founder of Webight, a two-person web and AI studio in India. He writes these from real client work. More about us.