Kampagnen-Launches beginnen nicht in einem Dashboard. Sie beginnen in einer Tabellenkalkulation, die jemand auf Slack geteilt hat. Die URLs befinden sich in Spalte A, UTM-Metadaten füllen die Spalten B bis G, die Slugs stehen in Spalte H und im Briefing steht, dass der Launch morgen ist. Der langsamste Teil des gesamten Prozesses ist das Kopieren jeder einzelnen Zeile in ein Shortener-UI – nicht weil es technisch schwierig wäre, sondern weil es keinen Grund gibt, es so zu machen.
Dieser Beitrag beschreibt den direkten Workflow: wie das Sheet aussieht, wie es auf den Bulk-Import-Endpunkt von Elido abgebildet wird, drei Import-Pfade abhängig von der Zeilenanzahl, den Dry-Run-Schritt, der Fehler vor dem Produktionsstart abfängt, und ein Apps Script Snippet, das das Ganze per Trigger automatisiert. Für den breiteren Kontext zur durchgängigen UTM-Hygiene deckt der UTM-Tracking-Grundpfeiler Workspace-Templates und serverseitige Conversion-Weiterleitung im Detail ab. Dieser Post behandelt das Sheet-zu-Kurzlinks-Segment dieser Pipeline.
TL;DR#
- Führen Sie ein Sheet pro Kampagne:
target_url,slug,utm_source,utm_medium,utm_campaign,tagsals benannte Spalten. UTM-Spalten, die leer sind, werden aus Ihrem Workspace-Template gefüllt. - Drei Import-Pfade: Zeilen in das UI einfügen (bis zu 1.000 Zeilen), CSV-Upload (bis zu 10.000 Zeilen) oder die API via Skript (unbegrenzt, wiederholbar).
- Führen Sie den Prozess immer zuerst mit
dry_run=trueaus. Die Vorschau zeigt den aufgelösten Kurzlink und den vollständig gerenderten UTM-Query-String an, ohne etwas zu speichern. - Präfixen Sie Kampagnen-Slugs (
q2-,jun-), um sie zu namespacen. Kollisionen treten im Dry-Run auf, nicht mitten im Import.
Sheet-Struktur#
Die erforderlichen Spalten sind target_url und entweder slug oder auto_slug. Alles andere ist optional, hat aber eine definierte Interpretation, wenn es vorhanden ist.
| Spalte | Erforderlich | Hinweise |
|---|---|---|
target_url | ja | Vollständige Ziel-URL inklusive Schema |
slug | eine von zwei | Bevorzugt - liefert vorhersehbare Kurz-URLs |
auto_slug | eine von zwei | Auf true setzen und Elido generiert einen Slug |
utm_source | optional | Überschreibt den Wert des Workspace-Templates |
utm_medium | optional | Überschreibt den Wert des Workspace-Templates |
utm_campaign | optional | Überschreibt den Wert des Workspace-Templates |
utm_content | optional | Meistens die Creative-Variante |
utm_term | optional | Bezahlte Keywords oder Zielgruppensegment |
tags | optional | Kommagetrennt, wird auf den Link angewendet |
title | optional | Wird in der Linkliste im Dashboard angezeigt |
Die UTM-Regel ist einfach: Wenn die target_url bereits einen ?utm_source= (oder einen anderen utm_*) Query-Parameter enthält, werden diese Werte unverändert übernommen. Kein Überschreiben, kein Zusammenführen. Wenn die Ziel-URL keine UTM-Parameter hat, erstellt Elido diese aus den UTM-Spalten und greift auf Ihr Workspace-Template für jede leere Spalte zurück. Das ist in der Praxis wichtig – manche Teams verwenden vorab getaggte Ziel-URLs für ihren E-Mail-Service-Provider, und ein Bulk-Import-Tool, das diese stillschweigend neu taggt, führt zu fehlerhaften Analytics. Elido warnt bei Zeilen im Mischmodus (einige UTMs vorhanden, andere fehlen) und bittet um Bestätigung.
Die Spalte für Tags verdient eine eigene Anmerkung. Die Werte sind kommagetrennte Zeichenfolgen: campaign:q2-spring, channel:paid-social, variant:hero-a. Diese dreiteilige Form (dimension:value) ermöglicht filterbare Achsen im Dashboard, ohne dass eine separate Taxonomie-Konfiguration erforderlich ist. Mehr dazu im Abschnitt zur Tag-Taxonomie unten.
Die drei Import-Pfade#
Zeilen in das Bulk-Import-UI einfügen (bis zu 1.000 Zeilen)#
Für alles unter 1.000 Zeilen ist der schnellste Weg, den Sheet-Bereich zu kopieren und in das Textfeld für den Bulk-Import einzufügen. Die Benutzeroberfläche von Elido erkennt automatisch tabulatorgetrennte Werte aus einer Tabellenkalkulations-Kopie und ordnet die Spalten anhand der Header zu. Sie exportieren keine CSV; Sie fügen einfach ein.
Dies funktioniert gut für den häufigsten Fall: Ein Kampagnen-Briefing, das bereits in Sheets existiert, eine Launch-Deadline in einer Stunde und keine Lust auf Scripting. Das UI zeigt vor dem Commit eine Vorschau aller Zeilen an (derselbe Dry-Run, den Sie über die API erhalten würden) und lässt Sie fehlgeschlagene Zeilen direkt inline korrigieren, bevor Sie fortfahren.
Ein Haken: Wenn Ihr Sheet verbundene Zellen oder komplexe Formatierungen enthält, kann das Einfügen zu verstümmelten Ergebnissen führen. Der sicherere Weg für jedes Sheet mit einer nicht-trivialen Struktur besteht darin, den Bereich zuerst in ein leeres Sheet zu kopieren (Werte einfügen) und dann den bereinigten Bereich in das Import-UI einzufügen.
CSV-Upload (bis zu 10.000 Zeilen)#
Für Launches mit mehr als 1.000 Zeilen (große Katalog-Kampagnen, Event-Codes, personalisierte Links) bewältigt der CSV-Upload-Pfad bis zu 10.000 Zeilen. Exportieren Sie das Sheet als CSV (Datei > Herunterladen > CSV) und laden Sie es im Import-Dialog hoch. Das Mapping der Spaltenköpfe ist identisch; der Unterschied besteht darin, dass große Uploads asynchron verarbeitet werden und ihren Status über einen Webhook oder einen Poll-Endpunkt melden.
Der CSV-Export von Google Sheets über die API (Zugriff am 12.05.2026) unterstützt den Export eines benannten Bereichs anstelle des gesamten Sheets, was nützlich ist, wenn Ihr Kampagnen-Sheet mehrere Tabs oder Header-Zeilen enthält, die Sie nicht manuell bereinigen möchten.
API-Aufruf über ein Skript (mehr als 10.000 Zeilen oder wiederholte Durchläufe)#
Für große Kataloge oder Kampagnen, die wöchentlich laufen und den gleichen automatisierten Prozess benötigen, ist der API-Pfad der richtige. Zwei gängige Implementierungen: Apps Script (keine lokalen Tools erforderlich, läuft im Browser) und Python (besser für Teams mit bestehenden Daten-Pipelines). Der Endpunkt ist in beiden Fällen derselbe.
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"
Der Parameter on_conflict steuert, was passiert, wenn ein Slug bereits existiert: skip lässt den vorhandenen Link an Ort und Stelle und zeichnet eine Warnung auf, fail bricht den gesamten Import bei der ersten Kollision ab, und replace aktualisiert das Ziel des vorhandenen Links. Für die meisten Kampagnen-Importe ist skip die richtige Standardeinstellung: Ein erneuter Durchlauf derselben CSV überschreibt keine bereits erstellten Links.
Die API akzeptiert bis zu 10.000 Zeilen pro Aufruf. Für größere Kataloge sollten Sie in Chargen von 5.000 Zeilen unterteilen; jeder Aufruf ist unabhängig und idempotent, wenn Sie stabile Slugs verwenden.
Dry-Run vor dem Import#
Führen Sie jeden Import mit dry_run=true aus, bevor Sie den Commit durchführen. Die Antwort ist identisch mit dem Live-Import (jede Zeile zeigt ihren aufgelösten Kurzlink, den parsten UTM-Query-String, die Tag-Liste und etwaige Warnungen), aber es wird nichts in die Datenbank geschrieben.
Dinge, die der Dry-Run abfängt und die Sie sonst vor dem Launch nicht bemerken würden:
- Ein Slug in Zeile 14, der mit einem vorhandenen Link in Ihrem Workspace kollidiert (wird als Konfliktwarnung angezeigt)
- Eine UTM-Spalte, die versehentlich leer gelassen wurde (Elido kennzeichnet ein fehlendes
utm_mediumals Warnung, nicht als harten Fehler, aber Sie möchten es vor dem Launch wissen) - Eine
target_urlmit einem nachgestellten Leerzeichen, das die Sheet-Kopie überlebt hat (die aufgelöste URL sieht in der CSV gut aus, aber das tatsächliche Ziel hat ein angehängtes%20) - Tag-Werte, die 32 Zeichen überschreiten (werden stillschweigend abgeschnitten; der Dry-Run macht den gespeicherten Wert sichtbar)
Die Dry-Run-Antwort ist im gleichen Format wie ein echtes Import-Ergebnis paginiert. Öffnen Sie die erste Seite, prüfen Sie stichprobenartig Zeile 2 (die erste Datenzeile nach Ihrer wahrscheinlich perfekten Zeile 1) und die letzte Zeile. Schauen Sie sich dann alle Zeilen an, die eine Warnung markieren. Zwei Minuten Überprüfung fangen die Fehler ab, die sonst erst am Morgen nach dem Launch als „Warum führt dieser Kampagnen-Link zu einem 404?“ auftauchen würden.
Slug-Konflikte#
Slug-Konflikte treten auf, wenn ein Slug, den Sie zu importieren versuchen, bereits in Ihrem Workspace oder auf Ihrer benutzerdefinierten Domain existiert. Der Import zeigt diese in der Dry-Run-Antwort mit dem Konflikttyp an (same_workspace, same_domain, reserved) sowie die Ziel-URL des bestehenden Links.
Die praktische Lösung ist Namespacing. Präfixen Sie Kampagnen-Slugs mit einer kurzen Kennung: q2-, jun26-, sm- (für Social Media), em- (für E-Mail). Ein Slug wie q2-spring-hero-a wird wahrscheinlich nicht mit etwas aus einer früheren Kampagne kollidieren. Präfixe machen auch den Dashboard-Filter offensichtlich – alle mit q2-* getaggten Links gehören zu einem Kampagnenquartal.
Ein erwähnenswerter Fall: Wenn Sie von einem anderen Shortener migrieren und alte Slugs beibehalten möchten, importieren Sie diese zuerst ohne Präfix und verwenden Sie dann präfixte Slugs für neue Kampagneninhalte. Der Elido Bulk-Import zeigt Ihnen im Dry-Run an, ob die alten Slugs mit bereits im Workspace vorhandenen Slugs kollidieren.
Tag-Taxonomie#
Tags, die zum Zeitpunkt des Imports angewendet werden, erhalten die gleiche dreiteilige Struktur wie die Sheet-Spalten, die sie gesteuert haben: campaign:q2-spring, channel:email, variant:hero-a. Wenn Sie später das Dashboard öffnen und nach channel:email filtern, durchsuchen Sie keine Freitext-Strings – Sie fragen eine konsistente Taxonomie ab.
Die Dimensionsnamen (campaign, channel, variant) stammen aus der Konvention Ihres Teams, nicht aus einem von Elido erzwungenen Schema. Die Einschränkung ist das Format: ein Doppelpunkt-Trennzeichen, keine Leerzeichen im Schlüssel, Werte unter 32 Zeichen. Teams, die dies im Sheet erzwingen (eine Spalte tags, die eine Formel als "campaign:"&E2&", channel:"&F2 aufbaut), haben nie falsch formatierte Tags im Dashboard. Teams, die die Tag-Spalte als Freitext zulassen, haben innerhalb von drei Kampagnen ein Cleanup-Problem.
Für die Übersicht der Kampagnen-Funktionen ist die tag-basierte Gruppierung die primäre Art und Weise, wie Elido Klicks nach Kampagnendimension im Analyse-Panel gruppiert – die Taxonomie, die Sie im Sheet definieren, ist also die Taxonomie, nach der Sie beim Reporting filtern werden.
Apps Script Automatisierung#
Für Teams, die wöchentlich die gleiche Kampagnenstruktur verwenden (Newsletter-Links, Paid-Social-Links, E-Mail-Varianten), ist es ratsam, den Import vollständig zu automatisieren. Google Apps Script läuft im Browser, hat Zugriff auf die Sheet-Daten und kann über einen zeitbasierten Trigger oder einen Form-Submit-Cron ausgelöst werden.
Das Muster: Ein Trigger wird ausgelöst, das Skript liest alle Sheet-Zeilen, die keinen short_link Wert in Spalte I haben, sendet sie per POST an die Bulk-Import-API und schreibt die erstellten Kurzlinks zurück in Spalte I. Beim nächsten Trigger werden bereits importierte Zeilen übersprungen, da Spalte I bereits gefüllt ist.
// Google Apps Script - Bulk-Import neuer Zeilen über die Elido API
// Trigger: zeitgesteuert, jede Stunde (oder bei Formularübermittlung)
// Docs: https://developers.google.com/apps-script/guides/triggers (Zugriff am 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"); // hier zurückschreiben
const newRows = [];
const rowIndexes = [];
for (let i = 1; i < data.length; i++) {
const row = data[i];
if (!row[urlCol] || row[doneCol]) continue; // leere oder bereits importierte überspringen
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 || [];
// Kurzlinks zurück in Spalte I schreiben
created.forEach((link, idx) => {
if (!link.short_url) return;
const sheetRow = rowIndexes[idx] + 1; // 1-basiert
sheet.getRange(sheetRow, doneCol + 1).setValue(link.short_url);
});
}
Ein paar Hinweise zur Implementierung:
Speichern Sie das API-Token in PropertiesService.getScriptProperties(), nicht hartcodiert im Skript. Die Dokumentation zu Apps Script Triggern (Zugriff am 12.05.2026) deckt sowohl zeitgesteuerte als auch ereignisgesteuerte Trigger-Setups ab. Für ein Kampagnen-Sheet, das ein Team gemeinsam ausfüllt, wird ein onEdit Trigger ausgelöst, wenn Spalte A ausgefüllt wird; der Kurzlink erscheint innerhalb von Sekunden nach der Eingabe der Ziel-URL in Spalte I.
Das Flag muteHttpExceptions: true ist wichtig. Ohne dieses Flag löst ein 422 von der API eine Ausnahme auf Skriptebene aus und der Trigger stoppt die Wiederholungsversuche. Mit diesem Flag erhalten Sie den Fehler-Body und können ihn protokollieren.
Für eine umfassendere Integration (ein Python-Skript, ein CI-Schritt, der ein Sheet über die Sheets API liest, oder ein geplanter Job in Ihrer bestehenden Daten-Pipeline) liefert Ihnen der Endpunkt spreadsheets.values.get der Sheets API direkt JSON. Von dort aus ist die Struktur des Bulk-Import-Aufrufs identisch mit dem obigen curl-Beispiel.
Häufige Fehler#
Nachgestellte Leerzeichen in Slugs. Ein aus einer Tabellenzelle kopierter Slug kann ein nachgestelltes Leerzeichen haben, das im UI unsichtbar ist. Elido erlaubt dies (der Slug ist technisch gültig), aber go.example.com/q2-promo mit einem nachgestellten Leerzeichen ist eine unschöne URL, und das Kopieren aus der Adressleiste eines Browsers entfernt es normalerweise, sodass die Person, die den Kurzlink später einfügt, einen 404 erhält. Die Lösung ist eine =TRIM(H2) Formel in der Slug-Spalte vor dem Export.
Fehlendes utm_medium. Elido warnt, blockiert aber nicht bei einem fehlenden utm_medium, da einige Kampagnen dies absichtlich weglassen. Aber ein fehlendes Medium ist fast immer ein Fehler: GA4 leitet alles ohne Medium an den (none) Kanal weiter, was die Kanalzuordnung nutzlos macht. Die kanonische Referenz des GA4 URL-Builders (Zugriff am 12.05.2026) listet utm_medium as erforderlich auf, damit die Kampagnenzuordnung korrekt funktioniert. Wenn Ihr Workspace-Template einen utm_medium Standardwert hat, erben leere Zellen in der Spalte diesen; wenn nicht, ist die Dry-Run-Warnung Ihre letzte Chance, dies abzufangen.
Tag-Werte über 32 Zeichen. Elido schneidet Tag-Werte, die 32 Zeichen überschreiten, stillschweigend ab. Das Abschneiden ist in den Dry-Run-Warnungen unsichtbar, es sei denn, man achtet darauf (die Antwort zeigt den gespeicherten Wert, nicht den ursprünglichen). Lange Tag-Werte entstehen meist durch das Einfügen von UTM-Kampagnennamen in die Tag-Spalte: spring-2026-dach-email-reactivation-week3 hat 42 Zeichen und wird im Dashboard zu spring-2026-dach-email-reactivation-we. Halten Sie Tag-Dimensionswerte kurz; verschieben Sie die ausführlichen Metadaten stattdessen in den Link-Titel.
dry_run=true bei erneuten Durchläufen vergessen. Wenn Sie einen CSV-Upload für eine Kampagne erneut ausführen, die bereits Links enthält, ist on_conflict=skip sicher, aber on_conflict=replace aktualisiert die Ziel-URLs bei jedem Slug, der sowohl in der alten als auch in der neuen CSV vorkommt. Bei einer Kampagne, bei der sich die Ziel-URLs nicht geändert haben, ist dies harmlos. Bei einer Kampagne, bei der Sie die Ziel-URLs der Landingpage mitten im Flug aktualisiert haben, ist es genau das, was Sie wollen. Wissen Sie, in welchem Modus Sie sich befinden, bevor Sie den Commit durchführen.
Zusammenfassung: Vom Setup zum Launch#
Die vollständigste Version dieses Workflows: Erstellen Sie das Sheet einmal mit stabilen Spaltennamen, definieren Sie ein Workspace UTM-Template, damit leere UTM-Spalten sinnvolle Standardwerte erben (behandelt in setup-branded-short-links), führen Sie den Dry-Import aus, um Konflikte und Warnungen abzufangen, führen Sie den Commit durch und schreiben Sie den Apps Script Trigger, sodass die nächste Kampagne null manuelle Schritte erfordert.
Für den Attribution-Layer, der den Kreis nach dem Klick schließt, behandelt serverseitiges Conversion-Tracking, wie die click_id aus der Redirect-Antwort von Elido an Meta CAPI und GA4 weitergeleitet wird – der serverseitige Teil, der Safari ITP und Adblocker-Interferenzen übersteht. Dieser Post und jener zusammen ergeben ein vollständiges Bild des Kampagnen-Workflows für Marketer, vom Sheet zum Kurzlink bis zur zugeordneten Conversion.
Die gesamte Oberfläche für das Kampagnen-URL-Management – Templates, Bulk-Import, Kampagnengruppierung, Conversion-Weiterleitung – finden Sie auf der Kampagnen-Funktionsseite.
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.
Kostenlos, keine Anmeldung erforderlich · 2 pro Tag