Zum Hauptinhalt springen

QR-Links

Zweck

QrLink modelliert einen brandbaren, getrackten QR-Code. Pro Link werden ein eindeutiger Slug (URL-ID), eine Ziel-URL, ein optionales Logo und ein vollständig editierbarer Style (Punkt-/Eck-Stil, Farben, Hintergrund, Fußtext) gepflegt. Anwender (Vertrieb, Marketing, Innendienst) erzeugen QR-Codes z. B. für:

  • Marketing-Kampagnen mit einheitlicher Optik (Sommer-Aktion, Messe-Stand)
  • Aufkleber an Geräten / Anlagen mit Link zur Anlagen-Doku oder Wartungs-Portal
  • Druck-QR-Codes auf Briefpapier / Rechnungen für schnelle Selbstbedienung
  • Event-Codes mit Konversions-Tracking (Anmeldung, Lead-Capture)

Beim Scan landet der Nutzer auf einer Public-Landing-Page unter /q/{slug}, sieht den QR-Code nochmals zur Verifikation und ein „Fortfahren"-Button. Erst der Klick auf „Fortfahren" leitet auf die Ziel-URL weiter — und löst die getrackte Confirmed-Conversion aus (anonym + DSGVO-freundlich, siehe QR-Link-Tracking).

Voraussetzungen

- Berechtigung `view:FE_QrLink`, `view:QrLink`. - Für Anlage/Update/Löschung: `create`/`update`/`delete:QrLink`. - Für Statistiken: `view:QrLinkScan`. - Für Templates (Quick-Style-Übernahme): `view:QrLinkTemplate`. - Für Custom-Logo: `view:Document` und ein hochgeladenes Logo-`Document`.

Berechtigungen (CASL)

ActionSubjectWirkung
viewFE_QrLink, QrLinkListe und Editor aufrufbar
createQrLinkNeuen QR-Link anlegen (Slug optional, sonst auto-generiert)
updateQrLinkFelder ändern (Slug ist nach Anlage unveränderlich)
deleteQrLinkSoft-Delete (Scans bleiben erhalten)
viewQrLinkScanStatistiken lesen
viewQrLinkTemplateTemplate-Picker im Editor
viewDocumentCustom-Logo auswählen

Datenmodell

FeldPflichtTypWirkung
slugoptional bei Create, unique pro MandantString 3–64, Regex ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$URL-Teil hinter /q/. Auto-generiert (8-Zeichen-Mix) wenn leer. Unveränderlich nach Anlage.
nameneinString (255)Interner Label (Listen-Anzeige), nicht öffentlich.
targetUrlnein (Pflicht bei targetType = url)String (2048)Ziel-URL, auf die nach Bestätigung weitergeleitet wird. Wird ignoriert bei targetType = businessCard.
targetType (seit Welle 137)jaENUM (url | businessCard)Steuert das Ziel: externe URL (Default) oder eine Visitenkarte.
targetBusinessCardId (seit Welle 137)nur bei targetType = businessCardUUID → BusinessCardPflicht-Feld bei BC-Ziel. Beim Scan wird auf /c/{bc.slug} weitergeleitet.
activejaBooleanfalse → Public-Resolve liefert 404.
withLogoneinBooleanLogo in QR-Code-Mitte einbetten.
logoDocumentIdneinUUID → DocumentCustom-Logo. Fallback: Mandanten-Logo aus UiConfig.
textBelowneinString (255)Fußtext unterhalb des QR-Codes (Export + Landing).
textSizeneinIntegerSchriftgröße des Fußtextes in Punkten. Default 12, erlaubt 6–72.
styleJsonneinJSON (QrStyleConfig)Custom-Style. Bei null greift der Mandanten-Standard aus UiConfig.
templateIdneinUUID → QrLinkTemplateReferenz auf zuletzt angewandtes Template (Audit).
ownerEmployeeIdnein (auto)UUID → EmployeeErsteller — wird beim Create aus dem Token gesetzt.
sequenceIdautoIntegerLesbare Nummer (z. B. für RefLinks).

styleJson (QrStyleConfig)

