This workflow corresponds to n8n.io template #8036 — we link there as the canonical source.
This workflow follows the HTTP Request → Slack recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "j4Cj4lJiSvXIpi0a",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Play Store App Rank Tracker",
"tags": [
{
"id": "h1n9pM94D2GUxQBw",
"name": "ASO",
"createdAt": "2025-06-11T00:48:24.857Z",
"updatedAt": "2025-06-11T00:48:24.857Z"
}
],
"nodes": [
{
"id": "00b0346e-297b-43fe-9188-bef36a79a78e",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
-20
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "fd981cd3-2cf8-4cb0-8dc8-21cd4bfd02a9",
"name": "Keep Context",
"type": "n8n-nodes-base.set",
"position": [
820,
-20
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6b225b26-5317-4e55-bd41-12d904ad0136",
"name": "id",
"type": "number",
"value": "={{ $json.id }}"
},
{
"id": "4c31a5bf-38e2-4ca2-a0ef-268198d34532",
"name": "Keywords",
"type": "string",
"value": "={{ $json.Keywords }}"
},
{
"id": "81a8b6cc-dae3-4c45-b07d-cb4a36719798",
"name": "currentRank",
"type": "string",
"value": "={{ $json.currentRank }}"
},
{
"id": "16205c3d-7996-4bc3-a4c7-ba92ea7dbedd",
"name": "Previous Rank",
"type": "string",
"value": "={{ $json[\"Previous Rank\"] }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8e1be6a7-9d76-4f43-bda6-574b122636cb",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"position": [
1020,
260
],
"parameters": {
"text": "\ud83d\ude80 RPSC App Rankings Just Updated!\nSee how we're performing \ud83d\udc49 https://baserow.io/public/grid/mjkYq2wWb6vIE3MsB1RannZgclvdHKacNE3zEVrC5Bo",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "url",
"value": "https://app.slack.com/client/T053HKKDY12/C08AGRQ9GBF"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "814a072d-c55a-4a6b-829e-89c097e64544",
"name": "Sticky Note33",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-120
],
"parameters": {
"color": 3,
"width": 260,
"height": 260,
"content": "## Check for Rank Updates"
},
"typeVersion": 1
},
{
"id": "b701b1c1-924d-4431-9973-acb8f4a0c67c",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
-120
],
"parameters": {
"width": 260,
"height": 260,
"content": "## Fetch Keywords from Baserow"
},
"typeVersion": 1
},
{
"id": "95b54bce-e074-4047-ab26-ddd237de4072",
"name": "Sticky Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
-120
],
"parameters": {
"color": 4,
"width": 260,
"height": 260,
"content": "## Prepare Search Queries"
},
"typeVersion": 1
},
{
"id": "e4255c27-4548-4563-96a6-b7d97183c106",
"name": "Sticky Note18",
"type": "n8n-nodes-base.stickyNote",
"position": [
760,
-120
],
"parameters": {
"color": 5,
"height": 260,
"content": "## Store Row Context"
},
"typeVersion": 1
},
{
"id": "baccdae4-f782-40b1-998c-52bf4c2397ad",
"name": "Sticky Note19",
"type": "n8n-nodes-base.stickyNote",
"position": [
1020,
-120
],
"parameters": {
"color": 6,
"width": 260,
"height": 260,
"content": "## Search Play Store via SerpApi"
},
"typeVersion": 1
},
{
"id": "e98fb372-7174-4d9a-a98e-4ae3995ad4d9",
"name": "Sticky Note34",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
160
],
"parameters": {
"color": 5,
"width": 260,
"height": 260,
"content": "## Merge Results + Context"
},
"typeVersion": 1
},
{
"id": "954bf90b-e556-4915-9249-621ab3b41215",
"name": "Sticky Note35",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
160
],
"parameters": {
"color": 6,
"width": 260,
"height": 260,
"content": "## Extract App Rank"
},
"typeVersion": 1
},
{
"id": "ec466f86-8b3c-43b9-91f2-20a1776551f2",
"name": "Sticky Note36",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
160
],
"parameters": {
"color": 3,
"width": 340,
"height": 260,
"content": "## Update Rank in Baserow"
},
"typeVersion": 1
},
{
"id": "bf1b3de5-22f8-4d45-bc2f-b887b6314466",
"name": "Sticky Note37",
"type": "n8n-nodes-base.stickyNote",
"position": [
840,
160
],
"parameters": {
"color": 2,
"width": 440,
"height": 260,
"content": "## Send Slack Alert"
},
"typeVersion": 1
},
{
"id": "e091fa90-ce43-4200-80ff-6118c3c9bcfc",
"name": "Update Rank in Baserow",
"type": "n8n-nodes-base.baserow",
"position": [
600,
260
],
"parameters": {
"rowId": "={{ $json.id }}",
"tableId": 568021,
"fieldsUi": {
"fieldValues": [
{
"fieldId": 4563204,
"fieldValue": "={{ $json.currentRank }}"
},
{
"fieldId": 4563209,
"fieldValue": "={{ $json.previousRank }}"
}
]
},
"operation": "update",
"databaseId": 239215
},
"credentials": {
"baserowApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "3be3cc0b-46ac-4a7a-83b6-01eea70d34c3",
"name": "Fetch Keywords from Baserow",
"type": "n8n-nodes-base.baserow",
"position": [
260,
-20
],
"parameters": {
"tableId": 568021,
"returnAll": true,
"databaseId": 239215,
"additionalOptions": {}
},
"credentials": {
"baserowApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e8bf6a9e-8f3b-42be-95b4-a991cf41ec9d",
"name": "Prepare Search Queries",
"type": "n8n-nodes-base.code",
"position": [
560,
-20
],
"parameters": {
"jsCode": "const apiKey = \"{api_key}\";\nconst packageId = \"practice.test.daily.testline\";\n\nreturn items.map(item => {\n const keyword = item.json[\"Keywords\"];\n const id = item.json.id;\n const currentRank = item.json[\"Current Rank\"];\n\n const serpapiUrl = `https://serpapi.com/search.json?engine=google_play&q=${encodeURIComponent(keyword)}&gl=in&hl=en&store=apps&api_key=YOUR_TOKEN_HERE\n\n return {\n json: {\n ...item.json, // important: keep all Baserow fields\n id, // row ID for update\n currentRank, // existing rank for history\n packageId, // fixed app package\n serpapi_url: serpapiUrl\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "812076cb-d038-46f5-ad3b-fa73a7c2ba7f",
"name": "Search PlayStore via SerpAPI",
"type": "n8n-nodes-base.httpRequest",
"position": [
1100,
-20
],
"parameters": {
"url": "https://serpapi.com/search.json",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "engine",
"value": "google_play"
},
{
"name": "q",
"value": "={{ $json.Keywords }}"
},
{
"name": "api_key"
},
{
"name": "gl",
"value": "in"
},
{
"name": "hl",
"value": "en"
},
{
"name": "store",
"value": "apps"
}
]
}
},
"typeVersion": 4.2,
"alwaysOutputData": true
},
{
"id": "cc33dcd6-2898-488e-86e5-9ca627171e2a",
"name": "Merge Data",
"type": "n8n-nodes-base.merge",
"position": [
0,
260
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "d8bb2f41-a9f6-4199-8132-9ea779f80fa5",
"name": "Get App Rank",
"type": "n8n-nodes-base.code",
"position": [
280,
260
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const appId = \"{app_package_name}\";\nconst results = $json[\"organic_results\"] || [];\n\nlet rank = null;\nlet position = 1;\n\nfor (const block of results) {\n if (!block.items) continue;\n\n for (const app of block.items) {\n if (app.product_id === appId) {\n rank = position;\n break;\n }\n position++;\n }\n\n if (rank !== null) break;\n}\n\nif (rank === null) rank = 0;\n\nreturn {\n json: {\n id: $json.id, // will now work \u2705\n keyword: $json.Keywords,\n currentRank: rank,\n previousRank: $json.currentRank || null\n }\n};\n"
},
"typeVersion": 2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "015ae8b9-6800-4506-8864-f269a64bf319",
"connections": {
"Merge Data": {
"main": [
[
{
"node": "Get App Rank",
"type": "main",
"index": 0
}
]
]
},
"Get App Rank": {
"main": [
[
{
"node": "Update Rank in Baserow",
"type": "main",
"index": 0
}
]
]
},
"Keep Context": {
"main": [
[
{
"node": "Search PlayStore via SerpAPI",
"type": "main",
"index": 0
},
{
"node": "Merge Data",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Fetch Keywords from Baserow",
"type": "main",
"index": 0
}
]
]
},
"Prepare Search Queries": {
"main": [
[
{
"node": "Keep Context",
"type": "main",
"index": 0
}
]
]
},
"Update Rank in Baserow": {
"main": [
[
{
"node": "Slack",
"type": "main",
"index": 0
}
]
]
},
"Fetch Keywords from Baserow": {
"main": [
[
{
"node": "Prepare Search Queries",
"type": "main",
"index": 0
}
]
]
},
"Search PlayStore via SerpAPI": {
"main": [
[
{
"node": "Merge Data",
"type": "main",
"index": 1
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
baserowApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
ASO teams tracking daily keyword positions Growth & marketing standups that want quick rank visibility Lightweight historical logging without a full BI stack Runs on a schedule (e.g., weekly) Queries SerpApi for each keyword’s Play Store ranking Saves results to Baserow: Current…
Source: https://n8n.io/workflows/8036/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow is an automated employee time tracking and reporting system that monitors weekly work hours via TMetric, then delivers personalized summaries directly to each team member on Slack. It co
Import Productboard Notes Companies And Features Into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.
Import Productboard Notes, Companies and Features into Snowflake. Uses stickyNote, httpRequest, splitOut, snowflake. Scheduled trigger; 35 nodes.
This workflow imports Productboard data into Snowflake, automating data extraction, mapping, and updates for features, companies, and notes. It supports scheduled weekly updates, data cleansing, and S
This workflow streamlines the entire inventory replenishment process by leveraging AI for demand forecasting and intelligent logic for supplier selection. It aggregates data from multiple sources—POS