Domains
Two different things called domains: custom hostnames that serve your pages, and email domains that prove your people
Ulsav uses the word domain for two features, and confusing them wastes an afternoon. A custom domain puts your Event on your own hostname. An email domain proves you control a mail domain used for identity.
Custom domains: your hostname, your page
A custom domain maps one hostname to one public target.
| Target | What the hostname serves |
|---|---|
| Event | That Event's page on the market |
| EventSeries | That series page on the market |
| EventGroup | That group's portal |
| EventGroupSeries | That group series page on the market |
A hostname is claimed platform-wide, not per Organization. Once tickets.example.org belongs to anyone, nobody else can claim it, even while it is pending.
Each target may have one canonical domain, the address its links prefer. A second canonical domain for the same target is refused until you disable the first. Disabling frees the target; deleting removes it.
Proof and routing records
Connecting a hostname produces two DNS records.
- Ownership. A TXT record at the hostname with the value
ulsav-site-verification=<token>. Its presence proves you control the name. - Routing. A CNAME from the hostname to the Ulsav edge target, usually
cname.ulsav.com.
Verification checks ownership first, then asks the edge to serve the host. If ownership passes but the edge is not ready, the domain sits in verified with a message explaining what to fix.
Apex domains cannot hold a CNAME
A two-label name such as example.com is treated as an apex. Point it at the Ulsav edge using your DNS provider's ALIAS, ANAME, or CNAME-flattening feature, or connect a subdomain such as tickets.example.com instead.
Ulsav's own hosts are refused as customer hostnames: ulsav.com, anything under it, and the edge target itself.
The five states
| State | Meaning | Serves traffic |
|---|---|---|
| Pending | Created, ownership not proven yet | No |
| Verified | Ownership proven, edge not ready | No |
| Active | Ownership proven and edge serving with a certificate | Yes |
| Error | A lookup or edge call failed; the message says which | No |
| Disabled | Switched off on purpose; the row is kept | No |
Disabling releases the hostname at the edge so it stops serving and stops costing money. Deleting removes the edge hostname first and the row second, so a failure leaves the row in place to retry.
Who can do what
Reading needs domains.read; connecting, verifying, disabling, and deleting need domains.create, domains.verify, domains.update, and domains.delete respectively.
Host resolution returns a target kind and an opaque ID, never authority; a custom hostname never grants dashboard access.
Email domains: proving a mail domain
A verified email domain answers a different question: "are these people really from that organization?" You claim a domain such as students.example.edu, prove control with a TXT record, and Ulsav can then use it for sign-in routing and access rules.
| Detail | Rule |
|---|---|
| Uniqueness | Globally unique across Ulsav; first claim wins |
| Proof record | TXT with ulsav-email-domain-verification=<token> |
| States | Pending and verified only |
The proof prefix differs from the hostname prefix, so the two claims can never be confused.
Ownership is the whole point: the domain never serves a website, and it is not the same thing as a hostname domain.
Identity providers
An Organization can connect one identity provider, using OIDC or SAML. The connection stores who the provider is, the credentials, the permitted redirects, and an enable switch.
| Setting | Behaviour |
|---|---|
| Type and issuer | Fixed at creation; recreate the connection to change them |
| Client secret, SAML key | Encrypted at rest; supplying one refuses the call when the platform key is not configured |
| Redirect URIs | Allowlist; an unregistered redirect fails instead of bouncing silently |
| Scope | Organizer, attendee, or both |
| Enabled | Disabling stops every sign-in through it |
Ulsav can start an OIDC flow, exchange the code, and validate a SAML assertion against it. It creates no membership; access still comes from Roles.
Eligibility records are separate time-boxed facts that an Account satisfies a condition through a provider or a verified email domain; they default to 30 days.
Edge cases
| Situation | Result |
|---|---|
| Hostname claimed by anyone | Refused as taken, even while pending |
| Second domain for one target | Refused until the first is disabled |
| TXT present, CNAME missing | Verified, not active |
| TXT missing | Pending with a message, not an error |
| Email domain claimed elsewhere | Refused as taken |
| Edge call fails during delete | Row kept so you can retry |
Related
- Event Groups and Series — the portal a group domain serves
- Visibility — what a public page shows once it is reachable
- Roles — who may manage domains and single sign-on
- Organizations — the workspace these domains belong to