{
"dotsType": "rounded",
"dotsColor": "#1a202c",
"cornersSquareType": "extra-rounded",
"cornersSquareColor": "#1a202c",
"cornersDotType": "dot",
"cornersDotColor": "#1a202c",
"backgroundColor": "#ffffff",
"backgroundTransparent": false,
"logoSize": 0.3,
"textColor": "#1a202c",
"textSize": 12
}
  • dotsType: square | dots | rounded | classy | classy-rounded | extra-rounded
  • cornersSquareType: square | dot | extra-rounded
  • cornersDotType: square | dot
  • backgroundTransparent: aktiviert Alpha-Channel im PNG-Export (JPEG bleibt immer weiß)

Schritt-für-Schritt-Anleitung

  1. QR-Links (/qr-links) öffnen → + Hinzufügen.
  2. SpeamCore generiert automatisch einen Slug (z. B. kvj8m21h). Der Slug ist anschließend nicht mehr änderbar, daher bei Bedarf vor dem Speichern überschreiben.
  3. Name + Weiterleitung (Ziel-URL) eintragen.
  4. Optional Template anwenden (Quick-Branding) oder Style manuell pflegen (siehe unten).
  5. Active auf true setzen, sobald der Link veröffentlicht werden soll.

Style konfigurieren

Im Editor stehen zwei Modi zur Verfügung:

  • Mandanten-Standard verwenden (Default-Toggle aktiv) — der Link erbt die Farben/Stile aus UiConfig. Praktisch für Kampagnen mit unified Look.
  • Custom Style — alle Style-Felder werden sichtbar. Punkt-/Eck-Stil, Farben, Hintergrund (auch transparent), Fußtext + Schriftgröße.

Mit Template anwenden wird ein vorgespeichertes Style-Set übernommen (siehe QR-Link-Templates).

Logo einbetten

  1. Logo verwenden aktivieren.
  2. Optional ein Custom-Logo hochladen (Document über das Dokumenten-Modul) und als logoDocumentId zuweisen.
  3. Ohne Custom-Logo greift automatisch das Mandanten-Logo aus UiConfig.

Live-Vorschau + Export

Der Editor zeigt rechts neben den Formular-Feldern eine Live-Vorschau, die bei jeder Änderung neu rendert. Mit den Export-Buttons stehen drei Formate bereit:

FormatEignung
PNGWeb-Use, optional mit transparentem Hintergrund
JPEGDruck, weißer Hintergrund (kein Alpha)
SVGDruck-/Plot-Use, skalierbar, Fußtext im SVG eingebettet

Statistik-Tab

Wechsel auf /qr-links/:id/stats (Tab Statistiken) öffnet die Scan-Auswertung:

AnzeigeInhalt
ImpressionsAnonyme Landing-Page-Aufrufe (Tracking ohne Cookie)
Scans (Confirmed)User klickte „Fortfahren" — wurde auf Ziel-URL weitergeleitet
Unique DevicesDistinct deviceCookieId der Confirmed-Scans (1-Jahres-Cookie)
Daily Line-ChartImpressions vs. Confirmed pro Tag im Range
By CountryTop-Länder (Cloudflare-Header CF-IPCountry)
By UA-FamilyChrome / Safari / Firefox / Edge / Other
By Device-Typemobile / tablet / desktop

Range über Date-Picker einstellbar — Default 30 Tage zurück.

Details zum Tracking-Modell und der Datenschutz-Architektur: QR-Link-Tracking.

Statt einer externen URL kann ein QR-Link auch eine Visitenkarte als Ziel haben:

FeldWert
targetTypebusinessCard
targetBusinessCardIdUUID der BusinessCard
targetUrlwird ignoriert

Scan-Verhalten unterscheidet sich von targetType = url:

  • SpeamCore resolved beim Scan direkt den BC-Slug und leitet auf /c/{slug} weiter.
  • Kein Bestätigungs-Screen — Tracking-Modus wird intern auf anonymous forciert.
  • Impressions werden im BusinessCardEvent (kind = impression) der BC geloggt, nicht im QrLinkScan. Die Statistik liegt also bei der Visitenkarte.
  • Wird die BusinessCard deaktiviert oder gelöscht, liefert der QR-Link 404.

