Custom Domains
Custom domains allow organizations to access ProBeya through their own domain (e.g., obeya.yourcompany.com) instead of the default tenant.probeya.com subdomain. This provides a seamless branded experience for all users.
Overview
For organizations that need their digital transformation platform to appear as an internal tool, custom domains provide:
- Branded URLs: Users access the platform at your own domain
- CNAME-based routing: Simple DNS configuration without IP address management
- SSL/TLS certificates: Automatic certificate provisioning for secure connections
- Verification workflow: Domain ownership verification before activation
Getting Started
- Navigate to Settings > Custom Domains.
- Click Add Domain and enter your desired domain (e.g.,
obeya.yourcompany.com). - Copy the CNAME record instructions and configure them in your DNS provider.
- Wait for DNS propagation and verification (typically 5-30 minutes).
- Click Verify to trigger a server-side DNS check.
- Once DNS is verified, click Provision SSL to start certificate issuance.
- The domain becomes active when the SSL certificate is issued (typically 1-5 minutes).
How It Works
Domain Lifecycle
Custom domains progress through a strict status sequence:
| Status | Description |
|---|---|
| pending_dns | Domain registered, CNAME configuration needed |
| dns_verified | Server-side DNS lookup confirmed the CNAME is correct |
| ssl_provisioning | SSL certificate issuance in progress via ACME/Let's Encrypt |
| active | Domain is fully configured and serving traffic with HTTPS |
DNS Configuration
When an administrator adds a custom domain, the system generates a CNAME target following the pattern {orgSlug}.custom.probeya.com. The administrator must create a DNS record:
| Record Type | Host | Target |
|---|---|---|
| CNAME | obeya.yourcompany.com | acme-corp.custom.probeya.com |
DNS changes may take anywhere from 5 minutes to 48 hours to propagate, depending on the DNS provider and TTL settings.
Server-Side DNS Verification
ProBeya performs its own DNS CNAME lookup using Node.js dns.promises.resolveCname rather than trusting client-reported results. The verification checks whether any returned CNAME records match the expected target (case-insensitive, per RFC 4343). If the CNAME points to the wrong target, the system returns a descriptive error message explaining the mismatch.
SSL Certificate Provisioning
After DNS verification, administrators can trigger SSL certificate provisioning. The system uses the ACME protocol (Let's Encrypt) to issue certificates automatically. The provisioning workflow:
- Creates an ACME order for the domain
- Completes the HTTP-01 or DNS-01 challenge
- Downloads the issued certificate
- Stores the certificate in the reverse proxy layer
- Updates the domain status to
active
Routing
The middleware layer in apps/web/src/middleware.ts resolves incoming requests by checking:
- Standard subdomain pattern (
{tenant}.probeya.com) - Custom domain lookup in the
custom_domainstable - If a custom domain matches, the request is routed to the correct organization context
Tenant Isolation
Custom domain records are scoped to organizationId. Each organization can only manage their own domains. The API enforces:
- Platform-wide domain uniqueness: no two organizations can claim the same domain
- Ownership verification before activation
- Activity logging for all domain operations (creation, verification, SSL provisioning, deletion)
- Cascading cleanup when domains are removed
API Reference
| Procedure | Type | Description |
|---|---|---|
customDomains.list | Query | List all custom domains for the organization |
customDomains.create | Mutation | Register a new custom domain with CNAME instructions |
customDomains.verify | Mutation | Trigger server-side DNS CNAME verification |
customDomains.provisionSsl | Mutation | Initiate SSL certificate provisioning |
customDomains.delete | Mutation | Remove a custom domain registration |
Permissions
| Action | Required Role |
|---|---|
| View domains | Any authenticated member |
| Add domain | Admin or Owner |
| Verify domain | Any authenticated member |
| Provision SSL | Any authenticated member |
| Remove domain | Owner only (stricter due to traffic disruption risk) |
Troubleshooting
DNS verification fails with ENOTFOUND
The CNAME record has not been configured or has not propagated yet. Wait up to 48 hours and retry. Verify the record exists using nslookup or dig from your own machine.
DNS verification shows wrong target
The CNAME record exists but points to a different hostname. Update the DNS record to point to the target shown in the ProBeya UI and retry.
SSL provisioning takes longer than expected
Certificate issuance typically completes within 5 minutes. If it takes longer, check that the ACME challenge can reach the domain (no firewall blocking HTTP-01 on port 80).
Domain shows "pending_dns" after creating CNAME
DNS propagation can take up to 48 hours in some cases, though most providers complete within 30 minutes. Verify the record exists using command-line tools:
# Check CNAME record
dig CNAME obeya.yourcompany.com +short
# Or using nslookup
nslookup -type=CNAME obeya.yourcompany.com
If the record resolves correctly from your machine but ProBeya verification still fails, try again in a few minutes. The ProBeya server may be using a different DNS resolver with longer cache TTLs.
Related Features
- White-Label Branding — Customize logos, colors, and login page
- Embeddable Widgets — Branded read-only embeds for external stakeholders