Запуски кампаний начинаются не в панели управления. Они начинаются в таблице, которой кто-то поделился в Slack. URL-адреса живут в колонке А, UTM-метаданные заполняют колонки с B по G, слаги находятся в колонке H, а в брифе сказано, что запуск завтра. Самая медленная часть процесса - копирование каждой строки в интерфейс сокращателя по одной ссылке за раз. Не потому, что это технически сложно, а потому, что нет причин делать это именно так.
Этот пост посвящен прямому рабочему процессу: как выглядит таблица, как она сопоставляется с эндпоинтом массового импорта Elido, трем путям импорта в зависимости от количества строк, шагу пробного запуска, который отлавливает ошибки до их попадания в продакшн, и фрагменту кода Apps Script, который автоматизирует все это по триггеру. Для более широкого контекста сквозной гигиены UTM основная статья о UTM-трекинге подробно описывает шаблоны рабочего пространства и серверную пересылку конверсий. Этот пост - часть этого пайплайна, посвященная переходу от таблицы к коротким ссылкам.
TL;DR#
- Ведите по одной таблице на кампанию:
target_url,slug,utm_source,utm_medium,utm_campaign,tagsв качестве именованных колонок. Пустые колонки UTM заполняются из вашего шаблона рабочего пространства. - Три пути импорта: вставка строк в интерфейс (до 1 000 строк), загрузка CSV (до 10 000 строк) или API через скрипт (неограниченно, повторяемо).
- Всегда сначала запускайте с
dry_run=true. Предварительный просмотр показывает итоговую короткую ссылку и полностью отрендеренную строку UTM-запроса без сохранения изменений. - Добавляйте префиксы к слагам кампаний (
q2-,jun-), чтобы разграничить пространства имен. Коллизии проявятся при пробном запуске, а не в середине импорта.
Структура таблицы#
Обязательными колонками являются target_url и одна из двух: slug или auto_slug. Все остальное необязательно, но имеет определенную интерпретацию при наличии.
| Колонка | Обязательно | Примечания |
|---|---|---|
target_url | да | Полный целевой URL, включая протокол |
slug | одна из двух | Предпочтительно - дает предсказуемые короткие URL |
auto_slug | одна из двух | Установите true, и Elido сгенерирует слаг |
utm_source | необязательно | Переопределяет значение из шаблона рабочего пространства |
utm_medium | необязательно | Переопределяет значение из шаблона рабочего пространства |
utm_campaign | необязательно | Переопределяет значение из шаблона рабочего пространства |
utm_content | необязательно | Обычно вариант креатива |
utm_term | необязательно | Платное ключевое слово или сегмент аудитории |
tags | необязательно | Разделенные запятыми, применяются к ссылке |
title | необязательно | Отображается в списке ссылок в панели управления |
Правило UTM простое: если target_url уже содержит параметры запроса ?utm_source= (или любые utm_*), эти значения передаются без изменений. Никакой перезаписи или слияния. Если в целевом URL нет UTM-параметров, Elido создает их из колонок UTM, используя шаблон вашего рабочего пространства для любых пустых колонок. Это важно на практике - некоторые команды используют заранее помеченные целевые URL для своего сервиса рассылок, и инструмент массового импорта, который незаметно перемечает их, ломает аналитику. Elido предупреждает о строках смешанного типа (некоторые UTM присутствуют, некоторые отсутствуют) и просит подтверждения.
Колонка тегов заслуживает отдельного упоминания. Значения представляют собой строки, разделенные запятыми: campaign:q2-spring, channel:paid-social, variant:hero-a. Такая трехчастная структура (dimension:value) дает вам фильтруемые оси в панели управления без необходимости отдельной настройки таксономии. Подробнее об этом в разделе о таксономии тегов ниже.
Три способа импорта#
Вставка строк в интерфейс массового импорта (до 1 000 строк)#
Для любого объема менее 1 000 строк самый быстрый путь - скопировать диапазон таблицы и вставить его в текстовое поле массового импорта. Интерфейс Elido автоматически распознает значения, разделенные табуляцией, при вставке из электронной таблицы и сопоставляет колонки по заголовкам. Вам не нужно экспортировать CSV; вы просто вставляете данные.
Это хорошо работает для самого распространенного случая: бриф кампании уже живет в Google Sheets, дедлайн запуска через час, и нет желания писать скрипты. Интерфейс показывает предварительный просмотр всех строк перед подтверждением (тот же dry-run, который вы получили бы через API) и позволяет исправить любые строки с ошибками прямо на месте перед продолжением.
Один нюанс: если в вашей таблице есть объединенные ячейки или сложное форматирование, вставка может привести к искажению данных. Надежный ход для любой таблицы с нетривиальной структурой - сначала скопировать данные на чистый лист (вставить как значения), а затем вставить очищенный диапазон в интерфейс импорта.
Загрузка CSV (до 10 000 строк)#
Для запусков с более чем 1 000 строк (большие каталоги, коды мероприятий, персонализированные ссылки) подходит путь загрузки CSV, который обрабатывает до 10 000 строк. Экспортируйте таблицу как CSV (Файл > Скачать > CSV) и загрузите ее в диалоговом окне импорта. Сопоставление заголовков колонок идентично; разница в том, что большие загрузки обрабатываются асинхронно и сообщают о своем статусе через вебхук или эндпоинт опроса.
Экспорт CSV из Google Sheets через API (доступ получен 12.05.2026) поддерживает экспорт именованного диапазона, а не всего листа, что полезно, когда в вашей таблице кампании несколько вкладок или строк заголовков, которые вы не хотите очищать вручную.
Вызов API из скрипта (более 10 000 строк или регулярные запуски)#
Для больших каталогов или для кампаний, которые запускаются еженедельно и требуют автоматизации того же процесса, правильным выбором будет путь через API. Две распространенные реализации: Apps Script (не требует локальных инструментов, работает в браузере) и Python (лучше подходит для команд с существующими пайплайнами данных). Эндпоинт в обоих случаях один и тот же.
curl -X POST \
https://api.elido.app/v1/links/bulk \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: multipart/form-data" \
-F "csv=@q2_spring_links.csv" \
-F "campaign_id=cmp_8a2f" \
-F "dry_run=false" \
-F "on_conflict=skip"
Параметр on_conflict контролирует, что происходит, когда слаг уже существует: skip оставляет существующую ссылку и записывает предупреждение, fail прерывает весь импорт при первой коллизии, а replace обновляет цель существующей ссылки. Для большинства импортов кампаний skip - правильный выбор по умолчанию: повторный запуск того же CSV не перезапишет уже созданные ссылки.
API принимает до 10 000 строк за один вызов. Для более крупных каталогов делайте импорт частями по 5 000 строк; каждый вызов независим и идемпотентен, если вы используете стабильные слаги.
Пробный запуск перед импортом (dry run)#
Запускайте каждый импорт с dry_run=true перед финальным подтверждением. Ответ идентичен живому импорту (для каждой строки показана итоговая короткая ссылка, распарсенная строка UTM-запроса, список тегов и любые предупреждения), но ничего не записывается в базу данных.
Что ловит dry-run, чего не поймать иначе до запуска:
- Слаг в строке 14, который конфликтует с существующей ссылкой в вашем рабочем пространстве (выводится как предупреждение о конфликте)
- Колонка UTM, которую случайно оставили пустой (Elido помечает отсутствие
utm_mediumкак предупреждение, а не критическую ошибку, но об этом стоит знать до запуска) target_urlс лишним пробелом в конце, который сохранился при копировании таблицы (итоговый URL в CSV выглядит нормально, но фактическая цель имеет добавленный%20)- Значения тегов, превышающие 32 символа (незаметно обрезаются; пробный запуск делает сохраненное значение видимым)
Ответ dry-run разбивается на страницы в том же формате, что и результат реального импорта. Откройте первую страницу, выборочно проверьте строку 2 (первую строку данных после заголовка) и последнюю строку. Затем посмотрите на любые строки с предупреждениями. Две минуты проверки избавляют от ошибок, которые иначе всплыли бы как «почему эта ссылка кампании выдает 404?» на следующее утро после запуска.
Конфликты слагов#
Конфликты слагов возникают, когда слаг, который вы пытаетесь импортировать, уже существует в вашем рабочем пространстве или на вашем пользовательском домене. Импорт выводит их в ответе dry-run с типом конфликта (same_workspace, same_domain, reserved) и целевым URL существующей ссылки.
Практическое решение - использование пространств имен. Добавляйте к слагам кампании короткий идентификатор: q2-, jun26-, sm- (для соцсетей), em- (для имейлов). Слаг типа q2-spring-hero-a вряд ли столкнется с чем-либо из предыдущей кампании. Префиксы также делают фильтрацию в панели управления очевидной - все ссылки с тегом q2-* принадлежат одному кварталу кампании.
Один случай, о котором стоит упомянуть: если вы переходите с другого сокращателя и хотите сохранить старые слаги, сначала импортируйте их без префиксов, а затем используйте префиксные слаги для нового контента кампании. Массовый импорт Elido сообщит вам при пробном запуске, если какие-либо из старых слагов конфликтуют с уже имеющимися в рабочем пространстве.
Таксономия тегов#
Теги, примененные во время импорта, получают ту же трехчастную структуру, что и колонки таблицы: campaign:q2-spring, channel:email, variant:hero-a. Когда вы позже откроете панель управления и отфильтруете по channel:email, вы не будете просеивать произвольные текстовые строки - вы будете запрашивать согласованную таксономию.
Названия измерений (campaign, channel, variant) берутся из соглашений вашей команды, а не из какой-либо схемы, навязанной Elido. Ограничение заключается в формате: двоеточие в качестве разделителя, отсутствие пробелов в ключе, значения менее 32 символов. Команды, которые обеспечивают это в таблице (колонка tags, которую формула собирает как "campaign:"&E2&", channel:"&F2), никогда не имеют проблем с некорректными тегами в панели управления. Команды, позволяющие колонке тегов быть произвольным текстом, сталкиваются с проблемой очистки данных уже через три кампании.
В обзоре функций кампаний группировка на основе тегов является основным способом, которым Elido группирует клики по измерениям кампании в аналитической панели - так что таксономия, которую вы определите в таблице, станет таксономией, по которой вы будете фильтровать отчеты.
Автоматизация через Apps Script#
Для команд, которые еженедельно запускают одну и ту же структуру кампании (ссылки на рассылку, ссылки для платной рекламы, варианты электронных писем), правильным решением будет полная автоматизация импорта. Google Apps Script работает в браузере, имеет доступ к данным таблицы и может запускаться по триггеру времени или при отправке формы.
Схема такая: срабатывает триггер, скрипт считывает любые строки таблицы, у которых нет значения short_link в колонке I, отправляет их (POST) в API массового импорта и записывает созданные короткие ссылки обратно в колонку I. При следующем срабатывании триггера уже импортированные строки пропускаются, так как колонка I заполнена.
// Google Apps Script - массовый импорт новых строк через Elido API
// Триггер: по времени, каждый час (или при отправке формы)
// Документация: https://developers.google.com/apps-script/guides/triggers (доступ 12.05.2026)
function importNewLinks() {
const sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Q2 Spring");
const data = sheet.getDataRange().getValues();
const headers = data[0];
const urlCol = headers.indexOf("target_url");
const slugCol = headers.indexOf("slug");
const srcCol = headers.indexOf("utm_source");
const medCol = headers.indexOf("utm_medium");
const campCol = headers.indexOf("utm_campaign");
const tagsCol = headers.indexOf("tags");
const doneCol = headers.indexOf("short_link"); // записываем результат сюда
const newRows = [];
const rowIndexes = [];
for (let i = 1; i < data.length; i++) {
const row = data[i];
if (!row[urlCol] || row[doneCol]) continue; // пропускаем пустые или уже импортированные
newRows.push({
destination: row[urlCol],
slug: row[slugCol] || undefined,
utm_source: row[srcCol] || undefined,
utm_medium: row[medCol] || undefined,
utm_campaign: row[campCol] || undefined,
tags: row[tagsCol]
? String(row[tagsCol])
.split(",")
.map((t) => t.trim())
: [],
});
rowIndexes.push(i);
}
if (!newRows.length) return;
const payload = JSON.stringify({
links: newRows,
campaign_id: "cmp_8a2f",
on_conflict: "skip",
});
const resp = UrlFetchApp.fetch("https://api.elido.app/v1/links/bulk", {
method: "post",
contentType: "application/json",
headers: {
Authorization:
"Bearer " +
PropertiesService.getScriptProperties().getProperty("ELIDO_TOKEN"),
},
payload: payload,
muteHttpExceptions: true,
});
const result = JSON.parse(resp.getContentText());
const created = result.links || [];
// Записываем короткие ссылки обратно в колонку I
created.forEach((link, idx) => {
if (!link.short_url) return;
const sheetRow = rowIndexes[idx] + 1; // 1-индексация
sheet.getRange(sheetRow, doneCol + 1).setValue(link.short_url);
});
}
Несколько примечаний по реализации:
Храните токен API в PropertiesService.getScriptProperties(), а не прописывайте его жестко в скрипте. Документация по триггерам Apps Script (доступ 12.05.2026) охватывает настройку как триггеров по времени, так и триггеров по событиям. Для таблицы кампании, которую команда заполняет совместно, триггер onEdit срабатывает при заполнении колонки A; короткая ссылка появляется в колонке I в течение нескольких секунд после ввода целевого URL.
Флаг muteHttpExceptions: true важен. Без него ошибка 422 от API вызовет исключение на уровне скрипта, и триггер перестанет делать повторные попытки. С ним вы получите тело ошибки и сможете его залогировать.
Для более серьезной интеграции (скрипт на Python, шаг CI, который читает таблицу через Sheets API, или запланированная задача в вашем существующем пайплайне данных) эндпоинт Sheets API spreadsheets.values.get (доступ 12.05.2026) отдает вам JSON напрямую. Оттуда структура вызова массового импорта идентична примеру с curl выше.
Распространенные ошибки#
Лишние пробелы в слагах. Слаг, скопированный из ячейки таблицы, может иметь невидимый пробел в конце. Elido допускает это (слаг технически валиден), но go.example.com/q2-promo с пробелом - это некрасивый URL, а копирование из адресной строки браузера обычно отсекает его, так что человек, который вставит ссылку позже, получит 404. Решение - формула =TRIM(H2) для колонки слага перед экспортом.
Отсутствие utm_medium. Elido предупреждает, но не блокирует импорт при отсутствии utm_medium, так как в некоторых кампаниях его намеренно пропускают. Но отсутствие медиума почти всегда является ошибкой: GA4 направляет все, что его не имеет, в канал (none), что делает атрибуцию по каналам бесполезной. Канонический справочник компоновщика URL GA4 (доступ 12.05.2026) указывает utm_medium как обязательный параметр для корректной атрибуции кампании. Если в вашем шаблоне рабочего пространства есть значение по умолчанию для utm_medium, пустые ячейки унаследуют его; если нет - предупреждение dry-run ваш последний шанс это исправить.
Значения тегов длиннее 32 символов. Elido незаметно обрезает значения тегов, превышающие 32 символа. Обрезка незаметна в предупреждениях dry-run, если не приглядываться (в ответе показано сохраненное значение, а не исходное). Длинные теги обычно появляются при вставке названий UTM-кампаний в колонку тегов: spring-2026-dach-email-reactivation-week3 состоит из 42 символов и превратится в spring-2026-dach-email-reactivation-we в панели управления. Делайте значения измерений тегов короткими; переместите подробные метаданные в заголовок ссылки.
Забытый dry_run=true при повторных запусках. Если вы повторно запускаете загрузку CSV для кампании, в которой уже есть ссылки, on_conflict=skip безопасен, но on_conflict=replace обновит целевые URL для любого слага, который есть и в старом, и в новом CSV. В кампании, где целевые URL не менялись, это безвредно. В кампании, где вы обновили URL лендингов в середине работы, это именно то, что вам нужно. Определитесь с режимом до подтверждения.
Резюме: от настройки до запуска#
Самая полная версия этого рабочего процесса: создайте таблицу один раз со стабильными названиями колонок, определите шаблон UTM рабочего пространства, чтобы пустые колонки UTM наследовали разумные значения по умолчанию (описано в setup-branded-short-links), запустите пробный импорт для отлова конфликтов и предупреждений, подтвердите импорт и напишите триггер Apps Script, чтобы следующая кампания требовала ноль ручных действий.
Что касается уровня атрибуции, который замыкает цикл после клика, статья серверный трекинг конверсий описывает, как пробросить click_id из ответа редиректа Elido в Meta CAPI и GA4 - серверную часть, которая выживает после Safari ITP и вмешательства блокировщиков рекламы. Тот пост и этот вместе дают полную картину рабочего процесса маркетологов: от таблицы до короткой ссылки и атрибутированной конверсии.
Весь функционал управления URL-адресами кампаний - шаблоны, массовый импорт, группировка кампаний, пересылка конверсий - находится на странице функций кампаний.
Попробуйте Elido
Вставьте URL - получите короткую ссылку
Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.
Бесплатно, без регистрации · 2 в день