image.png

  1. Füge das Skript von Dmytro Tonkikh zum Account hinzu:

Google Ads script: Uncovered PMax Asset Performance

  1. Erstelle im Skript-Ergebnis-Sheet einen neuen Tab und darin eine Pivot Tabelle, z.B. mit den folgenden Spalten:

n8n-Workflow

{
  "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": []
}