This workflow corresponds to n8n.io template #7460 — we link there as the canonical source.
This workflow follows the Chainllm → Form Trigger 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 →
{
"name": "Automated App Analysis & ASO Report Generator",
"tags": [],
"nodes": [
{
"id": "04d002d6-cae7-45ed-9e6d-983aa5126767",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
0,
0
],
"parameters": {
"options": {},
"formTitle": "ASO Report",
"formFields": {
"values": [
{
"fieldLabel": "Play Store URL",
"requiredField": true
}
]
}
},
"typeVersion": 2.2
},
{
"id": "9d911180-cd81-43f5-a328-663bace8c221",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
440,
0
],
"parameters": {
"url": "=https://app.sensortower.com/api/android/apps/{{ $json.packageName }}?country=US",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "98bc7603-c7e0-4cae-b02b-84cf0279eefb",
"name": "Basic LLM Chain",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
880,
0
],
"parameters": {
"text": "=Create an ASO Report based on the following data. \n\nThe report must include:\n\ud83d\udcf1 App Overview (Name, Publisher, Category, Installs, Rating, In-app purchases, Last update) \n\u2b50 User Ratings & Reviews (average rating, rating count, summary of featured reviews with sentiment highlights) \n\ud83d\udcca Competitor Analysis (App Name, Publisher, Rating, Installs) \n\ud83d\udcc8 Market Insights (downloads & revenue last month, top countries if available) \n\ud83d\udca1 Recommendations (actionable suggestions to improve monetization, retention, competitiveness) \n\n---\n\n### Input Data:\n\nApp Name: {{ $json.appInfo.name }}\nApp ID: {{ $json.appInfo.app_id }}\nPublisher: {{ $json.appInfo.publisher }}\nCategory: {{ $json.appInfo.category }}\nInstalls: {{ $json.appInfo.installs }}\nRating: {{ $json.appInfo.rating }}\nRating Count: {{ $json.appInfo.rating_count }}\nIn-App Purchases: {{ $json.appInfo.in_app_purchases }}\nLast Update: {{ $json.appInfo.last_update }}\n\nFeatured Reviews:\n{{ $json.reviewsText }}\n\nCompetitors:\n{{ $json.competitorsText }}\n\nMarket Insights:\nDownloads Last Month: {{ $json.market.downloads }}\nRevenue Last Month: {{ $json.market.revenue }} {{ $json.market.currency }}\n",
"batching": {},
"messages": {
"messageValues": [
{
"message": "=You are an ASO (App Store Optimization) Analyst. \nGenerate an executive report in plain text only.\nDo not use HTML or Markdown. \nFormat the report neatly using emojis as section headers and bullet points. \nAlways write in business English.\n"
}
]
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "5b71fe1e-1774-45e9-b8d8-05cb6c8aeb5e",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
660,
0
],
"parameters": {
"jsCode": "// n8n Code Node: Parse + Format App Intelligence Data\n// Input: JSON from HTTP Request (SensorTower / similar API)\n// Output: Summary data ready for LLM (formatted text)\n\nconst data = items[0].json;\n\n// --- Get basic info ---\nconst appInfo = {\n name: data.name,\n app_id: data.app_id,\n publisher: data.publisher_name,\n rating: data.rating,\n rating_count: data.rating_count,\n installs: data.installs,\n category: data.categories?.map(c => c.name).join(\", \") || \"N/A\",\n in_app_purchases: data.top_in_app_purchases?.US || \"None\",\n last_update: data.current_version,\n};\n\n// --- Get 3 latest featured reviews ---\nconst reviews = (data.featured_reviews || [])\n .slice(0, 3)\n .map(r => ({\n user: r.username,\n date: r.date,\n rating: r.rating,\n content: r.content,\n tags: r.tags || []\n }));\n\n// Format reviews into clean string\nconst reviewsText = reviews.map(r => \n `- User: ${r.user}\\n Date: ${r.date}\\n Rating: ${r.rating}\\n Content: ${r.content}\\n Tags: ${r.tags.join(\", \")}`\n).join(\"\\n\\n\");\n\n// --- Get top 3 competitors ---\nconst competitors = (data.related_apps || [])\n .slice(0, 3)\n .map(app => ({\n name: app.name,\n publisher: app.publisher_name,\n rating: app.rating,\n installs: app.rating_count,\n }));\n\n// Format competitors into clean string\nconst competitorsText = competitors.map(c => \n `- Name: ${c.name}\\n Publisher: ${c.publisher}\\n Rating: ${c.rating}\\n Installs: ${c.installs}`\n).join(\"\\n\\n\");\n\n// --- Get market data (downloads & revenue last month) ---\nconst market = {\n downloads: data.worldwide_last_month_downloads?.value || 0,\n revenue: data.worldwide_last_month_revenue?.value || 0,\n currency: data.worldwide_last_month_revenue?.currency || \"USD\"\n};\n\n// --- Return final data for LLM ---\nreturn [\n {\n json: {\n appInfo,\n reviewsText,\n competitorsText,\n market\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "e6e2cec5-a1dc-4b0b-ba28-b910c88734e1",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
880,
220
],
"parameters": {
"model": "google/gemini-2.0-flash-exp:free",
"options": {}
},
"typeVersion": 1
},
{
"id": "6e7ed502-b385-4c67-9076-45f5885321ce",
"name": "Create a document",
"type": "n8n-nodes-base.googleDocs",
"position": [
1240,
0
],
"parameters": {
"title": "={{ $('Code').item.json.appInfo.name }}",
"folderId": "YOUR_GOOGLE_DRIVE_FOLDER_ID"
},
"typeVersion": 2
},
{
"id": "5042a450-3c0b-4e71-b89f-71ff8b1eba30",
"name": "Update a document",
"type": "n8n-nodes-base.googleDocs",
"position": [
1460,
0
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ $('Basic LLM Chain').item.json.text }}",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ $json.id }}"
},
"typeVersion": 2
},
{
"id": "e551c8e9-bbd4-446a-9e7c-932460f6a792",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
1680,
0
],
"parameters": {
"text": "=\ud83d\udcc4 New document for app analysis: {{ $('Code').item.json.appInfo.name }}\n\ud83d\udd17 Document link: https://docs.google.com/document/d/{{ $json.documentId }}/edit?tab=t.0\n",
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "de8cfef6-6362-4375-b0fc-b1d70421df9a",
"name": "Code1",
"type": "n8n-nodes-base.code",
"position": [
220,
0
],
"parameters": {
"jsCode": "// Input from form trigger\nconst url = items[0].json[\"Play Store URL\"];\n\n// Find the 'id=' parameter in the URL\nlet packageName = null;\ntry {\n const urlObj = new URL(url);\n packageName = urlObj.searchParams.get(\"id\");\n} catch (e) {\n // fallback manual if not a valid URL\n const match = url.match(/id=([^&]+)/);\n packageName = match ? match[1] : null;\n}\n\nreturn [\n {\n json: {\n packageName\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "9b40b151-d7ab-4d27-b896-ffc51e5c3832",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-660,
-500
],
"parameters": {
"width": 580,
"height": 1160,
"content": "# Automated App Analysis & ASO Report Generator\n\nThis workflow automates the process of analyzing a mobile app from the Google Play Store and generating a professional **ASO (App Store Optimization) Report**. \nSimply submit a Play Store URL, and the workflow will fetch app intelligence data, parse it, run an AI-based analysis, and deliver a formatted report in Google Docs. A Telegram notification with the document link ensures you never miss a new report.\n\n\n## \u2728 Key Features\n- **Form Input Trigger** \u2013 Start the workflow by submitting a Play Store URL. \n- **Automated Data Retrieval** \u2013 Uses HTTP request to fetch app intelligence (via SensorTower or similar APIs). \n- **Smart Data Parsing** \u2013 Extracts essential app details, competitor insights, reviews, downloads, and revenue data. \n- **AI-Powered ASO Report** \u2013 Generates a professional analysis using LLM (Gemini via OpenRouter) with structured sections: \n - \ud83d\udcf1 App Overview \n - \u2b50 User Ratings & Reviews \n - \ud83d\udcca Competitor Analysis \n - \ud83d\udcc8 Market Insights \n - \ud83d\udca1 Actionable Recommendations \n- **Google Docs Integration** \u2013 Creates and updates a Google Doc with the generated report. \n- **Instant Notification** \u2013 Sends a Telegram message with the app report link for quick access. \n\n---\n\n## \ud83d\udd10 Required Credentials\nTo run this workflow, you'll need:\n- **SensorTower API (or alternative App Intelligence API)** \u2013 for app details, reviews, competitors, and market data. \n- **OpenRouter API** \u2013 to access LLM model. \n- **Google Docs OAuth2** \u2013 to create and update the ASO report in Google Docs. \n- **Telegram API** \u2013 for instant notifications with the report link. \n\n---\n\n## \ud83c\udf81 Benefits\n- **Save Time** \u2013 Automates the manual process of app research and reporting. \n- **Consistent Reporting** \u2013 Ensures every report follows a professional structure with clear sections. \n- **Actionable Insights** \u2013 Get AI-generated recommendations to improve app performance and competitiveness. \n- **Collaboration-Ready** \u2013 Reports are stored in Google Docs for easy sharing and editing. \n- **Real-Time Alerts** \u2013 Stay updated via Telegram whenever a new report is generated. \n\n---\n"
},
"typeVersion": 1
},
{
"id": "4f425ee1-d7e6-4b47-92ee-a80ffd58d341",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-60,
-180
],
"parameters": {
"color": 2,
"width": 640,
"height": 340,
"content": "- The workflow starts when a user submits a form with the app's Play Store URL\n- Extracts the package name (the id= parameter) from the submitted URL.\n- Uses the package name to call the SensorTower API (or a similar app intelligence API) and fetch details such as the app's name, publisher, category, rating, and more."
},
"typeVersion": 1
},
{
"id": "97bab2dd-d3ff-435a-bdca-8a9859a92e13",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
620,
-180
],
"parameters": {
"color": 4,
"width": 760,
"height": 540,
"content": "- Parses the raw JSON and formats it into structured text, including app details, featured reviews, competitor data, and market insights.\n- Sends the structured data to an AI model with a prompt that instructs it to create a neatly formatted ASO report.\n- Automatically creates a new Google Doc titled with the app's name and stores the generated report inside the specified folder."
},
"typeVersion": 1
},
{
"id": "475755b2-50c1-4db7-8fca-1417cb5ce660",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1400,
-180
],
"parameters": {
"color": 5,
"width": 520,
"height": 540,
"content": "- Inserts the ASO report text into the previously created Google Doc.\n- Once the document is updated, a Telegram notification is sent to the specified user."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"Code": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
}
]
]
},
"Code1": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Basic LLM Chain": {
"main": [
[
{
"node": "Create a document",
"type": "main",
"index": 0
}
]
]
},
"Create a document": {
"main": [
[
{
"node": "Update a document",
"type": "main",
"index": 0
}
]
]
},
"Update a document": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Code1",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the process of analyzing a mobile app from the Google Play Store and generating a professional ASO (App Store Optimization) Report. Simply submit a Play Store URL, and the workflow will fetch app intelligence data, parse it, run an AI-based analysis, and…
Source: https://n8n.io/workflows/7460/ — 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 automates the process of collecting uploaded invoices, extracting text using Google Vision API, and processing the extracted text with an LLM to produce structured data containing key tr
Upload a PDF and instantly get a neatly formatted Google Doc with all the readable text—no manual copy-paste, no messy line breaks.
A Telegram bot that converts natural-language work descriptions into detailed cost estimates using AI parsing, vector search, and the open-source DDC CWICR database with 55,000+ construction work item
Deep Research new (fr). Uses outputParserStructured, formTrigger, chainLlm, form. Event-driven trigger; 82 nodes.
My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.