Только синтетические данные. Реальные данные клиентов не загружать. CSV: UTF-8, разделитель ;, даты YYYY-MM-DD, десятичный разделитель точка. Заявки: lead_id;date;campaign;status;amount Реклама: date;campaign;spend Кампании: search, social. Статусы: new, qualified, won, lost. qualified = статусы qualified + won. revenue = сумма amount у won, НЕ прибыль и НЕ подтверждённые поступления. CPL = расходы / число заявок. CAC = расходы / won. ROAS = сумма won / расходы. При нулевом знаменателе показывается «—». Фильтр даты использует дату создания заявки и дату расхода. Это упрощённая демонстрационная модель, не полноценная атрибуция. Каждая загрузка заменяет снимок источника, а не добавляет строки. Данные сбрасываются при обновлении страницы. Нет базы, серверных загрузок, хранения или внешних отправок. Совпадающий дубль пропускается; конфликт по одному ключу отклоняет весь файл. Некорректные строки пропускаются с явным предупреждением и отчётом ошибок. Ограничения демо: только CSV, до 200 КБ на файл, до 5 000 строк. XLSX и лимиты производственного пакета не реализованы. leads-with-errors.csv содержит один одинаковый дубль и три неверные строки. expected.json содержит контрольные результаты без фильтров.