Skrypt Google Ads: Analiza skuteczności grup plików z całego konta Google Ads

Jeśli posiadasz w swoim sklepie kampanie PMax z wieloma grupami plików, to wiesz, że analiza skuteczności poszczególnych grup nie należy do łatwych zadań.

Czy moja kampania Performance Max jest skuteczna?

Konta e-sklepów, które posiadają po kilka dużych lub bardzo rozbudowanych kampanii PMax, to teraz często spotykana sytuacja. Jedna taka kampania może generować wydatki w okolicach 10 000 zł miesięcznie lub więcej.

Tutaj zwykle pada pytanie:
„Czy moje konto reklamowe mogłoby sprzedawać tyle samo lub więcej przy mniejszym budżecie?”
Według mnie, w pierwszej kolejności należy uporządkować, co działa i przynosi dobre wyniki, a co być może tylko przepala budżet.
I tutaj sprawa się komplikuje, ponieważ tego typu duże kampanie najczęściej posiadają po kilka grup plików.

Gdzie jest raport skuteczności grup plików?

Grupy plików w kampaniach Performance Max odgrywają taką samą rolę jak grupy reklam w innych typach kampanii.

Z jakiegoś powodu jednak nie ma podglądu ich skuteczności z poziomu całego konta.
Tak, aby móc zaprezentować wyniki wszystkich grup w jednym miejscu i łatwo ocenić, które rzeczywiście są efektywne.

W panelu Google Ads jedyną opcją jest przechodzenie między kampaniami i porównywanie ich jedna po drugiej. Niestety, takie działanie jest mało efektywne.

Rozwiązanie: Skrypt Google Ads

Na szczęście dzięki Google Ads API można powiązać kluczowe metryki z danymi na poziomie Asset Group, czyli grupy plików. Dlaczego dane te nie są dostępne np. w edytorze raportów w panelu Ads?
Niestety nie znam odpowiedzi.

Konfiguracja:

  1. Skopiuj poniższy skrypt na pojedyncze konto Google Ads (nie MCK)
  2. Utwórz pusty arkusz Google Sheets
  3. Skopiuj URL arkusza do ustawień skryptu
  4. Ustaw harmonogram skryptu na raz dziennie
  5. Otwórz poniższy raport Looker Studio:
    https://lookerstudio.google.com/reporting/4ff63819-3987-4469-89eb-053595bcc078/page/NxQmD
  6. Kliknij trzy kropki w prawym górnym rogu
  7. Utwórz kopię raportu
  8. Dodaj utworzony wcześniej arkusz Google Sheets jak źródło danych.




Po więcej na temat Skryptów zapraszam na grupę FB:
https://www.facebook.com/groups/zaawansowane.google.ads


/*

Copyright 2024 Krzysztof Bycina, www.LiveAds.pl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

*/


// --------------------------------------- Configuration:
const SHEET_URL = 'YOUR GOOGLE SHEET URL HERE';
// --------------------------------------- End of the configuration

function main() {
    const sid = extractId(SHEET_URL),
        ed = getPastDate(0),
        sd7 = getPastDate(7),
        data7 = processData(getReport(sd7, ed), '7_Days'),
        sd14 = getPastDate(14),
        data14 = processData(getReport(sd14, ed), '14_Days'),
        sd30 = getPastDate(30),
        data30 = processData(getReport(sd30, ed), '30_Days'),
        sd60 = getPastDate(60),
        data60 = processData(getReport(sd60, ed), '60_Days'),
        sd90 = getPastDate(90),
        data90 = processData(getReport(sd90, ed), '90_Days'),
        combined = [].concat(data7, data14, data30, data60, data90);
    exportData(combined, sid);
}

function extractId(url) {
    const regex = /\/d\/([a-zA-Z0-9-_]+)/;
    const match = url.match(regex);
    return match ? match[1] : null;
}

function getReport(s, e) {
    const q = `
SELECT
asset_group.id, asset_group.name, campaign.id, campaign.name,
metrics.clicks, metrics.impressions, metrics.cost_micros,
metrics.conversions, metrics.conversions_value
FROM asset_group
WHERE campaign.advertising_channel_type='PERFORMANCE_MAX'
AND segments.date BETWEEN '${s}' AND '${e}'
AND metrics.cost_micros>0`;
    return AdsApp.report(q);
}

function getPastDate(days) {
    const d = new Date();
    d.setDate(d.getDate() - days);
    return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
}

function processData(rep, per) {
    const r = rep.rows(),
        d = [];
    while (r.hasNext()) {
        const x = r.next(),
            c = x['metrics.cost_micros'] / 1e6,
            ro = x['metrics.conversions_value'] ? x['metrics.conversions_value'] / c : 0,
            cp = x['metrics.conversions'] ? c / x['metrics.conversions'] : 0,
            cr = x['metrics.clicks'] ? (x['metrics.conversions'] / x['metrics.clicks']) * 100 : 0;

        d.push([
            per, x['campaign.id'], x['campaign.name'], x['asset_group.id'], x['asset_group.name'],
            x['metrics.clicks'], x['metrics.impressions'], c.toFixed(2), x['metrics.conversions'],
            ro.toFixed(2), cp.toFixed(2), cr.toFixed(2)
        ]);
    }
    return d;
}

function exportData(data, sheetId) {
    const ss = SpreadsheetApp.openById(sheetId);
    const sheet = ss.getSheets()[0];
    sheet.clear();
    sheet.appendRow([
        'Time Period', 'Campaign ID', 'Campaign Name', 'Asset Group ID', 'Asset Group Name',
        'Clicks', 'Impressions', 'Cost (Currency)', 'Conversions', 'ROAS', 'CPA', 'Conversion Rate (%)'
    ]);
    sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data);
    Logger.log('Data successfully exported to the first sheet.');
}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *