
Ein praktisches Problem: Die Sommerkarte ist gedruckt — aber die Angebote ändern sich
Stellen Sie sich vor: Ihre Restaurant‑Kette hat Hunderte Tischaufsteller und Plakate mit QR‑Codes gedruckt, die auf Sonderaktionen verlinken. Jetzt beginnt die Sommersaison — mehrere Angebote müssen gleichzeitig ersetzt oder zeitgesteuert aktiviert werden. Neu drucken ist teuer und langsam. Die Lösung: dynamische QR‑Ziele zentral aktualisieren und das im Batch per API, ohne ein einziges Druckstück zu ändern.
Warum ein Bulk‑Update per API sinnvoll ist
- Der gedruckte QR‑Code bleibt unverändert; Sie ändern nur das Ziel.
- Zentrale Verwaltung: Medien, Branding und Ziele bleiben an einem Ort.
- Schnell skalierbar: saisonale Kampagnen für hunderte oder tausende Shortlinks in einem Durchgang.
- Integration: automatisierbar aus Ihrem ERP, CMS oder einem Marketing‑Planer.
Voraussetzungen und Vorgehen
Bevor Sie starten, klären Sie diese Punkte:
- API‑Zugang: API‑Token/Key und die Basis‑URL Ihrer Linkentra‑Instanz (Cloud oder Self‑Hosted).
- Feld‑Mapping: Welche Felder erwartet die API (Ziel‑URL, Titel, Slug/Kürzel, Aktiv/Deaktiviert, zeitgesteuerte Regeln). Passen Sie die Beispielpayloads an Ihre API‑Dokumentation an.
- Batch‑Größe: Testen Sie mit kleinen Batches (z. B. 50–200) und erhöhen Sie dann die Größe, abhängig von Rate Limits.
- Backup: Exportieren Sie bestehende Kurzlinks/IDs vor Änderungen (CSV/JSON), damit Sie ein Rollback planen können.
Praxisfall: Ablauf für saisonale Kampagne
Schrittfolge im Überblick:
- Export aller relevanten Kurzlinks (z. B. Kategorie "Sommerpromo") mit IDs.
- Erstellen eines Datensets mit neuen Ziel‑URLs und optional Medien/Meta.
- Batch‑Update via API: neue Ziele zuweisen, Titel/Branding anpassen, Zeitsteuerung setzen.
- Überwachung: Prüfungen auf Statuscodes, einfache Scan‑Kontrolle nach Veröffentlichung.
PHP‑Beispiel: Bulk‑Erstellung von QR‑Zielen
Das nachfolgende Skript ist als Template gedacht. Ersetzen Sie $apiBase, $token und die Endpunkte durch die tatsächlichen Angaben aus Ihrer Linkentra‑Dokumentation.
// Konfiguration
$apiBase = 'https://IHRE‑LINKENTRA‑INSTANZ'; // Basis‑API‑URL Ihrer Instanz
$token = 'MEIN_API_TOKEN';
$batchSize = 100; // Anzahl pro Durchgang
// Beispiel‑Daten: ein Array mit Zielen für die Saison
$items = [
['slug'=>'sommer-angebot-1', 'target'=>'https://example.com/sommer/angebot1', 'title'=>'Sommer Angebot 1'],
['slug'=>'sommer-angebot-2', 'target'=>'https://example.com/sommer/angebot2', 'title'=>'Sommer Angebot 2'],
// ... weitere Einträge
];
function apiRequest($method, $path, $data = null) {
global $apiBase, $token;
$url = rtrim($apiBase, '/') . '/' . ltrim($path, '/');
$ch = curl_init($url);
$headers = [ 'Authorization: Bearer ' . $token, 'Accept: application/json' ];
if ($data !== null) {
$payload = json_encode($data);
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// Methode setzen
switch (strtoupper($method)) {
case 'POST': curl_setopt($ch, CURLOPT_POST, true); break;
case 'PUT': curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); break;
case 'PATCH': curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH'); break;
case 'DELETE': curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); break;
}
$resp = curl_exec($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($resp === false) { $err = curl_error($ch); curl_close($ch); throw new Exception('cURL error: '.$err); }
curl_close($ch);
return ['http'=>$http, 'body'=>json_decode($resp, true)];
}
// Batch‑Erstellung
$chunks = array_chunk($items, $batchSize);
foreach ($chunks as $i => $chunk) {
foreach ($chunk as $entry) {
$payload = [
'slug' => $entry['slug'],
'target' => $entry['target'],
'title' => $entry['title'],
// weitere Felder nach Bedarf: branding, media_id, start_at, end_at
];
$res = apiRequest('POST', '/targets', $payload); // Pfad anpassen
if ($res['http'] >= 200 && $res['http'] < 300) {
// Erfolg: Id speichern oder loggen
// Beispiel: file_put_contents('created_ids.csv', $res['body']['id']."\n", FILE_APPEND);
} else {
// Fehlerbehandlung: Retry/Log
}
}
// kurze Pause zwischen Batches, um Rate Limits zu schonen
sleep(1);
}
?>
PHP‑Beispiel: Bulk‑Update (z. B. auf neue Ziel‑URLs für die Saison)
Wenn Sie bestehende Kurzlinks aktualisieren wollen, arbeiten Sie typischerweise mit den IDs, die Sie beim Erstellen exportiert haben.
// Beispiel: $updates = [ ['id'=>123, 'target'=>'https://...'], ... ];
foreach ($updates as $u) {
$payload = ['target' => $u['target']];
$res = apiRequest('PATCH', '/targets/'.$u['id'], $payload); // Pfad/Feldnamen anpassen
if ($res['http'] >= 200 && $res['http'] < 300) {
// OK
} else {
// Loggen und ggf. Retry implementieren
}
usleep(200000); // 200ms Pause
}
?>
PHP‑Beispiel: Deaktivieren (temporär) oder Löschen
Je nach gewünschtem Verhalten deaktivieren Sie Links (so bleibt der Shortlink erhalten, aber leitet nicht weiter) oder löschen ihn.
// Deaktivieren per PATCH
foreach ($idsToDeactivate as $id) {
$res = apiRequest('PATCH', '/targets/'.$id, ['active' => false]);
// Oder: apiRequest('DELETE', '/targets/'.$id); wenn Löschen gewünscht
}
?>
CSV‑Bulk: Hybridansatz (CSV erzeugen, API/Import nutzen)
Linkentra bietet Bulk‑Importoptionen (CSV/JSON) als Alternative zur reinen API‑Schleife. Ein bewährtes Vorgehen:
- 1) Erzeugen Sie eine CSV mit Spalten für slug,target,title,start_at,end_at.
- 2) Validieren Sie die CSV lokal (Duplikate, ungültige URLs, fehlende Slugs).
- 3) Laden Sie die Datei per API‑Upload oder über das Web‑Interface hoch.
PHP‑Snippet zum CSV‑Erzeugen (Beispiel):
$fp = fopen('bulk_import.csv', 'w');
fputcsv($fp, ['slug','target','title','start_at','end_at']);
foreach ($items as $row) { fputcsv($fp, [$row['slug'],$row['target'],$row['title'],'','']); }
fclose($fp);
// Dann Upload via API oder Button im Admin-Interface
?>
Praktische Tipps für robuste Automatisierung
- Batch‑Größe probieren: zu groß = Timeouts, zu klein = lange Laufzeiten.
- Behandle HTTP‑Antworten und Statuscodes; implementiere Backoff‑Strategie bei 429/5xx.
- Idempotenz: Nutze Slugs oder externe IDs, damit wiederholte Requests nicht zu Duplikaten führen.
- Logging & Backup: Speichere alte Ziel‑URLs und Link‑IDs für schnellen Rollback.
- Zeitschaltungen: Wenn die API Zeitfelder unterstützt, setze start_at/end_at statt manuell zu aktivieren.
- Sicherheit: Bewahre API‑Tokens sicher (Environment‑Variablen, Secrets Manager).
Integration in den Praxisalltag
Für Marketing‑Teams und Betreiber bedeutet das: Planen Sie Kampagnen als Datensatz (CSV oder DB‑Tabelle), automatisieren Sie die Veröffentlichung per Skript und überwachen Sie die Scans mit den Nutzungsübersichten. Bei Self‑Hosted‑Installationen behalten IT‑Administratoren die Datenhoheit; die Cloud‑Option erlaubt ein schnelleres Onboarding.
Fazit und nächste Schritte
Bulk‑Updates per API vereinfachen saisonale Wechsel erheblich: Sie vermeiden Neudruck, managen Ziele zentral und können zeitgesteuert ausspielen. Nutzen Sie die gezeigten PHP‑Templates als Startpunkt, passen Sie Pfade und Feldnamen an Ihre Linkentra‑API an und testen Sie mit kleinen Gruppen bevor Sie groß ausrollen.
Jetzt ausprobieren: Linkentra entdecken und in der eigenen Umgebung testen: https://linkentra.de
Wenn Sie möchten, kann ich die Beispielskripte auf Ihre tatsächliche Linkentra‑API‑Dokumentation anpassen (Endpoint‑Pfad, erwartete Feldnamen, Authentifizierungstyp) — nennen Sie mir die Details, und ich erstelle einen fertigen Integrationsskript.
Nächster Schritt
Linkentra selbst ausprobieren
Dynamische QR-Codes mit Kontrolle über Hosting und Daten: Inhalte nachträglich ändern, Branding anpassen, Medien zentral verwalten und Scans auswerten – wahlweise auf eigener Infrastruktur (Self‑Hosted) oder sofort in der Linkentra Cloud. Editionsabhängige Funktionen für Teams, API und White‑Label.
