СтатьяАналитикаРеклама

Почему конверсии прошлого месяца продолжают меняться

Как закрыть рекламный период: разделить дату клика и конверсии, сохранить снимки отчёта и объяснить изменение CPL из-за задержки результата.

Два бумажных отчёта за один месяц соединены временной линией; на втором снимке стало больше отметок конверсий.

Расход за сентябрь уже зафиксирован, а число конверсий в отчёте выросло после закрытия месяца. Это ожидаемо, если часть людей совершила целевое действие через несколько дней после клика и система отнесла результат к дате рекламного взаимодействия. Отчёт также может меняться из-за обработки данных и поздних корректировок.

Чтобы закрывать период без споров, храните два времени: дату рекламного взаимодействия и дату самой конверсии. Для каждого месячного отчёта сохраняйте несколько снимков с точным временем выгрузки и одним набором настроек.

Почему число продолжает меняться

У изменения есть три разных причины.

Данные ещё обрабатываются. Google Ads пишет, что статистика доступна с задержкой. Для конверсий срок зависит от источника и модели атрибуции: импортированные из Google Analytics результаты и данные других моделей могут появляться позже обычных кликов и расходов.

Конверсия произошла позже клика. Человек мог перейти по объявлению 29 сентября, а купить 3 октября. В стандартной отчётности Google Ads атрибутированный результат относится к времени показа или клика. Поэтому сентябрьская строка получает новую конверсию уже в октябре. Google называет такой разрыв conversion lag и предупреждает: свежий CPA может выглядеть выше, а ROAS — ниже итогового.

Система пересчитала прошлые данные. Google указывает среди причин поздних изменений удаление недействительного трафика, запоздавшие конверсии и отдельные корректировки расчётов. Такой пересчёт нужно отличать от обычного дозревания пользователей.

Две даты отвечают на разные вопросы

В Google Ads можно добавить столбцы Conversions (by conv. time) и Conv. value (by conv. time). Они группируют результат по времени конверсии. Обычный столбец Conversions отвечает на вопрос, сколько конверсий получила когорта рекламных взаимодействий выбранного периода.

ПредставлениеЧто попадает в сентябрьДля чего использовать
По времени клика или показаконверсии, отнесённые к сентябрьским взаимодействиям, даже если действие произошло позжеоценка рекламы и когортный CPL
По времени конверсиидействия, которые произошли в сентябрекалендарный поток заявок и сверка с CRM
По времени загрузкивремя технической передачи записиконтроль интеграции; Google Ads не строит по нему стандартный отчёт о конверсиях

Эти представления нельзя сводить в одну колонку без подписи. В одном случае сентябрь — месяц привлечения, в другом — месяц результата.

Учебный пример: один расход, два снимка

Условная кампания потратила в сентябре 600 BYN. Шесть лидов кликнули по рекламе 27–30 сентября. Два совершили конверсию до конца месяца, ещё четыре — 1, 3, 5 и 7 октября.

В снимке 1 октября в 07:00 видны две конверсии сентябрьской когорты, поэтому предварительный CPL равен 300 BYN. В снимке 8 октября видны все шесть, CPL этой же когорты равен 100 BYN. Расход не изменился; созрела часть людей, привлечённых в сентябре.

Два снимка сентябрьского отчёта: 1 октября видно 2 конверсии и CPL 300 BYN, 8 октября — 6 конверсий и CPL 100 BYN при расходе 600 BYN.

Учебные цифры показывают механику задержки. Они не описывают реальную кампанию и не задают нормальный срок дозревания для любого бизнеса.

По календарной дате конверсии результат распределяется иначе: две конверсии относятся к сентябрю, четыре — к октябрю. Обе таблицы правильны, если в заголовке указан принцип даты.

Как закрывать рекламный месяц

1. Зафиксируйте состав отчёта

