7 Min. LesezeitTutorials

Bulk-URL-Shortener: Links aus Google Sheets importieren

Bis zu 100 Links pro Stapel aus Google Sheets kürzen: Einfügen oder CSV im Dashboard, oder Bulk-API aus Apps Script.

Ana Kowalska
Marketing solutions engineering

Der Bulk-Import von Elido erzeugt aus einer Liste von Zeilen url, slug, title bis zu 100 Kurzlinks pro Stapel. Sie können die Zeilen aus Google Sheets ins Dashboard einfügen, als CSV hochladen oder die Bulk-API aus Apps Script aufrufen. UTM-Tags sind keine eigene Importspalte: Sie bauen die endgültige getaggte URL in der Tabelle, und Elido speichert sie als Ziel.

Das ist enger gefasst, als manche Tutorials versprechen (einschließlich einer früheren Fassung dieses Beitrags), deshalb hält sich dieser Beitrag an das, was der Code heute tut. Wenn Sie wegen eines Probelaufmodus, Überspringen-bei-Konflikt-Optionen oder eines Uploads mit 10.000 Zeilen gekommen sind: Die gibt es noch nicht; sie sind als geplante Arbeit erfasst und unten als solche markiert.

Für das größere UTM-Bild behandelt der UTM-Tracking-Cornerstone Vorlagen und serverseitige Conversion-Weiterleitung. Dieser Beitrag ist der Ausschnitt von der Tabelle zu den Kurzlinks.

Kurzfassung

  • Eine Tabelle pro Kampagne. Spalten: final_url (per Formel gebaut, mit UTMs), slug, title.
  • Dashboard-Weg: New link, dann der Tab Bulk (Einfügen) oder der Tab CSV (Hochladen). Beide nehmen 100 Links pro Stapel an.
  • API-Weg: POST /v1/links/bulk mit einem JSON-Body von bis zu 100 Einträgen. Einträge nehmen destination_url, slug, title, tags entgegen.
  • Jede Zeile gelingt oder scheitert für sich. Ein vergebener Slug lässt nur diese Zeile scheitern.
  • Noch kein Probelauf (geplant). Prüfen Sie stattdessen nach dem ersten Stapel einige Zeilen stichprobenartig.
Der Dialog 'Links importieren' von Elido auf dem Tab CSV, in dem ein Tabellenexport hochgeladen wird, um bis zu 100 Kurzlinks in einem Durchgang zu erstellen

Die Tabelle aufbauen

Elido liest pro Link drei Dinge: Ziel, Slug, Titel. Halten Sie die Arbeitsspalten links und eine Ausgabespalte rechts.

SpalteVon Elido genutztHinweise
base_urlneinDie saubere URL der Zielseite
utm_source, utm_medium, utm_campaignneinNur in der Tabelle, Eingaben für die Formel
final_urlja (Ziel)Per Formel gebaut, siehe unten
slugja (optional)Leer heißt, Elido erzeugt einen
titleja (optional)Bezeichnung in der Linkliste im Dashboard
short_linkneinWird nach dem Import gefüllt

Die Formel für final_url erledigt die UTM-Arbeit, die Elido nicht übernimmt:

=TRIM(A2) & IF(ISNUMBER(FIND("?", A2)), "&", "?")
  & "utm_source=" & ENCODEURL(B2)
  & "&utm_medium=" & ENCODEURL(C2)
  & "&utm_campaign=" & ENCODEURL(D2)

Das in der Tabelle zu tun, hat einen Nebeneffekt: Das Ziel, das Sie prüfen, ist das Ziel, das ausgeliefert wird. Nachträglich wird nichts umgeschrieben, und ein Ziel, das bereits ein ? trägt, wird mit & erweitert, statt kaputtzugehen.

Googles eigene Empfehlung lautet, beim Taggen einer URL immer utm_source, utm_medium und utm_campaign zu setzen; ohne sie zeigt das Reporting "(not set)" (Google-Analytics-Hilfe, abgerufen am 2026-10-09). Fügen Sie eine Prüfspalte wie =IF(OR(B2="",C2="",D2=""),"missing UTM","ok") hinzu und filtern Sie vor dem Export danach. Das ersetzt die Probelauf-Warnung, die andere Tools Ihnen geben.

Weg 1: ins Dashboard einfügen (Tab Bulk)

Öffnen Sie New link und wechseln Sie zu Bulk. Das Textfeld nimmt einen Link pro Zeile an:

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

