Google Shopping and Google Search data in n8n
Use n8n's built-in HTTP Request node to call CrawlerData, then send the results anywhere n8n can reach. Below: the node settings, and a workflow you can import that saves daily Google Shopping prices to Google Sheets.
Code on this page tested 2026-10-13
What you can do
- Record the lowest Google Shopping prices for your products every morning in a Google Sheet.
- Track where your site ranks in Google for a list of keywords and post changes to Slack.
- Collect Google News results for your brand on a schedule and email a digest.
- Enrich rows in a spreadsheet or CRM with Google Local business details.
Prerequisites
- An n8n instance (n8n Cloud or self-hosted). We tested with n8n 2.42.7.
- A CrawlerData API key.
- For the Google Sheets step: a Google Sheets credential in n8n and a spreadsheet with a sheet named Prices.
No key yet? Sign up for 50 free credits, then create a key under API Access.
Step by step
Create a Header Auth credential
n8n's built-in HTTP Request node covers the whole API, so there is nothing extra to install. In n8n, create a credential of type Header Auth. Name: Authorization. Value: Bearer YOUR_API_KEY. Call the credential "CrawlerData API key" so the imported workflow finds it.
Configure the HTTP Request node
Method: POST. URL: https://api.crawlerdata.com/v1/jobs. Authentication: Generic Credential Type, then Header Auth, then your CrawlerData credential.
Send Body: on. Body Content Type: JSON. Specify Body: Using JSON. Set the JSON field to Expression and paste the body below. It builds one request per incoming item from its query and country fields.
Options: set Timeout to 200000 (ms), up from the node's 10-second default, so live requests have room to finish. Add Batching with 1 item per batch and a 1000 ms interval to stay well inside the rate limit.
JSON body (expression) {{ JSON.stringify({ endpoint: 'google-shopping-search', params: { query: $json.query, country: $json.country }, queue: 'live' }) }}Check the request outside n8n
If the node fails, run the same request with curl. If curl works, the problem is in the node settings; if it does not, the error message says what is wrong with the key or the body.
Terminal curl -X POST https://api.crawlerdata.com/v1/jobs \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"endpoint":"google-shopping-search","params":{"query":"sony wh-1000xm5","country":"us"},"queue":"live"}'Import the price-tracking workflow
The workflow runs every day at 07:00: a Code node lists the product searches to check, the HTTP Request node runs a live Google Shopping search for each, a second Code node turns the top 5 offers into rows (date, query, position, title, merchant, price, currency, product_id), and Google Sheets appends them.
In n8n, open a new workflow, choose Import from File (or paste the JSON onto the canvas), then select your CrawlerData and Google Sheets credentials, paste your spreadsheet URL into the Google Sheets node, and activate it. The Test run trigger lets you try it before the schedule fires.
To see every seller for a product instead of the top search results, change the body to the google-shopping-product endpoint with a product_id, and read result.sellers.
More ready-made workflows in our examples repository: a daily rank tracker that writes your position per keyword, country and device to Google Sheets, including whether Google's AI Overview cites you, and an AI Overview monitor that posts a morning report to Slack. Get them at github.com/CrawlerData/crawlerdata-examples (n8n folder).
n8n-google-shopping-prices.json { "name": "CrawlerData: daily Google Shopping prices to Google Sheets", "nodes": [ { "parameters": { "rule": { "interval": [ { "field": "days", "triggerAtHour": 7 } ] } }, "id": "b1f0d2a4-0001-4c1e-9a10-000000000001", "name": "Every day at 07:00", "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.2, "position": [ 0, 0 ] }, { "parameters": {}, "id": "b1f0d2a4-0006-4c1e-9a10-000000000006", "name": "Test run", "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ 0, 200 ] }, { "parameters": { "jsCode": "// One item per product search to check. Edit this list.\nreturn [\n { json: { query: 'sony wh-1000xm5', country: 'us' } },\n { json: { query: 'apple airpods pro 2', country: 'us' } },\n];" }, "id": "b1f0d2a4-0002-4c1e-9a10-000000000002", "name": "Products to check", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 220, 0 ] }, { "parameters": { "method": "POST", "url": "https://api.crawlerdata.com/v1/jobs", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ JSON.stringify({ endpoint: 'google-shopping-search', params: { query: $json.query, country: $json.country }, queue: 'live' }) }}", "options": { "batching": { "batch": { "batchSize": 1, "batchInterval": 1000 } }, "timeout": 200000 } }, "id": "b1f0d2a4-0003-4c1e-9a10-000000000003", "name": "CrawlerData: Google Shopping search", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 440, 0 ], "credentials": { "httpHeaderAuth": { "id": "", "name": "CrawlerData API key" } } }, { "parameters": { "jsCode": "// Top 5 offers per search, one row each.\nconst day = new Date().toISOString().slice(0, 10);\nconst rows = [];\nfor (const item of $input.all()) {\n const { job, result } = item.json;\n if (job.status !== 'completed') continue; // failed jobs cost 0 credits\n for (const p of result.shopping_results.slice(0, 5)) {\n rows.push({ json: {\n date: day,\n query: result.search_parameters.query,\n position: p.position,\n title: p.title,\n merchant: p.merchant,\n price: p.price ? p.price.value : null,\n currency: p.price ? p.price.currency : null,\n product_id: p.product_id,\n } });\n }\n}\nreturn rows;" }, "id": "b1f0d2a4-0004-4c1e-9a10-000000000004", "name": "Flatten to rows", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 660, 0 ] }, { "parameters": { "resource": "sheet", "operation": "append", "documentId": { "__rl": true, "mode": "url", "value": "" }, "sheetName": { "__rl": true, "mode": "name", "value": "Prices" }, "columns": { "mappingMode": "autoMapInputData", "value": {} }, "options": {} }, "id": "b1f0d2a4-0005-4c1e-9a10-000000000005", "name": "Append to Google Sheets", "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.5, "position": [ 880, 0 ] } ], "connections": { "Every day at 07:00": { "main": [ [ { "node": "Products to check", "type": "main", "index": 0 } ] ] }, "Products to check": { "main": [ [ { "node": "CrawlerData: Google Shopping search", "type": "main", "index": 0 } ] ] }, "CrawlerData: Google Shopping search": { "main": [ [ { "node": "Flatten to rows", "type": "main", "index": 0 } ] ] }, "Flatten to rows": { "main": [ [ { "node": "Append to Google Sheets", "type": "main", "index": 0 } ] ] }, "Test run": { "main": [ [ { "node": "Products to check", "type": "main", "index": 0 } ] ] } }, "settings": { "executionOrder": "v1" } }
How we tested it
- Imported the workflow and a Header Auth credential into n8n 2.42.7 with the n8n CLI and executed it. Both live Google Shopping searches completed (1 credit each) and the Code node produced 10 rows, for example "sony wh-1000xm5", position 1, Best Buy, 228 USD.
- The Google Sheets node's settings (append, map columns automatically) follow the n8n Google Sheets node v4.5.
- Ran the curl command and got a completed job with shopping_results.
What it costs
Each item that reaches the HTTP Request node is one API request. The sample workflow checks 2 searches a day: 2 credits a day, about 60 a month.
Switching to the sellers endpoint costs 1 credit per 10 sellers returned per product, so a product with 25 sellers costs 3 credits per check.
n8n retries (Retry On Fail) send a new request each time, but failed jobs are free, so retries only cost credits when they succeed.
If something goes wrong
- 401 INVALID_API_KEY
- The key is missing, mistyped or revoked. Send it as "Authorization: Bearer YOUR_API_KEY" (with the word Bearer and one space) and check the key is active under API Access in the dashboard.
- The node times out after 10 seconds
- Set Options, Timeout to 200000. The HTTP Request node defaults to 10000 ms.
- 400 VALIDATION_ERROR
- The JSON body is wrong, usually an expression that produced a string instead of an object, or a missing query. The details array in the error names the field. Make sure the JSON field is set to Expression.
- 402 INSUFFICIENT_CREDITS
- Your balance is too low for the request. Buy a credit pack in the dashboard. Requests that fail for other reasons are not charged, so a 402 never costs credits.
- 429 RATE_LIMITED
- Each API key allows 100 requests per minute and 20 per second. Wait until the time in the X-RateLimit-Reset header (a Unix timestamp) and retry, or spread requests out.
- job.status is "failed"
- The HTTP request worked but the job did not; job.error says why. Failed jobs cost 0 credits, so you can retry them.
Request and response schemas: OpenAPI 3.1 document. Still stuck? Email contact@crawlerdata.com.
Questions
Do I need a community node for n8n?
No. The API is a single JSON endpoint with a Bearer token, so the built-in HTTP Request node covers it, and you can import the workflow on this page as a starting point.
Should I use the live or the fast queue in n8n?
Live is simplest: the result arrives in the HTTP Request node's output. For hundreds of items, submit on the fast queue with a postbackUrl that points at an n8n Webhook node, and handle results in a second workflow.
How do I handle failed jobs?
Check job.status in the output. The sample Code node skips anything that is not completed. Failed jobs cost 0 credits, so you can route them to a retry branch.
Can I run it every hour instead of every day?
Yes. Change the Schedule Trigger interval. Each run costs one credit per search, so 2 searches every hour is 48 credits a day.
APIs you can call
Google Shopping API
Search Google Shopping and get every product with price, merchant, rating and a product ID you can use to fetch all sellers.
from $0.30 / 1,000 requests
Google Shopping Sellers API
Every seller offering a product, sorted by total price, in one request with no pagination. 1 credit per 10 sellers returned.
1 credit per 10 sellers, from $0.30 / 1,000 credits
Google Search API
Organic results with real destination links, ads, AI Overview, People Also Ask, local pack, top stories, knowledge panel and related searches. Desktop or mobile.
from $0.30 / 1,000 requests
Solutions built on it
Competitor price monitoring
Every seller and total price for your products on Google Shopping, one request per product.
See how it works
SEO rank tracking
Organic positions and SERP features, desktop or mobile, per keyword and country.
See how it works
News and brand monitoring
Google News mentions of your brand, competitors and topics on a schedule.
See how it works
Other integrations
Python
A requests-based client with retries, async polling and a webhook receiver.
Set it up
LanguagesNode.js
A dependency-free fetch client with retries, async polling and a webhook receiver.
Set it up
AI assistantsMCP server
Eight Google tools for Claude Desktop, Claude Code, Cursor and other MCP clients.
Set it up
Try it with 50 free credits
Sign up with your work email and verify it, then create an API key. Failed requests are never charged.