Skip to content

Tenants

Organize deployments by customer, region, or business unit.

A tenant represents a logical grouping for deployments:

Use CaseTenant Strategy
Multi-customer SaaSOne tenant per customer
Geographic regionsOne tenant per region (US, EU, APAC)
Business unitsOne tenant per department
Deployment tiersOne tenant per tier (Standard, Premium)
PropertyRequiredDescription
NameYesUnique identifier
DescriptionNoHuman-readable description
Logo URLNoBrand logo for UI display
Contact EmailNoPrimary contact

Targets can be assigned to specific tenants:

Tenant: Acme Corp
├── acme-web-01 (Production)
├── acme-web-02 (Production)
├── acme-api-01 (Staging)
└── acme-db-01 (Production)

Tenants are authorized for specific solutions in environments:

Tenant: Acme Corp
├── customer-portal (Production, Staging)
├── auth-service (Production, Staging)
└── billing-api (Production only)

Variables scoped to a tenant carry tenant-specific values. There is one variable model (not template/common types), resolved by additive specificity — see Tenant Variables.

┌─────────────────────────────────────────────────────────────┐
│ Tenants │
├─────────────────────────────────────────────────────────────┤
│ │
│ Search: [____________________________] [+ New Tenant] │
│ │
│ ┌───────────────┬──────────────┬──────────┬─────────────┐ │
│ │ Name │ Description │ Contact Email │ Created │ ·· │ │
│ ├────────────┼─────────────┼───────────────┼─────────┼────┤ │
│ │ Acme Corp │ Enterprise │ ops@acme.com │ Jan 15 │ ·· │ │
│ │ Beta Inc │ SMB │ it@beta.com │ Jan 16 │ ·· │ │
│ └────────────┴─────────────┴───────────────┴─────────┴────┘ │
│ (last column is "Controls"; there is no Targets/Solutions │
│ count column on the list) │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Acme Corp │
├─────────────────────────────────────────────────────────────┤
│ │
│ Description: Enterprise customer since 2020 │
│ Contact: admin@acme.com │
│ Created: January 15, 2024 │
│ │
│ ───────────────────────────────────────────────────────── │
│ │
│ [Overview] [Statistics] [Solutions] [Targets] [Tags] │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Assigned Targets (12) │ │
│ │ │ │
│ │ acme-web-01 ● Online Production │ │
│ │ acme-web-02 ● Online Production │ │
│ │ acme-api-01 ● Online Staging │ │
│ │ ... │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ [Edit] [Delete] │
│ │
└─────────────────────────────────────────────────────────────┘

When deploying to a tenant:

Variables are resolved with tenant values:

Deployment: customer-portal to Acme Corp (Production)
Candidates for database_host (matching scopes only), highest score wins:
global (no scope) score 0 "localhost"
tenant=Acme score 200 "db.acme.com"
tenant=Acme, environment=Production score 300 "db.acme-prod.com" ← wins

Tenants provide logical separation:

┌────────────────────────────────────────────────────────────────┐
│ Mantis Platform │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Acme Corp │ │ Beta Inc │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │
│ │ │ Targets │ │ │ │ Targets │ │ Isolated │
│ │ └──────────┘ │ │ └──────────┘ │ per tenant │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │
│ │ │ Variables│ │ │ │ Variables│ │ │
│ │ └──────────┘ │ │ └──────────┘ │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │
│ │ │ History │ │ │ │ History │ │ │
│ │ └──────────┘ │ │ └──────────┘ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ Optionally tenant-scoped: Solutions, Actions, Sequences, Envs │
└────────────────────────────────────────────────────────────────┘
Solutions, actions, sequences and environments are **optionally** tenant-scoped:
each carries a nullable `tenant_id` — `NULL` means global (shared), non-NULL means
owned by that tenant. They are not unconditionally shared.
  1. Navigate to Tenancy → Tenants in the top navigation (there is no left sidebar)
  2. Click New Tenant
  3. Enter tenant details
  4. Click Create
Terminal window
mantisctl tenant create \
--name "Acme Corp" \
--description "Enterprise customer" \
--email "admin@acme.com"

Target-to-tenant assignment and solution authorization are managed in Lens (or via the REST API); they are not exposed as mantisctl tenant subcommands. Use the tenant and target detail views in Lens to:

  • Assign targets to a tenant and scope them to an environment
  • Authorize (or revoke) which solutions a tenant may deploy per environment

Define your tenant model before deployment:

QuestionConsideration
What does a tenant represent?Customer, region, business unit
How many tenants expected?Impacts management overhead
Variable overlap?Use common variables if shared
Isolation requirements?Strict or soft boundaries
GoodAvoid
Acme Corpacme, ACME, acme-corp
US-East Regionuse1, region1
Enterprise Tiertier-1, ent

Record what each tenant represents:

Tenant: EU-West
Purpose: European customers (GDPR compliance)
Targets: eu-west-* servers
Contact: eu-ops@company.com
Special requirements: Data residency

Audit tenants periodically:

  • Remove unused tenants
  • Update contact information
  • Verify target assignments
  • Check variable values

Deployment Fails: cross-tenant or no-tenant access

Section titled “Deployment Fails: cross-tenant or no-tenant access”

Cause / errors: Accessing another tenant’s resource returns 404 Tenant not found (existence is not leaked across tenants); a tenant-less non-admin user gets 403 User account is not associated with a tenant. (There is no “Not authorized for tenant” error.)

Solution: Use a token scoped to the right tenant, or have an admin assign the user a tenant.

Cause: Required variables not set for tenant

Solution: Set tenant variable values before deployment

Cause: Target assigned to wrong tenant or environment

Solution: Verify target-tenant-environment assignments