Tenant Service — Event Schemas
Status: populated Owner: TBD Last updated: 2026-04-18 Companion: Service Template · 04 Events · NAMING
NATS stream: TENANT (subjects tenant.>)
Retention class: 7 years for lifecycle events; 90 days for config events.
EventEnvelope: { id, subject, version, tenantId, occurredAt, payload }.
1. Events produced
1.1 Tenant lifecycle
| Event | Subject | Version | Retention |
|---|---|---|---|
| TenantCreated | tenant.tenant.created.v1 | v1 | 7 years |
| TenantActivated | tenant.tenant.activated.v1 | v1 | 7 years |
| TenantSuspended | tenant.tenant.suspended.v1 | v1 | 7 years |
| TenantReactivated | tenant.tenant.reactivated.v1 | v1 | 7 years |
| TenantTerminated | tenant.tenant.terminated.v1 | v1 | 7 years |
| TenantUpdated | tenant.tenant.updated.v1 | v1 | 90 days |
| TenantConfigChanged | tenant.config.changed.v1 | v1 | 90 days |
| SubscriptionUpdated | tenant.subscription.updated.v1 | v1 | 7 years |
| SubscriptionExpired | tenant.subscription.expired.v1 | v1 | 7 years |
tenant.tenant.activated.v1 payload:
{
"tenantId": "ten_01H...",
"slug": "kabul-central-hospital",
"rootNodeId": "nod_01H...",
"hierarchyProfileId": "AFG_MOPH",
"activatedAt": "2026-04-18T10:00:00Z"
}
tenant.tenant.suspended.v1 payload:
{
"tenantId": "ten_01H...",
"reason": "Non-payment",
"suspendedBy": "usr_01H...",
"suspendedAt": "2026-04-18T12:00:00Z"
}
tenant.subscription.expired.v1 payload:
{
"tenantId": "ten_01H...",
"subscriptionEnd": "2026-04-17",
"tier": "PROFESSIONAL"
}
1.2 Hierarchy
| Event | Subject | Version | Retention |
|---|---|---|---|
| HierarchyNodeCreated | tenant.hierarchy_node.created.v1 | v1 | 90 days |
| HierarchyNodeUpdated | tenant.hierarchy_node.updated.v1 | v1 | 90 days |
| HierarchyNodeArchived | tenant.hierarchy_node.archived.v1 | v1 | 7 years |
1.3 Membership and RBAC
| Event | Subject | Version | Retention |
|---|---|---|---|
| UserProfileCreated | tenant.user_profile.created.v1 | v1 | 7 years |
| OrgMembershipCreated | tenant.org_membership.created.v1 | v1 | 7 years |
| OrgMembershipRemoved | tenant.org_membership.removed.v1 | v1 | 7 years |
| RoleAssigned | tenant.role_assignment.created.v1 | v1 | 7 years |
| RoleRevoked | tenant.role_assignment.removed.v1 | v1 | 7 years |
| UserInvited | tenant.user.invited.v1 | v1 | 90 days |
tenant.role_assignment.created.v1 payload:
{
"tenantId": "ten_01H...",
"userId": "usr_01H...",
"roleCode": "CLINICIAN",
"nodeId": "nod_01H...",
"assignedBy": "usr_01H...",
"assignedAt": "2026-04-18T09:00:00Z"
}
2. Events consumed
| Event | Subject | Producer | Action |
|---|---|---|---|
| UserRegistered | identity.user.registered.v1 | identity-service | JIT create UserProfile |
| UserSuspended | identity.user.suspended.v1 | identity-service | Suspend all OrgMemberships |
| UserDeactivated | identity.user.deactivated.v1 | identity-service | Remove memberships; anonymize profile |
3. Legacy subject aliases (dual-publish until M2)
| Legacy subject | New subject |
|---|---|
tenant.created | tenant.tenant.created.v1 |
tenant.activated | tenant.tenant.activated.v1 |
tenant.suspended | tenant.tenant.suspended.v1 |