ADR-009: Shared Entra External ID Tenant Across Products
Date: 2026-07-07
Status: Accepted
Deciders: Pete Carroll
Context
As Waypoint and Relay are built alongside RoundTrip, a decision must be made about authentication infrastructure. Should each product have its own Entra External ID CIAM tenant, or should all three products share the existing roundtripapp tenant?
This decision affects the user experience (one login vs multiple), operational complexity, and the integration story for the Traxs One Suite.
Decision
All three Traxs products share the existing roundtripapp Entra External ID CIAM tenant. Each product gets its own app registration within the shared tenant.
Tenant: roundtripapp.onmicrosoft.com (08f09e72-40f3-4443-8fec-3a77c4c0d1ee)
App Registrations:
RoundTrip Web Client ← existing, af3f62ac-bf1d-4f66-a205-56622fa5ef22
RoundTrip API ← existing
Waypoint Web Client ← new, created when Waypoint is built
Waypoint API ← new, created when Waypoint is built
Relay Web Client ← new, created when Relay is built
Relay API ← new, created when Relay is built
b2c-extensions-app ← existing, shared across all products
One set of credentials. One user account. Access to whichever products the tenant has subscribed to is controlled by app roles.
Alternatives Considered
Option A — Separate Entra Tenant Per Product
Each product gets its own Entra External ID tenant (roundtripapp, waypointapp, relayapp).
Rejected because:
- Users need separate credentials for each product — terrible UX for a suite
- Three separate tenants means three separate user provisioning flows
- The b2c-extensions-app custom attributes (TenantId) would need to be replicated
- Three times the Entra operational complexity
- Cross-product SSO becomes a significant engineering problem
Option B — Shared Entra Tenant (selected)
All products share roundtripapp tenant. New app registrations added per product.
Selected because:
- One login works across the entire Traxs suite — seamless user experience
- User provisioning happens once — granting Waypoint access is a role assignment, not a new account
- The existing b2c-extensions-app TenantId attribute works across all products
- Significant reduction in auth infrastructure and operational complexity
- Consistent with the "one platform" positioning of the Traxs Suite
Implementation
App Roles Per Product
Each product defines its own app roles within the shared tenant:
RoundTrip: TenantAdmin, Dispatcher, Technician, BillingStaff, ReadOnly
Waypoint: WaypointAdmin, WaypointViewer, WaypointHR (future)
Relay: RelayAdmin, RelayViewer, RelaySales (future)
A user can hold roles across multiple products simultaneously. A RoundTrip TenantAdmin automatically gets Waypoint access when they subscribe — the provisioning job assigns WaypointAdmin in the same Entra user account.
TenantId Linking
The existing extension_74ae24d66fa9411095712cfddae0db04_tid custom attribute on the Entra user links to the Traxs Group TenantId. This TenantId is the same across all products — Waypoint and Relay use the same TenantId as RoundTrip to look up tenant data in their respective databases.
Token Scopes
Each product's API defines its own scope:
RoundTrip: api://c7f83f45-27cd-4bef-a6dc-f81d98077144/roundtrip.access
Waypoint: api://[waypoint-app-id]/waypoint.access ← new
Relay: api://[relay-app-id]/relay.access ← new
MSAL in each frontend requests the appropriate scope for its product.
Consequences
What becomes easier:
- Single sign-on across the entire Traxs suite with no extra engineering
- User provisioning is a single flow — one Entra invitation grants access to all products the tenant subscribes to
- The existing GraphUserService and provisioning infrastructure works for all products
- Consistent auth debugging — one tenant to check, one set of credentials to rotate
What becomes harder:
- App registration management gets more complex as products are added — must keep track of which registration belongs to which product
- App role sprawl — as each product adds roles, the tenant gets more complex
- If a product is sold or licensed separately, the auth must be disentangled from the shared tenant
Mitigation:
Document all app registrations and their purposes in the Infrastructure Reference. Keep a strict naming convention for app registrations (RoundTrip Web Client, Waypoint Web Client, Relay Web Client).