Сохраните аккаунт, часовой пояс, период, кампании, цели, модель атрибуции, валюту и названия колонок. Для Беларуси укажите, является ли расход исходным BYN или пересчитанным значением. Если отчёт собирается из разных валют, используйте отдельный проверяемый порядок пересчёта.

2. Разделите предварительный и созревший снимок

Первую выгрузку после конца месяца пометьте как предварительную. Следующие снимки делайте по заранее выбранному правилу: например, через неделю и после обычного для бизнеса срока до конверсии. Универсального числа дней нет; опору ищут в отчёте Days to conversion и в фактическом цикле сделки.

Не переписывайте старый файл. Имя должно содержать период данных и время снимка:

google_ads_2026-09_snapshot_2026-10-01T07-00+03.csv
google_ads_2026-09_snapshot_2026-10-08T09-00+03.csv

3. Считайте дельту между версиями

Сравните расход, конверсии и ценность конверсий по одному ключу кампании. Отдельно покажите:

  • новые конверсии сентябрьской когорты;
  • изменения расходов или кликов;
  • удалённые либо скорректированные значения;
  • дату, после которой показатель считается достаточно зрелым для решения.

Если выросли только конверсии, а расход и клики не изменились, это согласуется с обычным conversion lag. Изменение расходов требует отдельного объяснения: поздней обработки, корректировки или ошибки выгрузки.

4. Используйте один срез для одного решения

Для оценки кампаний сравнивайте когорты кликов одинаковой зрелости. Для загрузки отдела продаж считайте конверсии по календарной дате. Для финансовой сверки используйте оплаты и возвраты из учётной системы с её правилами закрытия периода.

В итоговом отчёте можно держать обе колонки, но подписи должны объяснять дату. Формулировка «в сентябре получили 6 лидов» двусмысленна без уточнения.

Воспроизводимый журнал снимков

Ниже приведён полный close_conversion_period.py. Скрипт принимает время снимка, строит когортный CPL по месяцу клика и календарное распределение по месяцу конверсии. Сохраните также два учебных CSV из блоков после кода.

python close_conversion_period.py \
  --costs sample-costs.csv \
  --conversions sample-conversions.csv \
  --as-of 2026-10-01T07:00:00+03:00

Полный исходник close_conversion_period.py:

#!/usr/bin/env python3
"""Build click-cohort and conversion-calendar snapshots from CSV files."""

from __future__ import annotations

import argparse
import csv
import json
from collections import Counter
from datetime import datetime
from decimal import Decimal, ROUND_HALF_UP
from pathlib import Path


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser()
    parser.add_argument("--costs", required=True, type=Path)
    parser.add_argument("--conversions", required=True, type=Path)
    parser.add_argument("--as-of", required=True)
    parser.add_argument("--output", type=Path)
    return parser.parse_args()


def load_costs(path: Path) -> dict[str, Decimal]:
    with path.open(encoding="utf-8", newline="") as handle:
        return {
            row["click_month"]: Decimal(row["cost_byn"])
            for row in csv.DictReader(handle)
        }


def load_visible_conversions(path: Path, cutoff: datetime) -> list[dict[str, str]]:
    with path.open(encoding="utf-8", newline="") as handle:
        rows = list(csv.DictReader(handle))
    return [row for row in rows if datetime.fromisoformat(row["available_at"]) <= cutoff]


def main() -> None:
    args = parse_args()
    cutoff = datetime.fromisoformat(args.as_of)
    costs = load_costs(args.costs)
    rows = load_visible_conversions(args.conversions, cutoff)

    by_click = Counter(row["click_at"][:7] for row in rows)
    by_conversion = Counter(row["conversion_at"][:7] for row in rows)

    cohorts = []
    for month, cost in sorted(costs.items()):
        conversions = by_click[month]
        cpl = None
        if conversions:
            cpl = (cost / conversions).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
        cohorts.append({
            "click_month": month,
            "cost_byn": str(cost.quantize(Decimal("0.01"))),
            "conversions": conversions,
            "cpl_byn": str(cpl) if cpl is not None else None,
        })

    result = {
        "as_of": cutoff.isoformat(),
        "visible_conversion_ids": [row["lead_id"] for row in rows],
        "click_cohorts": cohorts,
        "conversion_calendar": dict(sorted(by_conversion.items())),
    }
    rendered = json.dumps(result, ensure_ascii=False, indent=2) + "\n"
    if args.output:
        args.output.write_text(rendered, encoding="utf-8")
    print(rendered, end="")


