Расход за сентябрь уже зафиксирован, а число конверсий в отчёте выросло после закрытия месяца. Это ожидаемо, если часть людей совершила целевое действие через несколько дней после клика и система отнесла результат к дате рекламного взаимодействия. Отчёт также может меняться из-за обработки данных и поздних корректировок.
Чтобы закрывать период без споров, храните два времени: дату рекламного взаимодействия и дату самой конверсии. Для каждого месячного отчёта сохраняйте несколько снимков с точным временем выгрузки и одним набором настроек.
Почему число продолжает меняться
У изменения есть три разных причины.
Данные ещё обрабатываются. 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. Зафиксируйте состав отчёта
Сохраните аккаунт, часовой пояс, период, кампании, цели, модель атрибуции, валюту и названия колонок. Для Беларуси укажите, является ли расход исходным 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.csv3. Считайте дельту между версиями
Сравните расход, конверсии и ценность конверсий по одному ключу кампании. Отдельно покажите:
- новые конверсии сентябрьской когорты;
- изменения расходов или кликов;
- удалённые либо скорректированные значения;
- дату, после которой показатель считается достаточно зрелым для решения.
Если выросли только конверсии, а расход и клики не изменились, это согласуется с обычным 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.00sample-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. Источники и фактические утверждения проверены при подготовке.
Что думаете?
Загружаем комментарии…