
Google Ads script: Uncovered PMax Asset Performance
{
"name": "PMax Text Analyzer with AI",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 9
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
0,
0
],
"id": "95853df7-252c-4bad-a444-91d8fdbb7f92",
"name": "Schedule Trigger"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "YOUR_DOCUMENT_ID",
"mode": "list",
"cachedResultName": "YOUR_DOCUMENT_NAME",
"cachedResultUrl": "<https://docs.google.com/spreadsheets/d/YOUR_DOCUMENT_ID/edit?usp=drivesdk>"
},
"sheetName": {
"__rl": true,
"value": "YOUR_SHEET_GID",
"mode": "list",
"cachedResultName": "YOUR_SHEET_NAME",
"cachedResultUrl": "<https://docs.google.com/spreadsheets/d/YOUR_DOCUMENT_ID/edit#gid=YOUR_SHEET_GID>"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
208,
0
],
"id": "07f7e4c2-194e-434c-b69c-3a621e7ea9e0",
"name": "Get row(s) in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Google Sheets account"
}
}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "models/gemini-2.5-flash",
"mode": "list",
"cachedResultName": "models/gemini-2.5-flash"
},
"messages": {
"values": [
{
"content": "=Du bist ein Senior Google Ads Copywriter und Datenanalyst. Ich habe dir eine Datei mit Performance-Daten meiner PMax-Text-Assets hochgeladen.\n\nMetriken:\n\nKUR = Kosten-Umsatz-Relation (Niedriger ist besser. 10% = 10er ROAS).\n\nCTR = Klickrate.\n\nDeine Aufgaben:\n\nCluster-Analyse: Gruppiere die Texte inhaltlich (z.B. 'Brand-Fokus', 'Call-to-Action', 'Produkt-Fokus', 'Service/Versand'). Welches Cluster hat den besten gewichteten KUR?\n\nWinner/Loser-Identifikation: Identifiziere Texte mit hoher Spend/Impression, aber schlechtem KUR oder niedriger CTR.\n\nSemantische Analyse: Welche Wörter (z.B. 'Exklusiv', 'Schnell', 'Jetzt') korrelieren mit einer hohen Conversion-Rate?\n\nRewrite: Erstelle 5 neue Variationen basierend auf den Gewinner-Texten, die psychologische Trigger der Gewinner nutzen, aber anders formuliert sind.\n\nBITTE ANALYSIERE DIE DATEN WIE FOLGT:\n\n1. **Reinigung:** Ignoriere Zeilen mit #DIV/0! Fehlern bei den KPI-Berechnungen, aber beachte sie bei der Identifikation von \"Null-Umsatz-Kostenfressern\".\n2. **Output-Format:**\n * Erstelle eine Markdown-Tabelle für die \"Top 5 Gewinner\" (Spalten: Sprache, Text, Kosten, Umsatz, KUR, CTR).\n * Erstelle eine Markdown-Tabelle für die \"Top 5 Budget-Burner\" (Spalten: Sprache, Text, Kosten, Problem, Empfehlung).\n * Liste 3 konkrete, semantische Learnings auf (keine allgemeinen Floskeln).\n * Erstelle 5 neue Text-Vorschläge (Rewrite) basierend auf den Gewinner-Daten.\n\nWICHTIG: Gib KEINEN Python-Code aus. Nur den fertigen, formatierten Bericht.\n\nHier ist das CSV mit den Daten:\n{{ $json.csvData }}"
}
]
},
"builtInTools": {},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"typeVersion": 1.1,
"position": [
624,
0
],
"id": "adecad4d-effa-400a-b6f5-5351977963b8",
"name": "Message a model",
"credentials": {
"googlePalmApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Google Gemini API"
}
}
},
{
"parameters": {
"jsCode": "// Wir nehmen alle Items (Zeilen) aus dem Google Sheet und bauen einen CSV-String\nconst data = items.map(item => item.json);\n\nif (data.length === 0) {\n return [{json: {csvString: \"Keine Daten gefunden\"}}];\n}\n\n// Header extrahieren (z.B. asset, impressions, clicks...)\nconst headers = Object.keys(data[0]).join(\",\");\n\n// Zeilen zusammenfügen\nconst rows = data.map(row => {\n return Object.values(row).map(val => `\"${val}\"`).join(\",\"); // Werte in Anführungszeichen für Sicherheit\n}).join(\"\\n\");\n\nconst csvString = `${headers}\\n${rows}`;\n\nreturn [{ json: { csvData: csvString } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
416,
0
],
"id": "25ddacd9-efcf-42df-ad41-e54cf0f6f0eb",
"name": "Code in JavaScript"
},
{
"parameters": {
"authentication": "oAuth2",
"select": "user",
"user": {
"__rl": true,
"value": "YOUR_SLACK_USER_ID",
"mode": "list",
"cachedResultName": "YOUR_SLACK_USERNAME"
},
"text": "={{ $json.content.parts[0].text }}",
"otherOptions": {}
},
"type": "n8n-nodes-base.slack",
"typeVersion": 2.4,
"position": [
976,
0
],
"id": "6a89774d-0110-42ff-b3e7-66ce19de82d6",
"name": "Send a message",
"webhookId": "YOUR_WEBHOOK_ID",
"credentials": {
"slackOAuth2Api": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Slack account"
}
}
}
],
"pinData": {},
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Message a model",
"type": "main",
"index": 0
}
]
]
},
"Message a model": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"availableInMCP": false
},
"versionId": "YOUR_VERSION_ID",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "YOUR_INSTANCE_ID"
},
"id": "YOUR_WORKFLOW_ID",
"tags": []
}