if __name__ == "__main__":
    main()

sample-costs.csv:

click_month,cost_byn
2026-09,600.00

sample-conversions.csv:

lead_id,click_at,conversion_at,available_at
L001,2026-09-27T10:15:00+03:00,2026-09-27T10:28:00+03:00,2026-09-27T11:00:00+03:00
L002,2026-09-28T12:20:00+03:00,2026-09-29T09:40:00+03:00,2026-09-29T10:05:00+03:00
L003,2026-09-29T16:05:00+03:00,2026-10-01T18:00:00+03:00,2026-10-01T18:30:00+03:00
L004,2026-09-29T17:45:00+03:00,2026-10-03T14:10:00+03:00,2026-10-03T14:35:00+03:00
L005,2026-09-30T08:30:00+03:00,2026-10-05T11:25:00+03:00,2026-10-05T11:50:00+03:00
L006,2026-09-30T19:10:00+03:00,2026-10-07T15:15:00+03:00,2026-10-07T15:40:00+03:00

Повторный запуск со снимком 8 октября показывает, какие записи появились позже. Для рабочего отчёта выгружайте стабильный ID конверсии, дату клика, дату действия и время, когда запись стала доступна. Идентификатор нужен, чтобы отличить новую запись от дубля; порядок проверки дублей разобран в статье «Почему одна заявка превращается в две конверсии».

Скрипт работает с учебным CSV и не подключается к рекламному аккаунту. Он проверяет арифметику и принцип дат, но не подтверждает настройки цели и атрибуцию площадки.

Когда изменение требует расследования

Обычная задержка объясняет появление результата после рекламного взаимодействия. Следующие случаи требуют отдельной проверки:

НаблюдениеЧто проверить
вырос расход закрытого периодакорректировки, недействительный трафик, валюту и состав выгрузки
конверсии изменились после смены целивключённые Primary-действия и историю настроек
один lead_id появился несколько разповтор тега, импорт и правило подсчёта One или Every
дата конверсии не совпадает с CRMчасовые пояса, формат времени и момент бизнес-события
старые конверсии появились после загрузки CRMдату действия, время загрузки и ошибки импорта

Пограничные часы сначала нормализуйте по инструкции о расхождении часовых поясов. Ноль, пустое поле и ещё не созревший результат разделены в материале о неизвестных конверсиях.

Как принять месячный отчёт

Отчёт готов к управленческому решению, когда указаны:

  • дата рекламного взаимодействия и дата результата;
  • точное время каждого снимка;
  • зрелость сравниваемых периодов;
  • неизменный набор целей, кампаний и колонок;
  • дельта между предварительной и последней версией;
  • правило, по которому период больше не пересчитывают автоматически.

После этого рассчитывайте CPL по одному набору конверсий и расходов. Базовая формула и границы показателя есть в ответе «Как рассчитать стоимость лида». Сохранённые снимки позволяют объяснить изменение числа без догадок: видно, какая запись добавилась, к какому клику она относится и когда стала доступна в отчёте.

Источники

Материал подготовлен редакцией WiseLab с помощью AI. Источники и фактические утверждения проверены при подготовке.

Загружаем рейтинг…

Насколько полезен материал?

Выберите оценкуСлева — меньше пользы, справа — больше

Загружаем вашу оценку…

Что думаете?

Загружаем комментарии…

СЛЕДУЮЩИЙ ШАГ

Что ещё поможет в этой задаче