
Apple App Store reviews summary
Description
Categories
📢 Marketing🤖 AI & Machine Learning
Nodes Used
n8n-nodes-base.jwtn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.slackn8n-nodes-base.filtern8n-nodes-base.splitOutn8n-nodes-base.splitOutn8n-nodes-base.splitOutn8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
PriceFree
Views0
Last Updated11/28/2025
workflow.json
{
"id": "O16rkzLczZ7KXsJr",
"meta": {
"instanceId": "fe52080916406a2a9812a7975b2d9b9e9838f3ce0f0b34614c611fb2ca1528d3"
},
"name": "Apple App Store reviews summary",
"tags": [],
"nodes": [
{
"id": "8d29dacc-12dc-4b59-8f61-94c06633c85e",
"name": "Split Out6",
"type": "n8n-nodes-base.splitOut",
"position": [
448,
464
],
"parameters": {
"options": {},
"fieldToSplitOut": "apps"
},
"typeVersion": 1
},
{
"id": "851e89ba-22be-4a77-92ab-87d5a996e43c",
"name": "Split Out8",
"type": "n8n-nodes-base.splitOut",
"position": [
480,
928
],
"parameters": {
"options": {},
"fieldToSplitOut": "apps"
},
"typeVersion": 1
},
{
"id": "8b3b836b-e9c9-49bf-9a47-2eaad4b70487",
"name": "Loop Over Items3",
"type": "n8n-nodes-base.splitInBatches",
"onError": "continueRegularOutput",
"position": [
656,
928
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "41b33c31-6d86-475f-a5b0-b837310cf310",
"name": "JWT",
"type": "n8n-nodes-base.jwt",
"position": [
848,
464
],
"parameters": {
"options": {
"kid": "LY89FQN8G3"
},
"useJson": true,
"claimsJson": "={\n \"iss\": \"69a6de90-8c47-47e3-e053-5b8c7c11a4d1\",\n \"aud\": \"appstoreconnect-v1\",\n \"bid\": \"com.tripledot.woodoku\",\n \"exp\": {{ Math.floor((new Date().getTime() + 10 * 60 * 1000) / 1000) }}\n}\n"
},
"credentials": {
"jwtAuth": {
"id": "7qTWKeegrAbdcNLO",
"name": "Apple Connect JWT Auth account - App Manager - Tripledot"
}
},
"typeVersion": 1
},
{
"id": "9871f543-2071-4ead-ab58-6ea3fd652867",
"name": "HTTP Request - CUSTOMER REVIEWS",
"type": "n8n-nodes-base.httpRequest",
"position": [
1040,
464
],
"parameters": {
"url": "=https://api.appstoreconnect.apple.com/v1/apps/{{ $('Loop Over Items2').item.json.apple_app_store_app_id }}/customerReviews?sort=-createdDate",
"options": {
"pagination": {
"pagination": {
"nextURL": "={{$response.body.links[\"next\"]}}",
"maxRequests": 5,
"paginationMode": "responseContainsNextURL",
"limitPagesFetched": true,
"completeExpression": "={{$response.body.links[\"next\"] == null}}",
"paginationCompleteWhen": "other"
}
}
},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"id": "vqqwFq1bj6pWDkMw",
"name": "Apple Connect Bearer YOUR_TOKEN_HERE account - Tripledot"
}
},
"typeVersion": 4.2
},
{
"id": "14faa3b0-63a2-42d2-9bb0-e5af2e380768",
"name": "Pinecone Vector Store9",
"type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
"position": [
1536,
464
],
"parameters": {
"mode": "insert",
"options": {
"clearNamespace": "={{ new Date().getDay() === 6 }}",
"pineconeNamespace": "=store_reviews_apple_app_store_{{$('Split Out6').item.json.apple_app_store_app_id}}"
},
"pineconeIndex": {
"__rl": true,
"mode": "list",
"value": "n8n-store-reviews",
"cachedResultName": "n8n-store-reviews"
}
},
"credentials": {
"pineconeApi": {
"id": "AhisTk5eS6H3HYiC",
"name": "PineconeApi account"
}
},
"typeVersion": 1.3
},
{
"id": "da56079e-cb79-477d-8975-0ce5d6986719",
"name": "Embeddings OpenAI9",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
1536,
640
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "iAPtqcVj4gp3rRy2",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "fd593a5c-7a30-4cc3-b176-a70e71eb7367",
"name": "Default Data Loader8",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
1632,
640
],
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "star_rating",
"value": "={{ $('Filter1').item.json.data.attributes.rating }}"
},
{
"name": "date",
"value": "={{$('Filter1').item.json.data.attributes.createdDate}}\n"
},
{
"name": "territory",
"value": "={{ $('Filter1').item.json.data.attributes.territory }}"
},
{
"name": "review_id",
"value": "={{ $('Filter1').item.json.data.id }}"
}
]
}
},
"jsonData": "=title: {{ $('Filter1').item.json.data.attributes.title }} | comment: {{ $('Filter1').item.json.data.attributes.body }} | date: {{ $('Filter1').item.json.data.attributes.createdDate }} | star rating: {{ $('Filter1').item.json.data.attributes.rating }} | territory: {{ $('Filter1').item.json.data.attributes.territory }}",
"jsonMode": "expressionData"
},
"typeVersion": 1.1
},
{
"id": "29922c0f-d2dc-4753-abc1-4e52de4be1bf",
"name": "Split Out9",
"type": "n8n-nodes-base.splitOut",
"position": [
1216,
464
],
"parameters": {
"include": "=",
"options": {
"destinationFieldName": ""
},
"fieldToSplitOut": "data"
},
"typeVersion": 1
},
{
"id": "ed1b9229-af94-4757-a920-068d08d50c39",
"name": "OpenAI Chat Model10",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
880,
1152
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "iAPtqcVj4gp3rRy2",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "49252522-8491-4099-9b53-699d81bc8fac",
"name": "Embeddings OpenAI12",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
976,
1328
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "iAPtqcVj4gp3rRy2",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "e7ab3d96-4ceb-448c-b059-ccc314943589",
"name": "Pinecone Vector Store12",
"type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
"position": [
976,
1200
],
"parameters": {
"mode": "retrieve-as-tool",
"topK": 500,
"options": {
"pineconeNamespace": "=store_reviews_apple_app_store_{{$('Loop Over Items3').item.json.apple_app_store_app_id}}"
},
"pineconeIndex": {
"__rl": true,
"mode": "list",
"value": "n8n-store-reviews",
"cachedResultName": "n8n-store-reviews"
},
"toolDescription": "This is the vector store for the Apple App Store reviews data you need to answer queries"
},
"credentials": {
"pineconeApi": {
"id": "AhisTk5eS6H3HYiC",
"name": "PineconeApi account"
}
},
"typeVersion": 1.3
},
{
"id": "e6bdf836-c130-44f5-80fb-04afd274fed9",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1232,
864
],
"parameters": {
"color": 7,
"width": 192,
"height": 224,
"content": "Post the summary to a Slack channel"
},
"typeVersion": 1
},
{
"id": "7997491f-54e8-4a1c-8f8d-62171d58e45e",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
400
],
"parameters": {
"color": 7,
"width": 150,
"height": 208,
"content": "Fetch reviews once a day"
},
"typeVersion": 1
},
{
"id": "1cee29d5-8b94-4cbc-b9e0-9d5312dd3490",
"name": "Daily Trigger1",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
80,
464
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.2
},
{
"id": "fc49497e-d286-406d-8d80-22be63779d5e",
"name": "Set App Store app ids",
"type": "n8n-nodes-base.set",
"position": [
256,
464
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "ed79836f-8032-4daa-afc1-d0170157c8a0",
"name": "=apps",
"type": "array",
"value": "=[\n { \n \"apple_app_store_app_id\": \"<Apple app id here>\", \n \"app_name\": \"<App name here>\"\n },\n {\n \"apple_app_store_app_id\": \"<Apple app id here>\", \n \"app_name\": \"<App name here>\"\n }\n]"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "0a5b71ee-bf43-4312-9d26-799e3669b6d3",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
400
],
"parameters": {
"color": 7,
"width": 192,
"height": 208,
"content": "Define app ids and names"
},
"typeVersion": 1
},
{
"id": "ada28eab-f4f1-4720-8ea5-55371299289d",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
432,
400
],
"parameters": {
"color": 7,
"width": 304,
"height": 208,
"content": "Loop over app ids (apps) in the list"
},
"typeVersion": 1
},
{
"id": "56f0e43e-9687-46e2-8aff-50b1548db9a8",
"name": "Loop Over Items2",
"type": "n8n-nodes-base.splitInBatches",
"onError": "continueRegularOutput",
"position": [
624,
464
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "32631042-deb4-494d-93be-800695376bfc",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
752,
208
],
"parameters": {
"color": 7,
"width": 224,
"height": 400,
"content": "Generate a JWT token for Apple's App Store Connect API. Required fields: \n- iss: Issuer ID generated by Apple\n- bid: Bundle id of one of the apps in the App Store account\n- exp: Token expiry date. Set to current time + 10 minutes."
},
"typeVersion": 1
},
{
"id": "94eef180-922d-4e24-a35a-30ebf3526059",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
992,
400
],
"parameters": {
"color": 7,
"width": 192,
"height": 208,
"content": "HTTP call to fetch App Store reviews of the app"
},
"typeVersion": 1
},
{
"id": "cd008073-8feb-4cac-bde8-502e726bd06b",
"name": "Sticky Note15",
"type": "n8n-nodes-base.stickyNote",
"position": [
1344,
384
],
"parameters": {
"color": 7,
"width": 464,
"height": 224,
"content": "Store the previous day's reviews in the vector store. Create a different namespace for each app (app id). Clear the name space once a week to remove old reviews."
},
"typeVersion": 1
},
{
"id": "85942bd2-57d2-4504-bb39-ce32b3d47389",
"name": "Filter1",
"type": "n8n-nodes-base.filter",
"notes": "Fetch yesterday's reviews",
"position": [
1376,
464
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e5cc101a-9e06-4f33-8578-63c4acc66042",
"operator": {
"type": "dateTime",
"operation": "equals"
},
"leftValue": "={{ $json.data.attributes.createdDate.toDateTime().toISODate() }}",
"rightValue": "={{$today.minus({days: 1})}}\n"
}
]
}
},
"notesInFlow": false,
"typeVersion": 2.2,
"alwaysOutputData": true
},
{
"id": "79baaaa8-8c25-4bdf-a98e-1427a116ce49",
"name": "Weekly Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"notes": "On Fridays at 11am",
"position": [
112,
928
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
5
],
"triggerAtHour": 11
}
]
}
},
"notesInFlow": true,
"typeVersion": 1.2
},
{
"id": "58011080-6343-4314-91c5-fb45f8795013",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
864
],
"parameters": {
"color": 7,
"width": 176,
"height": 224,
"content": "Prepare and send the summary once a week"
},
"typeVersion": 1
},
{
"id": "ef95861d-7a8e-47f3-8eac-017cc530d090",
"name": "Set App Store app ids1",
"type": "n8n-nodes-base.set",
"position": [
288,
928
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "ed79836f-8032-4daa-afc1-d0170157c8a0",
"name": "=apps",
"type": "array",
"value": "=[\n { \n \"apple_app_store_app_id\": \"<Apple app id here>\", \n \"app_name\": \"<App name here>\"\n },\n {\n \"apple_app_store_app_id\": \"<Apple app id here>\", \n \"app_name\": \"<App name here>\"\n }\n]"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ca10af78-f185-4c10-9431-2d20a3c6e327",
"name": "Sticky Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
864
],
"parameters": {
"color": 7,
"width": 192,
"height": 224,
"content": "Define app ids and names"
},
"typeVersion": 1
},
{
"id": "247fe591-2a5f-43cc-98e3-db448ff8666c",
"name": "Sticky Note18",
"type": "n8n-nodes-base.stickyNote",
"position": [
464,
864
],
"parameters": {
"color": 7,
"width": 320,
"height": 224,
"content": "Loop over app ids (apps) in the list"
},
"typeVersion": 1
},
{
"id": "25651392-868b-4481-98d5-cbb1fb628b09",
"name": "AI Agent - Summariser",
"type": "@n8n/n8n-nodes-langchain.agent",
"onError": "continueRegularOutput",
"position": [
928,
944
],
"parameters": {
"text": "=Create a summary of store reviews submitted. In your output, include the number of reviews you processed to create the summary. The summary should be split into two groups: a summary about positive reviews and a summary about negative reviews. Also include the average star rating.",
"options": {
"systemMessage": "=Your job is to respond to prompts using the information you gather from the Apple App Store reviews of a mobile app. Your main role is to help your users to gain insights from store review without having to read reviews one by one. Store review usually have star ratings with 1 star being the lowest rating and 5 star being the highest rating. They can also have a text description where the player of the game writes a review about their experience with the game. These can be negative reviews or positive reviews. The lower the star rating is the more likely that the review is negative."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "b86bb808-114c-45d2-99f9-2ee24ff47684",
"name": "Send to Slack channel1",
"type": "n8n-nodes-base.slack",
"position": [
1280,
944
],
"webhookId": "91dd6021-c694-4470-9013-53d5f2e213f8",
"parameters": {
"text": "={{ $json.output }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "C1111111"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "tVU8HVcP92PJGgqD",
"name": "Slack account"
}
},
"typeVersion": 2.3
},
{
"id": "c15903ad-8adc-4a93-beb7-51b7337a369d",
"name": "Sticky Note19",
"type": "n8n-nodes-base.stickyNote",
"position": [
896,
864
],
"parameters": {
"color": 7,
"width": 288,
"height": 224,
"content": "Generate Apple App Store review summary for the app"
},
"typeVersion": 1
},
{
"id": "b0bc0432-3765-4037-9983-2b883417278a",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-384,
336
],
"parameters": {
"width": 336,
"height": 784,
"content": "## Apple App Store Reviews Summary with Pinecone, OpenAI & Slack Notification\n\nThis n8n workflow automates the process of collecting, storing, and summarizing customer reviews from the Apple App Store for multiple apps. It fetches daily reviews, stores them in a Pinecone vector database, and generates a weekly summary using OpenAI, which is then posted to a Slack channel.\n\n**Key Features**\n\n- Fetches daily customer reviews for a list of Apple App Store apps using the App Store Connect API.\n- Stores reviews in Pinecone, with separate namespaces for each app and automatic weekly cleanup.\n- Uses OpenAI to generate a summary of reviews, including positive/negative highlights and average star rating.\n- Posts the summary to a specified Slack channel every week.\n\n\n**How to use**\n\n- Set your Apple App Store app IDs and names in the provided Set nodes.\n- Configure your Apple API, Pinecone, OpenAI, and Slack credentials.\n- Adjust the schedule triggers as needed for daily fetching and weekly summarization.\n- Deploy the workflow to automate review monitoring and reporting for your apps."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {
"Daily Trigger1": [
{
"json": {
"Hour": "14",
"Year": "2025",
"Month": "November",
"Minute": "19",
"Second": "04",
"Timezone": "Europe/Madrid (UTC+01:00)",
"timestamp": "2025-11-07T14:19:04.933+01:00",
"Day of week": "Friday",
"Day of month": "07",
"Readable date": "November 7th 2025, 2:19:04 pm",
"Readable time": "2:19:04 pm"
}
}
]
},
"settings": {
"executionOrder": "v1"
},
"versionId": "dd6fb4d2-4be5-439b-9e2d-bd0a96364b4d",
"connections": {
"JWT": {
"main": [
[
{
"node": "HTTP Request - CUSTOMER REVIEWS",
"type": "main",
"index": 0
}
]
]
},
"Filter1": {
"main": [
[
{
"node": "Pinecone Vector Store9",
"type": "main",
"index": 0
}
]
]
},
"Split Out6": {
"main": [
[
{
"node": "Loop Over Items2",
"type": "main",
"index": 0
}
]
]
},
"Split Out8": {
"main": [
[
{
"node": "Loop Over Items3",
"type": "main",
"index": 0
}
]
]
},
"Split Out9": {
"main": [
[
{
"node": "Filter1",
"type": "main",
"index": 0
}
]
]
},
"Daily Trigger1": {
"main": [
[
{
"node": "Set App Store app ids",
"type": "main",
"index": 0
}
]
]
},
"Weekly Trigger": {
"main": [
[
{
"node": "Set App Store app ids1",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items2": {
"main": [
[],
[
{
"node": "JWT",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items3": {
"main": [
[],
[
{
"node": "AI Agent - Summariser",
"type": "main",
"index": 0
}
]
]
},
"Embeddings OpenAI9": {
"ai_embedding": [
[
{
"node": "Pinecone Vector Store9",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Embeddings OpenAI12": {
"ai_embedding": [
[
{
"node": "Pinecone Vector Store12",
"type": "ai_embedding",
"index": 0
}
]
]
},
"OpenAI Chat Model10": {
"ai_languageModel": [
[
{
"node": "AI Agent - Summariser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Default Data Loader8": {
"ai_document": [
[
{
"node": "Pinecone Vector Store9",
"type": "ai_document",
"index": 0
}
]
]
},
"AI Agent - Summariser": {
"main": [
[
{
"node": "Send to Slack channel1",
"type": "main",
"index": 0
}
]
]
},
"Set App Store app ids": {
"main": [
[
{
"node": "Split Out6",
"type": "main",
"index": 0
}
]
]
},
"Pinecone Vector Store9": {
"main": [
[
{
"node": "Loop Over Items2",
"type": "main",
"index": 0
}
]
]
},
"Send to Slack channel1": {
"main": [
[
{
"node": "Loop Over Items3",
"type": "main",
"index": 0
}
]
]
},
"Set App Store app ids1": {
"main": [
[
{
"node": "Split Out8",
"type": "main",
"index": 0
}
]
]
},
"Pinecone Vector Store12": {
"ai_tool": [
[
{
"node": "AI Agent - Summariser",
"type": "ai_tool",
"index": 0
}
]
]
},
"HTTP Request - CUSTOMER REVIEWS": {
"main": [
[
{
"node": "Split Out9",
"type": "main",
"index": 0
}
]
]
}
}
}