The Custom Domains app lets users connect their own domains to biolinks and shortlinks. It handles DNS verification, SSL certificate provisioning, and target app routing. Routes are under /business/apps/domains/.
pending — DNS records not yet verified
verified — DNS CNAME record confirmed
failed — DNS verification failed
provisioning — SSL certificate being issued
active — SSL certificate active
failed — SSL provisioning failed
biolinks — Route to Bio Links
shortlinks — Route to Short Links
- Empty/Any — No specific target
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-001 | Domains page loads | User is logged in | Navigate to /business/apps/domains | Page shows header, “Add Domain” button, Settings nav card, and domain list | P0 |
| DM-002 | Domain list displays correctly | Domains exist | View domain list | Each row shows domain name, target app (if set), default star icon (if default), verification status badge, and SSL status badge | P0 |
| DM-003 | Verification status badges render | Domains with various statuses | View list | Verified = green with check icon, Pending = yellow with clock icon, Failed = red with X icon | P1 |
| DM-004 | SSL status badges render | Domains with various SSL states | View list | Active = green, Provisioning = yellow, Failed = red | P1 |
| DM-005 | Default domain shows star icon | A domain is set as default | View list | Star icon appears next to default domain name | P1 |
| DM-006 | Empty state when no domains | No domains exist | View page | ”No custom domains yet” message shown | P1 |
| DM-007 | Domain row links to detail | Domains exist | Click on a domain row | Navigates to /business/apps/domains/{id} | P0 |
| DM-008 | Settings nav card links correctly | User is logged in | Click “Settings” card | Navigates to /business/apps/domains/settings | P2 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-010 | Toggle add domain form | User is logged in | Click “Add Domain” button | Form card appears with Domain input, Target App dropdown, and Add button | P0 |
| DM-011 | Add domain with valid input | User is logged in | 1. Enter “links.mybrand.com” 2. Select target app “Bio Links” 3. Click “Add” | Domain is added; success toast “Domain added!”; form closes; list refreshes | P0 |
| DM-012 | Add domain without target app | User is logged in | Enter domain, leave target as “Any”, submit | Domain added with no specific target app | P1 |
| DM-013 | Add domain - domain required | User is logged in | Leave domain field empty, click “Add” | Validation error on domain field | P0 |
| DM-014 | Add domain with biolinks target | User is logged in | Enter domain, select “Bio Links”, submit | Domain created with target_app: "biolinks" | P0 |
| DM-015 | Add domain with shortlinks target | User is logged in | Enter domain, select “Short Links”, submit | Domain created with target_app: "shortlinks" | P0 |
| DM-016 | Add domain shows loading state | User submits form | Observe Add button | Spinner appears; button disabled during request | P2 |
| DM-017 | Add domain server error shows toast | Server returns error (e.g., duplicate domain) | Submit form (simulated error) | Error toast with server error message | P1 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-020 | Detail page loads for owner | Domain exists, user is owner | Navigate to /business/apps/domains/{id} | Page shows domain name, target app, DNS setup instructions, CNAME value with copy button, verification status, SSL status, and action buttons | P0 |
| DM-021 | DNS instructions display CNAME value | Domain loaded | View DNS Setup section | CNAME record value shown in monospace code block with copy button | P0 |
| DM-022 | Copy CNAME value to clipboard | Detail page loaded | Click copy button next to CNAME value | Value copied to clipboard; success toast “Copied to clipboard!” | P1 |
| DM-023 | Verification and SSL statuses display | Domain loaded | View Status section | Verification status and SSL status shown in two-column grid with colored badges | P0 |
| DM-024 | Default domain indicator | Domain is set as default | View detail page | Star icon with “Default domain” text displayed | P1 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-030 | Trigger DNS verification | Domain exists | Click “Verify Now” button | Verification check initiated; success toast; status may update to verified or remain pending | P0 |
| DM-031 | Verification success updates status | DNS records are correctly configured | Click “Verify Now” | Verification status changes to verified with green badge | P0 |
| DM-032 | Verification failure shows status | DNS records are misconfigured | Click “Verify Now” | Verification status remains pending or changes to failed | P1 |
| DM-033 | SSL provisioning after verification | Domain just verified | Observe SSL status | SSL status transitions to provisioning and eventually active | P1 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-040 | Set domain as default | Domain is not default | Click “Set as Default” button | Domain becomes default; success toast; star indicator appears | P0 |
| DM-041 | Set as Default hidden for default domain | Domain is already default | View action buttons | ”Set as Default” button is not rendered | P1 |
| DM-042 | Remove domain with confirmation | Domain exists | Click “Remove Domain” button, confirm browser dialog | Domain is deleted; user redirected to /business/apps/domains | P0 |
| DM-043 | Cancel remove domain | Remove confirmation shown | Click cancel in browser confirm dialog | Domain remains; user stays on detail page | P2 |
| DM-044 | Remove domain server error | Server error on removal | Click “Remove Domain” (simulated failure) | 500 error returned with error message | P1 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-050 | Unauthenticated user gets empty data | User not logged in | Navigate to domains list | Empty domains array returned; no server error | P1 |
| DM-051 | Non-owner gets 403 on detail | Logged in as different user | Navigate to another user’s domain | 403 error thrown | P0 |
| DM-052 | Non-existent domain returns 404 | Invalid domain ID | Navigate to /business/apps/domains/nonexistent | 404 “Domain not found” error | P1 |
| DM-053 | Unauthenticated user gets 401 on actions | Not logged in | Submit verify/set-default/remove action | 401 error thrown | P0 |
| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|
| DM-060 | Settings page loads | User is logged in | Navigate to /business/apps/domains/settings | Page renders with header and “Domain settings coming soon” placeholder | P2 |
| DM-061 | Back button navigates to domains list | User is on settings page | Click back arrow | Navigates to /business/apps/domains | P2 |