На моем сайте работает GA4, и в моем бэкэнде я храню client_id и session_id пользователя. Используя протокол измерения на нашем серверном сервере, я отправляю событие начала пользовательской пробной версии, когда пользователь запускает пробную версию, и отправляю событие оплаты пользовательской подписки, когда пользователь платит за полный месяц. Оба этих события используют одну и ту же функцию в моем коде, поэтому я знаю, что между ними ничего не меняется:
# sends google analytics event
def send_ga4_event(event_name, customer_id):
measurement_id = os.getenv("GA_MEASUREMENT_ID")
api_secret = os.getenv("GA_MP_SECRET")
ga_debug_mode = os.getenv("GA_DEBUG_MODE") == "true"
user = get_user(stripe_id=customer_id, tag = "send_ga4_event")
if not user:
logging.warn("send_ga4_event: User doesn't exist in database")
return False
elif not user.stripe_email:
logging.warn("send_ga4_event: No stripe email associated with user")
return False
elif not user.ga_client_id:
logging.warn("send_ga4_event: No ga_client_id associated with user")
return False
if not user.ga_session_id:
logging.warn("send_ga4_event: No ga session id associated with user, continuing anyway.")
"""Send an event to GA4 with a hashed email."""
hashed_email = hashlib.sha256(user.stripe_email.lower().encode()).hexdigest()
params = {"debug_mode": ga_debug_mode}
if user.ga_session_id:
# logging.debug(f"send_ga4_event: USER {user}")
params["session_id"] = user.ga_session_id
event_data = {
"client_id": user.ga_client_id,
"user_id": hashed_email,
"non_personalized_ads": False,
"events": [{"name": event_name, "params": params}],
}
headers = {"Content-Type": "application/json"}
url = f"https://www.google-analytics.com/mp/collect?measurement_id = {measurement_id}&api_secret = {api_secret}"
response = requests.post(url, headers=headers, data=json.dumps(event_data))
if response.ok:
logging.debug(
f"send_ga4_event: event_name {event_name}, customer_id {customer_id}, email {hashed_email}, measure id {measurement_id}, api secret {api_secret} [{response.status_code}, {response.text}]"
)
return True
else:
logging.error(
f"send_ga4_event: event_name {event_name}, customer_id {customer_id}, email {hashed_email}, measure id {measurement_id}, api secret {api_secret} [{response.status_code}, {response.text}]"
)
return False
Когда я говорю, что атрибуция неверна, я имею в виду, что событие с оплаченной подпиской отображается в отчете о трафике в GA4 как «неназначенное». Первоначально эта проблема возникла и для событий, запущенных пробной версией, но как только я добавил session_id к событиям, он был правильно атрибутирован.
В отправляемых данных я отправляю их client_id, user_id (это их хешированный адрес электронной почты), а внутри «событий» я отправляю «session_id».
Прочитав документацию, у меня сложилось впечатление, что мне следует обновлять session_id и client_id, хранящиеся в нашем бэкэнде, каждый раз, когда они изменяются в их браузере. Документы звучат так, будто они должны связывать любые сеансы, продолжающиеся 90 дней. Время между запуском пробной версии и оплатой подписки составляет одну неделю, поэтому это не должно быть проблемой.
Кто-нибудь испытал это? если да, то как это исправить?





События можно отправлять для сеансов, срок действия которых истек, но метрики, связанные с сеансами, будут отображаться как «не заданы» в GA4, даже если они присутствуют в BigQuery.
Отправка события для сеанса, который завершился, скажем, более 3 дней назад, хотя оно учитывается в общем количестве событий и отображается в BigQuery, будет отображаться как «не установлено» для таких показателей, как целевая страница и источник/канал сеанса в отчетах GA4. Это связано с тем, что сеансы не могут принимать новые события после истечения их срока действия.
также вы можете проверить другие проблемы, связанные с атрибуцией, которая не работает на этом носителе: https://medium.com/@aliiz/navigating-measurement-protocol-challenges-and-elimination-not-set-issues-in-ga4- а-технический-7f01863649d6
В BigQuery вы можете создавать собственные атрибуции, недоступные в GA4. Это связано с тем, что протокол измерения (MP) GA4 и его настройки атрибуции изменить нельзя. Кроме того, 90-дневный период ретроспективного анализа в GA4 отличается от вашей конкретной проблемы. GA4 использует модель непрямой атрибуции «последний» для определения источника сеанса. 90-дневное окно — это максимальный период, который GA4 использует для анализа и определения источника/канала сеансов, независимо от того, отправляются ли они через протокол измерений или уровень данных.
Идентификатор сеанса — это временная метка начала сеанса на вашем веб-сайте. Таким образом, он меняется каждый раз, когда пользователь запускает сеанс на вашем сайте. Следует иметь в виду, что вы не можете отправлять события по протоколу измерений в течение 72 часов после начала сеанса.
Окно атрибуции по умолчанию составляет 90 дней для ключевого события, поэтому это не должно быть проблемой, если вы отправляете точные сведения о сеансе с каждым событием.
Вам следует проверить источник всего неназначенного трафика в отчете GA4. Мы также отправляем наше ключевое событие, то есть покупку, через протокол измерения. Наша полезная нагрузка имела один настраиваемый параметр с именем source, который, как оказалось, переопределял фактический источник сеанса значениями нашего сеанса с настраиваемыми параметрами. Поэтому убедитесь, что у вас нет чего-то подобного.
Интересный! В чем тогда решение? Могу ли я получить аналог отчета о трафике и получить правильную атрибуцию даже для событий, происходящих за неделю? Кроме того, я просто запутался, потому что GA4 говорит в своих документах, что первый источник будет правильно атрибутирован до 90 дней.