This workflow corresponds to n8n.io template #9343 — we link there as the canonical source.
This workflow follows the Gmail → HTTP Request 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": "jokolRfKCTJ4umAw",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "iOS App Store Review Monitor",
"tags": [],
"nodes": [
{
"id": "156c62c9-b236-4d0d-ad17-540dfe8d60ff",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-336,
-48
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "*/30 * * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "b33809e1-6e0e-4c3c-955c-3d5f7d200d72",
"name": "Extract Reviews",
"type": "n8n-nodes-base.code",
"position": [
384,
-80
],
"parameters": {
"jsCode": "const jsonData = JSON.parse($input.all()[0].json.data);\n\nconst reviews = jsonData.feed.entry || [];\n\nreturn reviews.map(review => ({\n rating: review['im:rating']?.label,\n title: review.title?.label,\n content: review.content?.label,\n author: review.author?.name?.label,\n version: review['im:version']?.label,\n date: review.updated?.label,\n reviewId: review.id?.label\n}));"
},
"typeVersion": 2
},
{
"id": "db2f0933-6af5-440f-bbad-90878482d23f",
"name": "Any new reviews?",
"type": "n8n-nodes-base.if",
"position": [
880,
-96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "24aadf61-9388-47df-a03f-734b06589ed0",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $items().length }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1f4e4fbc-abe7-4d2a-9a54-bcc5992413a6",
"name": "App Config",
"type": "n8n-nodes-base.set",
"position": [
-96,
-64
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "31946ee3-e6d5-4084-93b4-4ef0f62c8cfe",
"name": "appId",
"type": "string",
"value": "1234567890"
},
{
"id": "4b88dc12-53e3-430e-9b88-f55903f943bf",
"name": "country",
"type": "string",
"value": "US"
},
{
"id": "22cec944-85bc-4786-b988-0c2cc71abad3",
"name": "lang",
"type": "string",
"value": "en"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7fa5c285-0645-4641-8e27-2c2e33ff1a9c",
"name": "Fetch Reviews",
"type": "n8n-nodes-base.httpRequest",
"position": [
160,
-80
],
"parameters": {
"url": "=https://itunes.apple.com/rss/customerreviews/page=1/id={{$json[\"appId\"]}}/sortby=mostrecent/json?l={{$json[\"lang\"]}}&cc={{$json[\"country\"]}}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "f4e2673d-1bb8-4871-9b84-124587e29d30",
"name": "Filter latest Review",
"type": "n8n-nodes-base.code",
"position": [
640,
-80
],
"parameters": {
"jsCode": "const items = $input.all();\nconst sixHoursAgo = new Date(Date.now() - 78 * 60 * 60 * 1000);\nconst newOnes = [];\n\nfor (const item of items) {\n const reviewDate = new Date(item.json.date);\n if (reviewDate > sixHoursAgo) {\n newOnes.push(item);\n }\n}\n\nreturn newOnes;\n"
},
"typeVersion": 2
},
{
"id": "bafee2c9-19cc-4f31-b1c5-7870b58ddcca",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-432,
-192
],
"parameters": {
"width": 256,
"height": 112,
"content": "**Runs every 6 hours to check for new reviews - adjust timing based on your monitoring needs**"
},
"typeVersion": 1
},
{
"id": "fe8162f2-745e-4ea4-8e1f-8d3fef8d9303",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-160,
80
],
"parameters": {
"width": 224,
"height": 112,
"content": "**Set your App Store ID, country (us/gb/de), and language (en/es/fr) - find App ID in your App Store URL**"
},
"typeVersion": 1
},
{
"id": "fb9c717b-f9b2-4e53-a4b3-7fba3b5f4e71",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
-208
],
"parameters": {
"height": 96,
"content": "**Calls Apple's iTunes API to get latest customer reviews - sorted by most recent first**"
},
"typeVersion": 1
},
{
"id": "51b33b2b-379b-4232-9fa0-fa45b427ab5b",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
64
],
"parameters": {
"height": 96,
"content": "**Compares with last check time to find only NEW reviews since previous run - prevents duplicate notifications**"
},
"typeVersion": 1
},
{
"id": "fa7128e3-4ee0-4553-b999-f24b7bc43067",
"name": "Send notification",
"type": "n8n-nodes-base.gmail",
"position": [
1200,
-240
],
"parameters": {
"sendTo": "user@example.com",
"message": "=\ud83c\udd95 New iOS App Store Review (\u2b50 {{$json.rating}}/5) \u201c{{$json.title}}\u201d by {{$json.author}} \u2014 v{{$json.version}} \u2014 {{$json.content}} ",
"options": {},
"subject": "=New App Store Review (\u2b50 {{$json.rating}}/5) \u2014 {{$json.title}}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "c2fce7f5-6b22-4d79-b374-19514c164d22",
"name": "False Case",
"type": "n8n-nodes-base.set",
"position": [
1216,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8f36ed49-5b1a-4687-9a49-36eee4197824",
"name": "status",
"type": "string",
"value": "no new reviews"
}
]
}
},
"typeVersion": 3.4
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "8b6459a1-d008-44db-8ebd-c516e2c111d1",
"connections": {
"App Config": {
"main": [
[
{
"node": "Fetch Reviews",
"type": "main",
"index": 0
}
]
]
},
"Fetch Reviews": {
"main": [
[
{
"node": "Extract Reviews",
"type": "main",
"index": 0
}
]
]
},
"Extract Reviews": {
"main": [
[
{
"node": "Filter latest Review",
"type": "main",
"index": 0
}
]
]
},
"Any new reviews?": {
"main": [
[
{
"node": "Send notification",
"type": "main",
"index": 0
}
],
[
{
"node": "False Case",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "App Config",
"type": "main",
"index": 0
}
]
]
},
"Filter latest Review": {
"main": [
[
{
"node": "Any new reviews?",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
gmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs on a scheduled basis (default: every 6 hours, customizable) and monitors new App Store reviews for your iOS apps. It fetches reviews via Apple’s iTunes RSS API, filters only new reviews since the last run and sends real-time notifications to your team via…
Source: https://n8n.io/workflows/9343/ — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
Instead of providing a routine check, it focuses on significant movements by: Sending a Slack alert only if a query crosses a defined movement threshold. Emailing a structured report with the Top 25 i
Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google
This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.
This workflow automatically identifies your weekly bestselling product from your Algolia-powered e-commerce store and generates a cinematic product video using Google VEO 3.0 AI, helping marketing tea