Как бесплатно настроить автоматический импорт расходов на Facebook Ads в Google Analytics
Подписчики моего Telegram-канала по веб-аналитике часто спрашивают про бесплатные сервисы по импорту расходов из рекламных систем в Google Analytics. В этой статье я решил показать как сделать такой сервис самостоятельно используя исключительно бесплатные ресурсы и язык программирования Python. Случайный образом я нашел PythonAnywhere — простой облачный сервис, который позволяет запускать Python-код, в том числе по расписанию, делать веб-приложения (например, Flask) и вебхуки. У этого сервиса есть бесплатный тариф, и он нам подходит для решения задачи. Итак, будем настраивать импорт данных о расходах на Facebook рекламу в Google Analytics. Чтобы это сделать нужно:
- Зарегистрироваться в сервисе PythonAnywhere и войти в него.
- Открыть вкладку Consoles, нажать на ссылку Bash рядом с Other.
- В открывшемся окне нужно установить дополнительные пакеты для работы — для этого поочередно выполните такие команды:
1) pip3 install --user facebook_business
2) pip3 install --user facebookads
3) pip3 install --user --upgrade google-api-python-client - Перейти на вкладку Files, в поле возле кнопки New file ввести название «fb_cost_to_ga.py» и нажать саму кнопку для создания нового файла. В открывшемся окне нужно вставить этот код и нажать Save.
- В только что созданном файле нужно заменить значения на свои, а именно:
- MY_APP_ID —ID приложения, через которое осуществляется работа с Facebook API.
- MY_APP_SECRET — secret приложения, через которое осуществляется работа с Facebook API.
- MY_LONG_LIVED_ACCESS_TOKEN — долгосрочный токен доступа, через который будут получаться данные о расходах из рекламного аккаунта.
- AD_ACCOUNT_ID — ID рекламного аккаунта в Facebook
- PATH_TO_SERVICE_ACCOUNT_KEY — путь к JSON-ключу сервисного аккаунта Google Cloud (создать проект GCP, создать сервисный аккаунт, включить GA API)
- GA_PROPERTY_ID — ID ресурса GA, в который надо загружать расходы
- GA_DATA_SET_ID — ID набора данных, в который будут загружаться расходы
- FB_CSV_FILEPATH — любое название файла .csv (например, fb_cost_data.csv). Именно с таким названием будет создаваться файл с последними данными о расходах, которые будут загружаться в GA.
- Если вам понятно, где взять все эти конфигурации — можете переходить к пункту 19 этой инструкции. Чтобы получить MY_APP_ID и MY_APP_SECRET нужно перейти на страницу https://developers.facebook.com/apps/ и создать приложение.
- После того, как вы создадите приложение нужно в боковом меню зайти на вкладку Settings -> Basic. На этой вкладке находится App ID и App Secret соответственно. Чтобы увидеть App Secret — нужно нажать кнопку Show.
- После этого нужно получить MY_LONG_LIVED_ACCESS_TOKEN. Для этого нужно нажать кнопку «+» возле пункта Products бокового меню. Найти блок Marketing API и нажать в нем кнопку Set Up.
- После этого в боковом меню нужно перейти на вкладку Marketing API->Tools, поставить галочку возле пункта ads_read и нажать кнопку Get Token. Вы получите обычный TOKEN, который надо обменять на долгосрочный.
- Для этого нужно подставить в эту ссылку свои значения (все они получены на предыдущих шагах) и перейти по этой ссылке:
https://graph.facebook.com/v5.0/oauth/access_token?grant_type=fb_exchange_token&client_id={MY_APP_ID}&client_secret={MY_APP_SECRET}&fb_exchange_token={TOKEN}
Подробнее об этом способе получения долгосрочного токена можно прочитать здесь. - Если вы правильно составили ссылку, то перейдя по ней увидите access_token. Значение в кавычках рядом с этим ключом и есть MY_LONG_LIVED_ACCESS_TOKEN, который нужно указать в конфигурациях кода.
- AD_ACCOUNT_ID можно найти в ссылке, при работе с рекламным аккаунтом Facebook. Он находится в URL-параметре act. Или в выпадающем списке рекламных аккаунтов (см. скриншот).
- Дальше нужно создать проект в Google Cloud. Для этого нужно перейти по ссылке: https://console.cloud.google.com/projectcreate .
- Потом в боковом меню перейти на вкладку «APIs & Services», нажать кнопку « + ENABLE APIS AND SERVICES», найти блок Google Analytics API, перейти в него и нажать кнопку ENABLE.
- После этого осталось создать сервисный аккаунт. Для этого в боковом меню нужно перейти в пункт IAM & admin -> Service accounts. Потом нужно нажать кнопку «+ CREATE SERVICE ACCOUNT». На первом шаге указать имя (например «fb_cost_to_ga») и нажать кнопку Create. На втором шаге указать роль Project -> Viewer и нажать Continue. На третьем шаге нажать «+ CREATE KEY», выбрать Key Type JSON и нажать Create. Скачается файл ключа сервисного аккаунта. После этого нужно нажать кнопку Done, скопировать Email сервисного аккаунта и добавить этот имейл в качестве пользователя с правами на изменение на уровне ресурса Google Analytics, в который нужно импортировать расходы.
- Скачанный файл с предыдущего шага нужно загрузить в PythonAnywhere. Для этого нужно в этом сервисе перейти на вкладку Files, нажать кнопку «Upload a file», найти скачанный ранее файл и загрузить его. После этого осталось скопировать название этого файла, вместе с расширением .json и указать в качестве PATH_TO_SERVICE_ACCOUNT_KEY конфигураций скрипта (например, rare-lattice-258910-c92131d52661.json).
- GA_PROPERTY_ID — идентификатор отслеживания Google Analytics, который можно найти на вкладе Property Settings, админ панели GA. На этом же уровне настроек ресурса нужно было добавить email сервисного аккаунта в список пользователей GA.
- GA_DATA_SET_ID нужно скопировать из интерфейса GA, предварительно создать набор данных для импорта. Инструкция по созданию есть здесь.
- Заменив все конфигурации на свои, нужно выполнить код мануально, чтобы убедиться что он работает и в нем нет ошибок. Для этого откройте свой файл и нажмите синюю кнопку Run.
- Если скрипт сработал без ошибок — вы увидите результат загрузки файла в GA.
- Осталось поставить скрипт на автоматическое выполнение. Для этого откройте вкладку Tasks, укажите время запуска скрипта (обратите внимание, строчкой выше отображается часовой пояс сервера, именно по этому времени будет запускаться скрипт) и путь к файлу вашего скрипта. Если вы создавали его в корневой папке, путь будет таким: /home/<ВАШ_ЛОГИН>/fb_cost_to_ga.py . После этого остается только нажать кнопку Create.
Это решение имеет ряд недостатков:
- PythonAnywhere в бесплатной версии имеет много ограничений. Например, можно выполнять код максимум 100 секунд и хранить файлов не более чем на 500 мб. Этих ограничений достаточно, чтобы любому маленькому и среднему бизнесу решать задачу по импорту своих расходов. Если все таки ограничения этого сервиса не позволяют решить эту задачу — можно сделать аналогичное решение на базе Google Cloud.
- Tasks в PythonAnywhere работают три месяца, с момента их создания. Для продливания этого времени нужно хотя бы раз в 3 месяца заходить на эту вкладку и нажимать кнопку Extend Expiry.
- Long-Lived Access Token Facebook API живет 60 дней. Поэтому раз в 2 месяца, нужно заходить и проходить пункты 8, 9, 10 еще раз, обновляя MY_LONG_LIVED_ACCESS_TOKEN.
- Так же, сами рекламные сервисы, в данном случае Facebook, может пересчитывать данных по расходам ретроспективно. Из-за этого расходы в GA могут отличаться от тех, которые будет показывать Facebook в рекламном кабинете. Но этого можно избежать, если переделать алгоритм загрузки расходов в GA прямо в коде fb_cost_to_ga.py.
- Данные импортируются в той валюте, в которой они отображаются в Facebook. Но можно найти бесплатный API (например, этот), чтобы получать данные о курсах валют и конвертировать их перед импортом.
- Это решение импортирует расходы только на уровень источника (facebook), канала (cpc) и кампании. При чем для правильного матчинга данных названия Facebook Ads кампаний должны совпадать со значениями, которые передаются в параметр utm_campaign для ссылок из этих кампаний.
Добрый день, подскажите пожалуйста, можно ли как то реализовать, например, чтобы в в гугл таблицу выводить название аккаунта с бизнес менеджера, его лимит затрат и сумму расходов?
ОтветитьУдалитьДобрый день) Я никогда не решал такую задачу)
УдалитьДмитрий, здравствуйте, спасибо за инструкцию! всё получилось, файл с расходами появился в разделе импорта данных, но эти данные не отразились в отчете Кампании=>Анализ расходов. Для этого нужно что-то дополнительно сделать или это и не предполагается? Если нет, в чем-то тогда практический смысл такой выгрузки?)
ОтветитьУдалитьА нет, долетело Анализа расходов на пару часов попозже!%)
УдалитьОтлично :)
УдалитьОбратите внимание на сервис garpun feeds там бесплатно и без питона можно
ОтветитьУдалитьКруто, спасибо) Не знал о существовании такого сервиса)
УдалитьНо вроде бы загрузка расходов в Google Analytics не поддерживается в Free пакете: https://garpun.com/planes
УдалитьФиг знает, я настроил )))) Там правда через BigQuery, но он у меня есть. Итоговая схема следующая - заливаете данные рекламных кабинетов в BQ (тоже потоками), а оттуда уже потоком BQ -> GA загружаете данные. Может не супер удобно может показаться, зато кастомизировать можно очень просто под клиентов, так как utm можно на этапе запроса в BQ поменять
УдалитьПрикольно) Спасибо за информацию!
УдалитьПожалста! Вообще у них там много прикольного из фич, можете саппорт попытать - они быстро отвечают, может даже помогут донастроить что-то
УдалитьSomething wrong... argument should be integer or bytes-like object, not 'str'
ОтветитьУдалить____
pythonanywhere выдает такую ошибку) где я мог сделать ошибку?)
Поэтому я люблю сервисы, где кто-то решает за меня такие проблемы и я экономлю время =)
УдалитьТолько что проверил код — все ок)
УдалитьМожет быть у вас нет данных о расходах за вчерашний день, может где-то что-то сделали «не по инструкции»)
Denys, не получилось разобраться, в чем ошибка?
УдалитьУ меня все то же самое, argument should be integer or bytes-like object, not 'str'
Но эта ошибка возникает, только если запускать через сервис. Тот же код на десктопном питоне прекрасно работает. Файл расходов формируется и через сервис, ошибку выдает функция build. Только как это исправить, не понимаю. И идеи закончились
Привет, тоже столкнулся с этой ошибкой "should be integer or bytes-like object, not 'str' " , Дмитрий, вы упомянули возможную проблему в отсутствии расходов, в моем случае это так, но расходы есть за прошлый месяц, возможно ли в этом скрипте задать определенные даты, чтобы проверить эту гипотезу?
УдалитьВы можете попробовать вытащить расходы за какую-то определенную дату, для этого нужно эту строку:
Удалитьyesterday = yesterday.strftime('%Y-%m-%d')
переписать так:
yesterday = '2019-11-25'
, где 2019-11-25 — дата, за которую вы хотите загрузить данные о расходах в GA
Доброго дня! Вот такую ошибку выдает на шаге 19 (данные в GA не загружает):
ОтветитьУдалитьTraceback (most recent call last):
File "/home/marketingprobusiness/fb_cost_to_ga.py", line 13, in
import numpy as np
File "/usr/lib/python3.8/site-packages/numpy/__init__.py", line 142, in
from . import core
File "/usr/lib/python3.8/site-packages/numpy/core/__init__.py", line 17, in
from . import multiarray
File "/usr/lib/python3.8/site-packages/numpy/core/multiarray.py", line 14, in
from . import overrides
File "/usr/lib/python3.8/site-packages/numpy/core/overrides.py", line 16, in
add_docstring(
RuntimeError: implement_array_function method already has a docstring
>>>
Как это можно исправить?
Могу ошибаться, но кажется у вас не установлен пакет numpy. Попробуйте установить пакет в терминале (консоли) командой:
Удалитьpip install numpy
или в случае Python 3:
pip3 install numpy
Код отлично работает из Пайчарма, но с этого сайта отрабатывать отказывается.
ОтветитьУдалитьОшибки:
argument should be integer or bytes-like object, not 'str'
и
RuntimeError: implement_array_function method already has a docstring
Отличная инструкция для тех, кто хочет автоматизировать импорт данных о расходах с Facebook Ads в Google Analytics с использованием Python! Несмотря на ограничения бесплатной версии PythonAnywhere и необходимость обновлять токен доступа каждые 60 дней, предложенный подход помогает решить задачу для малого и среднего бизнеса. Если хотите узнать больше о возможностях Facebook рекламы и эффективного её использования, рекомендую изучить этот подробный гайд.
ОтветитьУдалить