Der Parser trennt jede Zeile an Kommas: Der erste Teil ist die URL, der zweite der Slug, alles danach ist der Titel. Leerzeilen und Zeilen, die mit # beginnen, werden ignoriert. Daraus ergeben sich zwei Folgen für Tabellen:

  • Kommas in einer Ziel-URL zerstören die Zeile. Enthält ein UTM-Wert ein Komma, kodieren Sie es als %2C (das ENCODEURL in der obigen Formel tut das bereits).
  • Beim Einfügen aus Sheets entstehen tabulatorgetrennte Zellen, keine Kommas. Bauen Sie in einer Hilfsspalte pro Zeile eine kommagetrennte Zeile, zum Beispiel =E2 & ", " & F2 & ", " & G2, und kopieren Sie diese eine Spalte.

Nach dem Import zeigt der Dialog die Zahl der angelegten und der fehlgeschlagenen Links, wobei jede fehlgeschlagene Zeile samt Grund darunter aufklappbar ist.

Linkliste im Elido-Dashboard mit den angelegten Kurzlinks und ihren Zielen nach einem Bulk-Import

Weg 2: CSV-Upload (Tab CSV)

Laden Sie die Tabelle als CSV herunter (Datei, Herunterladen, Kommagetrennte Werte) mit den Spalten in der Reihenfolge url, slug, title und laden Sie sie im Tab CSV hoch. Die Datei wird in Ihrem Browser gelesen und durch denselben 100er-Stapel gesendet wie im Einfügen-Tab. Beginnt die erste Zeile nicht mit http, wird sie als Kopfzeile behandelt und verworfen.

Der CSV-Leser trennt schlicht an Kommas und ist kein vollständiger CSV-Parser. Zitierte Felder mit Kommas werden nicht verstanden, halten Sie Titel daher frei von Kommas, sonst wird der Titel abgeschnitten. Brauchen Sie mehr als 100 Zeilen, teilen Sie die Datei in Blöcke zu je 100.

Liegt das Briefing in Excel, behandelt URLs in Excel kürzen die Wege dort.

Weg 3: die API aus Apps Script

Für eine Tabelle, die sich die ganze Woche füllt, rufen Sie die API auf. Der Endpunkt ist POST https://api.elido.app/v1/links/bulk. Das Token ist ein persönliches Zugriffstoken oder ein Workspace-API-Schlüssel, gesendet als Authorization: Bearer ..., und ein an den Workspace gebundener Schlüssel erlaubt es dem Aufruf, workspace_id und domain_id wegzulassen (die Standarddomain des Workspace wird verwendet). Die Authentifizierung ist in der API-Dokumentation unter Authentication beschrieben.

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"] }
    ]
  }'

Die Antwort meldet ok, failed und ein Array items mit einem Eintrag pro Eingabezeile, in Reihenfolge, jeweils als ok oder error markiert. Ein bereits vergebener Slug liefert slug already exists for this domain nur in dieser Zeile. Der Header Idempotency-Key wird 24 Stunden lang beachtet: Derselbe Schlüssel mit demselben Body spielt die ursprüngliche Antwort erneut ab, statt Links doppelt anzulegen (siehe Idempotency in der API-Dokumentation).

Jeder angelegte Link wird zudem für einen asynchronen Sicherheitsscan eingereiht, sodass ein Bulk-Import nicht auf den Scanner wartet.

// 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,
    );
  });
}

Hinweise zum Skript:

  • Es schreibt den Slug (oder den Fehlertext) zurück, keine vollständige URL. Stellen Sie Ihre Kurzdomain in einer Formelspalte voran, wenn Sie anklickbare Links möchten. Zeilen mit einem Fehlertext in short_link werden beim nächsten Lauf übersprungen, leeren Sie die Zelle also, nachdem Sie den Slug korrigiert haben.
  • Halten Sie das Token in den Skripteigenschaften, nicht im Code.
  • Die Apps-Script-Limits für Privatkonten betragen 20.000 URL-Fetch-Aufrufe pro Tag, 6 Minuten pro Ausführung und 90 Minuten Trigger-Laufzeit pro Tag (Workspace-Konten: 100.000 Aufrufe, 6 Stunden) (Apps-Script-Kontingente, abgerufen am 2026-10-09). Ein stündlicher Job, der 100 Links pro Aufruf sendet, bleibt weit darunter.
  • Das Ratenlimit der Elido-API gilt zusätzlich, pro Token und pro Workspace; siehe Rate Limits in der API-Dokumentation.
Kampagnenseite in Elido, auf der per Bulk importierte Links nach Kampagne gruppiert sind

Slugs und Tags

Slugs. Versehen Sie Kampagnen-Slugs mit einem Präfix (q2-, jun26-), damit sie nicht mit älteren Links kollidieren. Eine Kollision wird pro Zeile gemeldet, und der Rest des Stapels läuft durch, sodass ein erneuter Lauf derselben Tabelle für bereits vorhandene Zeilen Fehler liefert, statt sie zu duplizieren. Lassen Sie den Slug leer, erzeugt Elido einen.