Anwendungsfall: Druck-Aufkleber an Servicewagen oder Anlagen-Schildern, die direkt zur Visitenkarte des Außendienst-Mitarbeiters führen — statt zu einer Marketing-URL.

Workflows und Zustände

active = false und Soft-Delete führen beide zu 404 auf der Public-Route — Scans werden nicht mehr getrackt. Bestehende QrLinkScan-Datensätze bleiben für historische Statistiken erhalten.

Verknüpfungen zu anderen Modulen

Häufige Fehler und Lösungen

FehlerLösung
Public-Landing zeigt 404active = false oder Link ist gelöscht (Soft-Delete). Im Editor reaktivieren oder neu anlegen.
Slug-Eingabe ist disabledSlug ist nach Anlage unveränderlich. Bei Bedarf neuen Link mit gewünschtem Slug anlegen und alten deaktivieren.
Vorschau ohne Logo trotz withLogo = trueWeder Custom-Logo noch Mandanten-Logo in UiConfig gepflegt — eines hinterlegen.
JPEG-Export hat weißen statt transparenten HintergrundJPEG unterstützt keinen Alpha-Channel — PNG-Export wählen.
Style-Felder sind verstecktToggle Mandanten-Standard verwenden ist aktiv. Deaktivieren, um Custom-Style zu pflegen.
KPI „Unique Devices" wirkt zu niedrigZählt nur Confirmed-Scans (mit Cookie). Pure Impressions bleiben außen vor — das ist Absicht (Privacy-by-Design).
Stats-Tab leer trotz ScansRange-Filter prüfen — Default-Range geht 30 Tage zurück.

API/Schnittstellen

Authentifiziert

MethodeEndpointZweckCASL
GET/api/qr-linksListe (paginiert, filterbar, sortierbar)view QrLink
POST/api/qr-linksAnlegen — Slug optional (Auto-Gen mit 8 Zeichen, Retry-Logik)create QrLink
GET/api/qr-links/:idDetailview QrLink
PATCH/api/qr-links/:idUpdate — Slug-Änderung wird mit 400 abgelehntupdate QrLink
DELETE/api/qr-links/:idSoft-Deletedelete QrLink
GET/api/qr-links/:id/stats?from=YYYY-MM-DD&to=YYYY-MM-DDAggregierte Statistikview QrLinkScan

Public (keine Auth)

MethodeEndpointTrackingZweck
GET/api/qr-public/:slugResolve (slug → name, targetUrl, style); 404 bei inactive/deleted
POST/api/qr-public/:slug/impressionkind=impression, neue UUID, kein IP-HashAnonymer Landing-Aufruf
POST/api/qr-public/:slug/confirmkind=confirmed, persistente UUID, IP-Hash (täglich rotierend)User-Bestätigung → Redirect zur Ziel-URL

Versionshinweise

  • 2026-05-20 (Welle 130): Initiale Veröffentlichung. Quelle: BE-Commit 2813f706 (Service + 8 Migrationen), FE-Commit 8972bf94 (Editor, Stats-Panel, Public-Page). 3 BE-Modelle (QrLink, QrLinkScan, QrLinkTemplate), 9 API-Endpoints (5 auth + 3 public + Stats), 4 FE-Komponenten (QrLinkEditor 971 Z., QrLinkPreview 149 Z., QrLinkStatsPanel 364 Z., QrLinkPublicPage 426 Z.), Style-Cascade (QrLink → UiConfig → Default), Privacy-orientiertes Tracking-Modell (siehe Konzept).
  • 2026-05-21 (Welle 137): Neue Felder targetType (url | businessCard) und targetBusinessCardId — ein QR-Link kann jetzt direkt auf eine Visitenkarte zeigen statt auf eine externe URL. Beim BC-Ziel: kein Bestätigungs-Screen, Tracking läuft als anonymer BusinessCardEvent mit kind = impression. Public-Page-Shell wird gemeinsam mit dem Visitenkarten-Modul verwendet (PublicPageShell-Komponente). Quelle: FE 6430804b, BE 179f8adc.