Массовый импорт Elido создаёт до 100 коротких ссылок за пакет из списка строк url, slug, title. Вы можете вставить строки из Google Sheets в панель управления, загрузить их как CSV или вызвать bulk API из Apps Script. UTM-теги - не отдельный столбец импорта: итоговый размеченный URL вы собираете в таблице, а Elido сохраняет его как адрес назначения.
Это уже, чем обещают некоторые учебники (включая более раннюю версию этого), поэтому здесь описано только то, что код делает сегодня. Если вы пришли за режимом dry run, флагами пропуска при конфликте или загрузкой на 10 000 строк - этого пока нет; они отслеживаются как запланированная работа и так и помечены ниже.
Более широкая картина по UTM - в опорной статье об отслеживании UTM: шаблоны и серверная передача конверсий. Эта статья - срез «от таблицы к коротким ссылкам».
Коротко
- Одна таблица на кампанию. Столбцы:
final_url(собирается формулой, UTM включены),slug,title. - Путь через панель управления: New link, затем вкладка Bulk (вставка) или CSV (загрузка). Обе принимают 100 ссылок за пакет.
- Путь через API:
POST /v1/links/bulkс JSON-телом до 100 элементов. Элементы принимаютdestination_url,slug,title,tags. - Каждая строка успешна или неудачна сама по себе. Занятый slug роняет только свою строку.
- Dry run пока нет (запланирован). Вместо него проверьте несколько строк после первого пакета.
Соберите таблицу
Elido читает для каждой ссылки три вещи: адрес назначения, slug, заголовок. Рабочие столбцы держите слева, а один выходной - справа.
| Столбец | Использует Elido | Примечания |
|---|---|---|
base_url | нет | Чистый URL целевой страницы |
utm_source, utm_medium, utm_campaign | нет | Входные данные формулы только в таблице |
final_url | да (адрес назначения) | Собирается формулой, см. ниже |
slug | да (необязательно) | Пусто - Elido сгенерирует сам |
title | да (необязательно) | Подпись в списке ссылок панели управления |
short_link | нет | Заполняется после импорта |
Формула final_url выполняет UTM-работу, которой Elido не делает:
=TRIM(A2) & IF(ISNUMBER(FIND("?", A2)), "&", "?")
& "utm_source=" & ENCODEURL(B2)
& "&utm_medium=" & ENCODEURL(C2)
& "&utm_campaign=" & ENCODEURL(D2)
У такого подхода есть побочная польза: адрес назначения, который вы проверяете, - это тот, что уходит в работу. Ничего не переписывается задним числом, а адрес, уже содержащий ?, дополняется через &, а не ломается.
Рекомендация самого Google - всегда задавать utm_source, utm_medium и utm_campaign при разметке URL; без них отчёты показывают «(not set)» (справка Google Analytics, по состоянию на 2026-10-09). Добавьте столбец проверки, например =IF(OR(B2="",C2="",D2=""),"missing UTM","ok"), и отфильтруйте по нему перед экспортом. Это заменяет предупреждение dry run, которое дают другие инструменты.
Путь 1: вставка в панель управления (вкладка Bulk)
Откройте New link и переключитесь на Bulk. В текстовое поле вводится по одной ссылке на строку:
https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-de, Hero DE
https://shop.example/fr?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-fr, Hero FR
Парсер делит каждую строку по запятым: первая часть - URL, вторая - slug, всё остальное - заголовок. Пустые строки и строки, начинающиеся с #, игнорируются. Для таблиц из этого следуют два вывода:
- Запятые внутри адреса назначения ломают строку. Если значение UTM содержит запятую, закодируйте её как
%2C(ENCODEURLв формуле выше уже это делает). - При вставке из Sheets ячейки разделены табуляцией, а не запятыми. Соберите по одной строке с запятыми на каждую строку таблицы во вспомогательном столбце, например
=E2 & ", " & F2 & ", " & G2, и скопируйте этот единственный столбец.
После импорта в диалоге показаны число созданных и число неудавшихся ссылок, а каждая неудавшаяся строка с причиной раскрывается ниже.
Путь 2: загрузка CSV (вкладка CSV)
Скачайте таблицу как CSV (File, Download, Comma-separated values) со столбцами в порядке url, slug, title и загрузите на вкладке CSV. Файл читается в вашем браузере и отправляется тем же пакетом из 100 ссылок, что и вкладка вставки. Если первая строка не начинается с http, она считается заголовком и отбрасывается.
Читалка CSV - это простое деление по запятым, а не полноценный CSV-парсер. Поля в кавычках, содержащие запятые, не распознаются, поэтому не используйте запятые в заголовках, иначе заголовок будет обрезан. Если строк больше 100, разбейте файл на части по 100.
Если бриф живёт в Excel, маршруты для него разобраны в статье как сократить URL в Excel.
Путь 3: API из Apps Script
Для таблицы, которая наполняется всю неделю, вызывайте API. Endpoint - POST https://api.elido.app/v1/links/bulk. Токен - это персональный токен доступа или API-ключ рабочего пространства, передаваемый как Authorization: Bearer ..., а ключ, привязанный к рабочему пространству, позволяет опустить в вызове workspace_id и domain_id (используется домен рабочего пространства по умолчанию). Аутентификация описана в документации API в разделе Authentication.
curl -X POST https://api.elido.app/v1/links/bulk \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "destination_url": "https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring",
"slug": "q2-hero-de", "title": "Hero DE", "tags": ["q2-spring", "email"] }
]
}'
Ответ содержит ok, failed и массив items с одной записью на каждую входную строку, по порядку, каждая помечена ok или error. Уже занятый slug возвращает slug already exists for this domain только в своей строке. Заголовок Idempotency-Key учитывается 24 часа: тот же ключ с тем же телом воспроизводит исходный ответ, а не создаёт ссылки дважды (см. Idempotency в документации API).
Каждая созданная ссылка также ставится в очередь на асинхронную проверку безопасности, поэтому массовый импорт не ждёт сканер.
// Google Apps Script: send new sheet rows to Elido's bulk endpoint.
// Trigger: time-driven, hourly. Batches of 100 (the API maximum).
function importNewLinks() {
const sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Q2 Spring");
const data = sheet.getDataRange().getValues();
const h = data[0];
const urlCol = h.indexOf("final_url");
const slugCol = h.indexOf("slug");
const titleCol = h.indexOf("title");
const doneCol = h.indexOf("short_link");
const pending = [];
for (let i = 1; i < data.length && pending.length < 100; i++) {
if (data[i][urlCol] && !data[i][doneCol]) pending.push(i);
}
if (!pending.length) return;
const links = pending.map((i) => ({
destination_url: data[i][urlCol],
slug: data[i][slugCol] || undefined,
title: data[i][titleCol] || undefined,
}));
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: JSON.stringify({ links }),
muteHttpExceptions: true,
});
if (resp.getResponseCode() !== 200) {
console.error(resp.getContentText());
return;
}
JSON.parse(resp.getContentText()).items.forEach((item) => {
const row = pending[item.index] + 1;
const cell = sheet.getRange(row, doneCol + 1);
cell.setValue(
item.status === "ok" ? item.link.slug : "ERROR: " + item.error,
);
});
}
Замечания к скрипту:
- Он записывает обратно slug (или текст ошибки), а не полный URL. Если нужны кликабельные ссылки, добавьте свой короткий домен в столбце с формулой. Строки с текстом ошибки в
short_linkпри следующем запуске пропускаются, поэтому очистите ячейку после исправления slug. - Храните токен в свойствах скрипта, а не в коде.
- Лимиты Apps Script для личных аккаунтов: 20 000 вызовов URL Fetch в сутки, 6 минут на выполнение и 90 минут работы триггеров в сутки (аккаунты Google Workspace: 100 000 вызовов, 6 часов) (квоты Apps Script, по состоянию на 2026-10-09). Почасовое задание, отправляющее по 100 ссылок за вызов, остаётся далеко ниже этого.
- Поверх этого действует лимит частоты запросов API Elido, на токен и на рабочее пространство; см. Rate Limits в документации API.
Slug и теги
Slug. Добавляйте префикс к slug кампаний (q2-, jun26-), чтобы они не пересекались со старыми ссылками. Конфликт сообщается для конкретной строки, а остальной пакет проходит, поэтому повторный запуск той же таблицы возвращает ошибки для уже существующих строк, а не создаёт дубликаты. Пустой slug заставляет Elido сгенерировать его самому.
Теги. Вкладки Bulk и CSV в панели управления теги не задают; API делает это через массив tags. Теги - обычные строки, так что соглашение dimension:value (channel:email) - просто привычка именования, которую вы обеспечиваете в таблице, например через ="channel:"&C2. О том, как кампании группируют клики, см. функцию кампаний.
Что ещё не построено
Это описывалось в более ранней версии статьи и сегодня в продукте отсутствует:
- Dry run - предпросмотр разрешённых ссылок и конфликтов до фиксации. Запланировано.
- Режимы конфликтов (пропуск, отказ, замена) для существующих slug. Запланировано; сегодня занятый slug - это ошибка на уровне строки.
- Столбцы UTM и шаблон UTM рабочего пространства, применяемый при импорте. Запланировано; используйте формулу таблицы выше.
- Более крупные пакеты (10 000 строк) и асинхронная загрузка с отчётом о статусе. Запланировано; лимит - 100 на запрос.
- Прямые теги на вкладках импорта в панели управления. Запланировано.
Пока dry run нет, перед публикацией ссылок выборочно проверьте в панели управления первую и последнюю строки первого пакета.
Что дальше
Сначала задайте домен по умолчанию и брендинг с помощью статьи настройка брендированных коротких ссылок. Об атрибуции после клика рассказывает серверное отслеживание конверсий: как работает передача конверсий в Meta и GA4; сам Elido пока не передаёт им покупки. Весь процесс для маркетолога описан на странице решения для маркетологов и в функции кампаний.
Читайте также в блоге
Частые вопросы
Сколько ссылок можно сократить за раз в Elido?
100 за пакет, как на вкладках Bulk и CSV в панели управления, так и в вызове API POST /links/bulk. Большие таблицы делятся на пакеты по 100. Каждая строка обрабатывается отдельно, поэтому одна плохая строка не обрушивает пакет.
Какие столбцы читает массовый импорт Elido?
В панели управления - по одной строке на ссылку в порядке url, slug, title. Slug и title необязательны. Через API каждый элемент также принимает массив tags. Столбцов UTM нет: сначала соберите размеченный URL в таблице.
Есть ли в Elido пробный прогон (dry run) для массового импорта?
Нет. Режима предпросмотра сегодня нет, как нет и опции пропуска или замены для slug, которые уже существуют. Занятый slug возвращается как ошибка только в своей строке. В бэклоге это значится как запланированное.
Что происходит, если slug уже существует?
Эта строка возвращает статус error с сообщением slug already exists for this domain, а все остальные строки всё равно создаются. Исправьте slug и повторно импортируйте только неудавшиеся строки.
Может ли Apps Script вызывать bulk API по расписанию?
Да. Триггер по времени может читать строки без короткой ссылки, отправлять их POST-запросом на bulk endpoint через UrlFetchApp и записывать slug обратно. Квота Google на личном аккаунте - 20 000 вызовов URL Fetch в сутки, что намного больше, чем нужно для почасовых пакетов по 100.
Где размещать UTM-параметры - в таблице или в сокращателе?
В таблице. Массовый импорт Elido сохраняет адрес назначения ровно в том виде, в каком он передан, поэтому формула, добавляющая utm_source, utm_medium и utm_campaign к каждому URL, даёт проверяемые адреса назначения ещё до появления любой ссылки.
Попробуйте Elido
Вставьте URL - получите короткую ссылку
Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.
Без регистрации. Зарегистрируйтесь бесплатно и получите 50 ссылок в месяц.