Import masowy Elido tworzy do 100 krótkich linków na partię z listy wierszy url, slug, title. Możesz wkleić wiersze z Arkuszy Google do panelu, wgrać je jako CSV albo wywołać API masowe z Apps Script. Tagi UTM nie są osobną kolumną importu: końcowy otagowany adres budujesz w arkuszu, a Elido zapisuje go jako cel.
To węższy zakres, niż obiecują niektóre samouczki (w tym wcześniejsza wersja tego), więc ten wpis trzyma się tego, co kod robi dziś. Jeśli przyszedłeś po tryb dry run, flagi pomijania przy konflikcie albo wgrywanie 10 000 wierszy, tego jeszcze nie ma; są śledzone jako zaplanowane prace i poniżej tak oznaczone.
Szerszy obraz UTM znajdziesz w filarowym wpisie o śledzeniu UTM, który omawia szablony i przekazywanie konwersji po stronie serwera. Ten wpis to wycinek od arkusza do krótkich linków.
TL;DR
- Jeden arkusz na kampanię. Kolumny:
final_url(zbudowana formułą, z UTM),slug,title. - Ścieżka w panelu: New link, potem zakładka Bulk (wklejanie) albo CSV (wgrywanie). Obie przyjmują 100 linków na partię.
- Ścieżka API:
POST /v1/links/bulkz treścią JSON zawierającą do 100 elementów. Elementy przyjmujądestination_url,slug,title,tags. - Każdy wiersz udaje się lub nie niezależnie. Zajęty slug psuje tylko ten wiersz.
- Na razie bez dry run (zaplanowane). Zamiast tego sprawdź kilka wierszy po pierwszej partii.
Zbuduj arkusz
Elido czyta trzy rzeczy na link: cel, slug, tytuł. Trzymaj kolumny robocze po lewej, a jedną kolumnę wyjściową po prawej.
| Kolumna | Używana przez Elido | Uwagi |
|---|---|---|
base_url | nie | Czysty adres strony docelowej |
utm_source, utm_medium, utm_campaign | nie | Dane wejściowe formuły, tylko w arkuszu |
final_url | tak (cel) | Zbudowana formułą, zobacz niżej |
slug | tak (opcjonalnie) | Puste oznacza, że Elido wygeneruje slug |
title | tak (opcjonalnie) | Etykieta widoczna na liście linków w panelu |
short_link | nie | Wypełniana po imporcie |
Formuła final_url wykonuje pracę UTM, której Elido nie wykonuje:
=TRIM(A2) & IF(ISNUMBER(FIND("?", A2)), "&", "?")
& "utm_source=" & ENCODEURL(B2)
& "&utm_medium=" & ENCODEURL(C2)
& "&utm_campaign=" & ENCODEURL(D2)
Robienie tego w arkuszu ma skutek uboczny na plus: cel, który przeglądasz, jest celem, który trafia do produkcji. Nic nie jest przepisywane po fakcie, a cel, który już ma ?, jest rozszerzany o &, zamiast się psuć.
Wytyczne Google mówią, by zawsze ustawiać utm_source, utm_medium i utm_campaign przy tagowaniu adresu; bez nich raporty pokazują "(not set)" (pomoc Google Analytics, dostęp 2026-10-09). Dodaj kolumnę kontrolną, np. =IF(OR(B2="",C2="",D2=""),"missing UTM","ok"), i przefiltruj po niej przed eksportem. To zastępuje ostrzeżenie dry run, które dają inne narzędzia.
Ścieżka 1: wklejanie do panelu (zakładka Bulk)
Otwórz New link i przełącz na Bulk. Pole tekstowe przyjmuje jeden link na linię:
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
Parser dzieli każdą linię po przecinkach: pierwsza część to adres, druga to slug, wszystko dalej to tytuł. Puste linie i linie zaczynające się od # są ignorowane. Dla arkuszy ma to dwie konsekwencje:
- Przecinki wewnątrz adresu docelowego psują wiersz. Jeśli wartość UTM zawiera przecinek, zakoduj go jako
%2C(ENCODEURLw powyższej formule już to robi). - Wklejanie z Arkuszy daje komórki rozdzielone tabulatorami, a nie przecinkami. Zbuduj w kolumnie pomocniczej jedną linię połączoną przecinkami na wiersz, na przykład
=E2 & ", " & F2 & ", " & G2, i skopiuj tę jedną kolumnę.
Po imporcie okno pokazuje liczbę utworzonych i liczbę nieudanych, a każda nieudana linia z powodem jest rozwijana poniżej.
Ścieżka 2: wgranie CSV (zakładka CSV)
Pobierz arkusz jako CSV (File, Download, Comma-separated values) z kolumnami w kolejności url, slug, title i wgraj go w zakładce CSV. Plik jest odczytywany w twojej przeglądarce i wysyłany tą samą partią po 100 linków co w zakładce wklejania. Jeśli pierwszy wiersz nie zaczyna się od http, jest traktowany jako nagłówek i pomijany.
Czytnik CSV to zwykły podział po przecinkach, a nie pełny parser CSV. Pola w cudzysłowie zawierające przecinki nie są rozumiane, więc trzymaj tytuły bez przecinków, inaczej tytuł zostanie obcięty. Jeśli potrzebujesz więcej niż 100 wierszy, podziel plik na kawałki po 100.
Jeśli brief żyje w Excelu, jak skracać adresy URL w Excelu opisuje tamtejsze drogi.
Ścieżka 3: API z Apps Script
Dla arkusza, który wypełnia się przez cały tydzień, wywołuj API. Punkt końcowy to POST https://api.elido.app/v1/links/bulk. Token to osobisty token dostępu albo klucz API przestrzeni roboczej wysyłany jako Authorization: Bearer ..., a klucz powiązany z przestrzenią roboczą pozwala wywołaniu pominąć workspace_id i domain_id (używana jest domyślna domena przestrzeni roboczej). Uwierzytelnianie opisano w dokumentacji API w sekcji 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"] }
]
}'
Odpowiedź zawiera ok, failed i tablicę items z jednym wpisem na wiersz wejściowy, w kolejności, każdy oznaczony jako ok lub error. Slug, który jest już zajęty, zwraca slug already exists for this domain tylko w tym wierszu. Nagłówek Idempotency-Key jest respektowany przez 24 godziny: ten sam klucz z tą samą treścią odtwarza pierwotną odpowiedź zamiast tworzyć linki dwa razy (zobacz Idempotency w dokumentacji API).
Każdy utworzony link trafia też do kolejki asynchronicznego skanu bezpieczeństwa, więc import masowy nie czeka na skaner.
// 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,
);
});
}
Uwagi o skrypcie:
- Zapisuje z powrotem slug (lub tekst błędu), a nie pełny adres. Dołącz swoją krótką domenę w kolumnie z formułą, jeśli chcesz mieć klikalne linki. Wiersze z tekstem błędu w
short_linksą pomijane przy następnym uruchomieniu, więc wyczyść komórkę po poprawieniu sluga. - Trzymaj token we właściwościach skryptu, a nie w kodzie.
- Limity Apps Script dla kont konsumenckich to 20 000 wywołań URL Fetch dziennie, 6 minut na wykonanie i 90 minut czasu działania wyzwalaczy dziennie (konta Workspace: 100 000 wywołań, 6 godzin) (limity Apps Script, dostęp 2026-10-09). Cogodzinne zadanie wysyłające 100 linków na wywołanie pozostaje daleko poniżej.
- Dodatkowo obowiązuje limit szybkości API Elido, na token i na przestrzeń roboczą; zobacz Rate Limits w dokumentacji API.
Slugi i tagi
Slugi. Dodawaj prefiksy do slugów kampanii (q2-, jun26-), aby nie kolidowały ze starszymi linkami. Kolizja jest zgłaszana per wiersz, a reszta partii przechodzi, więc ponowne uruchomienie tego samego arkusza zwraca błędy dla wierszy, które już istnieją, zamiast je dublować. Puste pole sluga sprawia, że Elido wygeneruje go samo.
Tagi. Zakładki Bulk i CSV w panelu nie ustawiają tagów; API robi to przez tablicę tags. Tagi to zwykłe ciągi znaków, więc konwencja dimension:value (channel:email) to tylko nawyk nazewniczy, który egzekwujesz w arkuszu, na przykład przez ="channel:"&C2. O tym, jak kampanie grupują kliknięcia, przeczytasz w funkcji kampanii.
Czego jeszcze nie zbudowano
Te rzeczy opisano we wcześniejszej wersji tego wpisu i nie istnieją dziś w produkcie:
- Podgląd dry run rozwiązanych linków i konfliktów przed zatwierdzeniem. Zaplanowane.
- Tryby konfliktu (pomiń, przerwij, zastąp) dla istniejących slugów. Zaplanowane; dziś zajęty slug to błąd per wiersz.
- Kolumny UTM i szablon UTM przestrzeni roboczej stosowany podczas importu. Zaplanowane; użyj formuły z arkusza podanej wyżej.
- Większe partie (10 000 wierszy) i asynchroniczne wgrywanie z raportowaniem statusu. Zaplanowane; limit to 100 na żądanie.
- Bezpośrednie tagi w zakładkach importu w panelu. Zaplanowane.
Dopóki dry run nie istnieje, sprawdź w panelu pierwszy i ostatni wiersz pierwszej partii, zanim opublikujesz linki.
Co dalej
Najpierw ustaw domyślną domenę i branding za pomocą setup-branded-short-links. Atrybucję po kliknięciu opisuje śledzenie konwersji po stronie serwera, które omawia, jak działa przekazywanie konwersji do Meta i GA4; samo Elido nie przekazuje jeszcze do nich zakupów. Cały proces marketera od początku do końca jest na solutions/marketers i w funkcji kampanii.
Powiązane na blogu
Najczęściej zadawane pytania
Ile linków mogę skrócić naraz w Elido?
100 na partię, zarówno w zakładkach Bulk i CSV w panelu, jak i w wywołaniu API POST /links/bulk. Większe arkusze dzieli się na partie po 100. Każdy wiersz jest przetwarzany osobno, więc jeden zły wiersz nie przerywa partii.
Jakie kolumny czyta masowy import Elido?
W panelu jedna linia na link w kolejności url, slug, title. Slug i title są opcjonalne. Przez API każdy element przyjmuje też tablicę tags. Nie ma kolumn UTM: najpierw zbuduj otagowany adres w arkuszu.
Czy Elido ma tryb próbny (dry run) dla importów masowych?
Nie. Dziś nie ma trybu podglądu ani opcji pominięcia lub zastąpienia dla slugów, które już istnieją. Zajęty slug wraca jako błąd tylko w tym wierszu. Jest to w backlogu jako zaplanowane.
Co się dzieje, gdy slug już istnieje?
Ten wiersz zwraca status error z komunikatem slug already exists for this domain, a każdy inny wiersz jest nadal tworzony. Popraw slug i zaimportuj ponownie tylko te wiersze, które się nie powiodły.
Czy Apps Script może wywoływać API masowe według harmonogramu?
Tak. Wyzwalacz czasowy może odczytać wiersze bez krótkiego linku, wysłać je POST-em do punktu końcowego masowego przez UrlFetchApp i zapisać slugi z powrotem. Limit Google to 20 000 wywołań URL Fetch dziennie na koncie konsumenckim, znacznie więcej, niż potrzebują cogodzinne partie po 100.
Czy parametry UTM powinny być w arkuszu, czy w skracaczu?
W arkuszu. Import masowy Elido zapisuje adres docelowy dokładnie tak, jak został podany, więc formuła dopisująca utm_source, utm_medium i utm_campaign do każdego adresu daje cele, które można przejrzeć i skontrolować, zanim powstanie jakikolwiek link.
Wypróbuj Elido
Wklej URL, otrzymaj krótki link
Bez rejestracji. Link działa 30 dni. Zarejestruj się, aby zachować go na zawsze.
Bez rejestracji. Załóż darmowe konto i korzystaj z 50 linków miesięcznie.