Custom Domains
Eigene Kurz-Domains fuer dynamische QR-Codes verbinden, pruefen und betreiben.
Custom Domains verbinden dynamische QR-Codes mit einer eigenen Marken-Domain,
zum Beispiel go.example.com/summer statt einer neutralen Plattform-Domain.
Die Verwaltung ist im QR-Dashboard unter /qr/domains live.
Wann du Custom Domains nutzt
Nutze Custom Domains, wenn der sichtbare Scan-Link zur Marke, Kampagne oder Organisation passen soll. Das ist besonders wichtig fuer Print, Retail, Verpackungen, Events, Franchise-Strukturen und Agenturen mit mehreren Kunden.
Eine Custom Domain aendert nicht den QR-Code-Typ. Sie steuert die Redirect- Domain fuer dynamische Codes. Statische Codes enthalten ihren Payload weiterhin direkt im QR-Bild.
Setup-Ablauf
- Oeffne
/qr/domains. - Gib eine Subdomain ein, zum Beispiel
go.example.com. - QR Vello validiert den Hostname ohne Cloudflare-Mutation.
- Lege die angezeigten DNS-Records beim DNS-Provider an.
- Starte
Verify nowim Dashboard oder warte auf den Hintergrund-Check. - Warte, bis DNS und TLS aktiv sind.
- Markiere die Domain optional als Primary.
- Weise neue oder bestehende dynamische QR-Codes dieser Domain zu.
Hostname-Regeln
| Reason | Bedeutung |
|---|---|
format | Der Hostname ist syntaktisch ungueltig. |
apex_not_supported | Apex-Domains wie example.com werden nicht als QR-Kurzdomain genutzt. Verwende eine Subdomain. |
wildcard_not_supported | Wildcards wie *.example.com sind nicht erlaubt. |
platform_domain | Plattform-Domains sind reserviert. |
reserved | Der Hostname ist intern reserviert. |
hostname_taken | Die Domain ist bereits in einem Workspace belegt. |
null | Die Vorpruefung hat keinen Fehlergrund geliefert. |
DNS-Records
Die konkrete DNS-Anweisung kommt immer aus dem Wizard und aus dem Domain-Detail. Diese Records koennen erscheinen:
| Record | Zweck |
|---|---|
cname | Routet die Subdomain auf den QR Vello Edge-Host. |
ownership | Beweist, dass der Workspace die Domain kontrolliert. |
ssl_dcv | Domain-Control-Validation fuer das TLS-Zertifikat. |
ssl_dcv_delegation | Delegierter DCV-Record fuer stabilere Zertifikatspruefung. |
Unterstuetzte DNS-Typen sind TXT und CNAME. Kopiere name und value
immer exakt. Bei Cloudflare muss der CNAME fuer diese Subdomain auf DNS only
stehen, nicht auf Proxied.
Statusmodell
| Status | Bedeutung |
|---|---|
pending | Domain ist angelegt, DNS oder Ownership ist noch nicht bestaetigt. |
verifying | QR Vello prueft Cloudflare, DNS und TLS aktiv. |
active | Domain ist nutzbar und kann QR-Codes ausliefern. |
error | Eine Pruefung ist fehlgeschlagen. Details stehen in lastErrorPublic und Diagnostics. |
disabled | Domain ist bewusst deaktiviert und wird nicht fuer neue Redirects genutzt. |
Archivierte Domains haben zusaetzlich archivedAt. Sie bleiben fuer die
Restore-Frist sichtbar, damit bestehende Referenzen und Audit-Historie sauber
bleiben.
DNS-Status
| Feld | Werte |
|---|---|
dnsInstructions.cname.dnsStatus | ok, missing, wrong_target, proxied, a_record_conflict, unknown |
dnsInstructions.records[].dnsStatus | ok, missing, wrong_value, unknown |
Typische Loesungen:
missing: Record fehlt oder DNS-Propagation laeuft noch.wrong_target: CNAME zeigt nicht auf das angezeigte Edge-Target.wrong_value: TXT- oder CNAME-Wert weicht ab.proxied: Cloudflare-Proxy deaktivieren und aufDNS onlystellen.a_record_conflict: A/AAAA-Record fuer denselben Host entfernen.unknown: Resolver liefern noch kein stabiles Ergebnis.
Recommended Actions
Das Backend liefert pro Domain konkrete naechste Schritte:
| Action | Bedeutung |
|---|---|
wait_dns_propagation | DNS ist angelegt, aber noch nicht ueberall sichtbar. |
check_cname_record | CNAME fehlt, ist falsch oder wird durch A/AAAA ueberschrieben. |
check_txt_ownership_record | Ownership-TXT fehlt oder ist falsch. |
wait_tls_issuance | DNS passt, das Zertifikat wird noch ausgestellt. |
regenerate_verification | Die Verifikationsfrist sollte erneuert werden. |
contact_support | Mehrere Checks schlagen fehl, Support sollte mit Diagnose-Daten pruefen. |
verify_now | Manuelle Pruefung kann gestartet werden. |
Primary Domain
Eine aktive Domain kann als Primary markiert werden. Primary bedeutet: neue dynamische QR-Codes koennen diese Domain als Default bekommen. Bestehende Codes werden nicht stillschweigend umgezogen. Aendere sie gezielt im Code-Detail oder ueber die API, damit gedruckte Kampagnen kontrolliert bleiben.
QR-Code-Zuweisung
Custom Domains greifen bei dynamischen Codes. Beim Erstellen oder Bearbeiten
eines Codes wird customDomainId gesetzt. Die Domain muss zum aktiven Workspace
gehoeren und fuer Live-Redirects aktiv sein.
{
"type": "dynamic",
"kind": "url",
"title": "Store Mainz",
"targetUrl": "https://example.com/mainz",
"customDomainId": 42
}Im Dashboard findest du die Auswahl beim Erstellen eines Codes und im Code-Detail unter Organisation. Wenn eine Domain nicht aktiv ist, faellt das Rendering auf die verfuegbare Default-Domain zurueck oder blockiert die Aktion mit einem konkreten Hinweis.
Dashboard-Funktionen
Die Domains-Oberflaeche unter /qr/domains deckt ab:
- Liste mit
status,primaryOnlyundincludeArchived. - Detailansicht mit DNS-Anweisungen,
codesUsing,nextPollAtundnextManualVerifyAllowedAt. - Diagnostics mit
lastErrorPublic, Cloudflare-Validierungsfehlern, TLS-Zeitpunkten undkvSyncedAt. - Events und Audit-Historie pro Domain.
- Metadata-Update fuer
displayNameundnotes. - Deaktivieren, Reaktivieren, Archivieren, Restore und Bulk-Delete.
- Realtime-Updates ueber den
qr_custom_domainChannel.
Dashboard API
Diese Routen sind die interne Dashboard-API fuer authentifizierte Workspace- Sessions. Sie sind dokumentiert, aber nicht als Public-v1-Vertrag fuer fremde Server-zu-Server-Integrationen gemeint.
| Methode | Pfad | Zweck |
|---|---|---|
GET | /qr-custom-domains | Domains listen, filtern und Status-Aggregate laden. |
POST | /qr-custom-domains | Neue Domain anlegen und Wizard-Daten erzeugen. |
GET | /qr-custom-domains/:customDomainId | Detail mit DNS, Counts, Polling und Actions. |
PATCH | /qr-custom-domains/:customDomainId | Domain aktivieren/deaktivieren oder displayName und notes aendern. |
DELETE | /qr-custom-domains/:customDomainId | Soft-Delete, optional Hard-Delete mit force. |
GET | /qr-custom-domains/:customDomainId/diagnostics | Support-Diagnostics mit Cloudflare- und KV-Sync-Stand. |
GET | /qr-custom-domains/:customDomainId/events | Audit-Events, neueste zuerst. |
POST | /qr-custom-domains/validate | Hostname validieren, ohne Domain anzulegen. |
POST | /qr-custom-domains/:customDomainId/verify | Manuelle Statuspruefung starten. |
POST | /qr-custom-domains/:customDomainId/regenerate-verification | Verifikationsfrist erneuern und Polling triggern. |
POST | /qr-custom-domains/:customDomainId/set-primary | Aktive Domain als Primary setzen. |
POST | /qr-custom-domains/:customDomainId/restore | Archivierte Domain wiederherstellen. |
POST | /qr-custom-domains/bulk-delete | Mehrere Domains archivieren oder loeschen. |
Create Payload
{
"hostname": "go.example.com",
"displayName": "Retail Links",
"notes": "DNS liegt bei Cloudflare Marketing"
}Detail Response
Wichtige Felder im Domain-Detail:
id,workspaceId,hostname,displayName,notesstatus,isPrimary,codesUsingdnsInstructions.cnameunddnsInstructions.records[]cfHostnameStatus,cfSslStatus,cfValidationErrorslastErrorPublic,failureCount,lastCheckAtactivatedAt,tlsIssuedAt,tlsExpiresAt,disabledAtverificationExpiresAt,kvSyncedAtnextPollAt,nextManualVerifyAllowedAtrecommendedActions
Webhooks und Realtime
Custom-Domain-Lifecycle-Events werden im Dashboard und in Webhooks verwendet:
custom_domain.createdcustom_domain.activatedcustom_domain.errorcustom_domain.enabledcustom_domain.disabledcustom_domain.primary_changedcustom_domain.tls_renewedcustom_domain.archivedcustom_domain.restoredcustom_domain.deletedcustom_domain.metadata_updated
Der Realtime-Channel heisst qr_custom_domain. Clients koennen den aktiven
Workspace abonnieren oder eine workspaceId uebergeben, wenn die Membership
das erlaubt.
Public API Status
Die stabile Public API v1 dokumentiert aktuell QR-Codes unter
/docs/qr/api-reference-v1. Custom-Domain-
Automation ist im Produkt vorhanden, aber noch nicht als eigenstaendige
Public-v1-Ressource freigegeben. Fuer externe Provisionierung oder Agentur-
Workflows sollte der Use Case ueber Support oder Enterprise abgestimmt werden,
bis eine stabile /v1/custom-domains-Flaeche veroeffentlicht ist.
Troubleshooting
| Problem | Loesung |
|---|---|
Domain bleibt pending | CNAME und Ownership-TXT exakt pruefen, danach Verify now starten. |
CNAME ist proxied | Bei Cloudflare die orange Wolke deaktivieren und DNS only setzen. |
| TLS haengt | ssl_dcv oder ssl_dcv_delegation Records pruefen und DNS-Propagation abwarten. |
Domain ist active, Redirect geht aber nicht | kvSyncedAt, activatedAt und Diagnostics pruefen. |
| Verifikation abgelaufen | regenerate-verification ausloesen und neue Records aus dem Wizard kopieren. |
| Viele Codes nutzen die Domain | Vor Archivierung codesUsing pruefen und Codes gezielt umstellen. |