Tags. Die Tabs Bulk und CSV im Dashboard setzen keine Tags; die API tut es über das Array tags. Tags sind einfache Zeichenketten, eine Konvention dimension:value (channel:email) ist also nur eine Namensgewohnheit, die Sie in der Tabelle durchsetzen, zum Beispiel mit ="channel:"&C2. Wie Kampagnen Klicks gruppieren, steht in der Kampagnenfunktion.

Was noch nicht gebaut ist

Diese Punkte waren in einer früheren Fassung dieses Beitrags beschrieben und existieren im Produkt heute nicht:

  • Eine Probelauf-Vorschau aufgelöster Links und Konflikte vor dem Commit. Geplant.
  • Konfliktmodi (überspringen, abbrechen, ersetzen) für vorhandene Slugs. Geplant; heute ist ein vergebener Slug ein Fehler pro Zeile.
  • UTM-Spalten und eine Workspace-UTM-Vorlage, die beim Import angewendet wird. Geplant; nutzen Sie die obige Tabellenformel.
  • Größere Stapel (10.000 Zeilen) und ein asynchroner Upload mit Statusmeldung. Geplant; das Limit liegt bei 100 pro Anfrage.
  • Direkte Tags in den Import-Tabs des Dashboards. Geplant.

Solange es den Probelauf nicht gibt, prüfen Sie die erste und die letzte Zeile des ersten Stapels im Dashboard stichprobenartig, bevor Sie die Links veröffentlichen.

Wie es weitergeht

Richten Sie zuerst eine Standarddomain und das Branding ein, mit Marken-Kurzlinks einrichten. Für die Attribution nach dem Klick behandelt serverseitiges Conversion-Tracking, wie die Weiterleitung von Conversions an Meta und GA4 funktioniert; Elido selbst leitet Käufe dorthin noch nicht weiter. Den Workflow für Marketer von Anfang bis Ende finden Sie unter Lösungen für Marketer und in der Kampagnenfunktion.

Weitere Beiträge im Blog

Häufig gestellte Fragen

Wie viele Links kann ich in Elido auf einmal kürzen?

100 pro Stapel, sowohl in den Tabs Bulk und CSV im Dashboard als auch im API-Aufruf POST /links/bulk. Größere Tabellen werden in Stapel zu je 100 aufgeteilt. Jede Zeile wird für sich verarbeitet, sodass eine fehlerhafte Zeile nicht den Stapel scheitern lässt.

Welche Spalten liest der Bulk-Import von Elido?

Im Dashboard eine Zeile pro Link in der Reihenfolge url, slug, title. Slug und Titel sind optional. Über die API akzeptiert jeder Eintrag zusätzlich ein Array tags. Es gibt keine UTM-Spalten: Bauen Sie die getaggte URL zuerst in der Tabelle.

Hat Elido einen Probelauf für Bulk-Importe?

Nein. Es gibt heute keinen Vorschaumodus und keine Option zum Überspringen oder Ersetzen bereits vorhandener Slugs. Ein vergebener Slug kommt nur in dieser Zeile als Fehler zurück. Das steht als geplant im Backlog.

Was passiert, wenn ein Slug bereits existiert?

Diese Zeile liefert den Status error mit der Meldung slug already exists for this domain, und alle anderen Zeilen werden trotzdem angelegt. Korrigieren Sie den Slug und importieren Sie nur die fehlgeschlagenen Zeilen erneut.

Kann Apps Script die Bulk-API nach Zeitplan aufrufen?

Ja. Ein zeitgesteuerter Trigger kann Zeilen ohne Kurzlink lesen, per UrlFetchApp an den Bulk-Endpunkt senden und die Slugs zurückschreiben. Googles Kontingent beträgt bei einem Privatkonto 20.000 URL-Fetch-Aufrufe pro Tag, weit mehr, als stündliche Stapel zu je 100 brauchen.

Gehören UTM-Parameter in die Tabelle oder in den Shortener?

In die Tabelle. Der Bulk-Import von Elido speichert das Ziel genau so, wie es angegeben wird, sodass eine Formel, die jeder URL utm_source, utm_medium und utm_campaign anhängt, Ihnen prüfbare, nachvollziehbare Ziele liefert, bevor irgendein Link existiert.

Elido testen

URL einfügen, kurzer Link in Sekunden

Kein Konto nötig. Link bleibt 30 Tage aktiv. Konto erstellen, um ihn dauerhaft zu behalten.

Keine Anmeldung nötig. Kostenlos registrieren für 50 Links im Monat.

Elido testen

URL-Shortener mit EU-Hosting: eigene Domains, tiefe Analytik und eine offene API. Kostenloser Tarif - keine Kreditkarte nötig.

Tags
bulk url shortener
csv import short links
sheets to short links
bulk link creation
campaign url shortener
google sheets automation

Weiterlesen