-
Notifications
You must be signed in to change notification settings - Fork 15
Multi Tenancy Pitfalls
Part of the Multi-tenancy section. Planned / in design.
Multi-tenancy is powerful, but a few traps are worth knowing about. Most are handled by design β this page explains how.
The single most dangerous mistake for staff: you're working "as" Acme, but you meant to reply to a Globex ticket. The defence is in the UI β the active company is shown loudly at all times, and cross-company search results are badged with their client. Always glance at the current-company indicator before replying.
Never map gmail.com, outlook.com, yahoo.com, etc. to a company. Two different clients will both have users on those domains, so mapping one would wrongly pull everyone on Gmail into a single client. Free-email senders go to triage and are assigned by hand.
If a client emails in before you've registered their domain, their message doesn't error or vanish β it lands in the triage queue, ready to be assigned (and the domain remembered for next time). See Email Routing.
Some settings are global (mailbox connections, AI keys, the company list, staff), some are per-company (domains, SLAs, categories, branding). For config that could go either way β categories, SLAs, workflows β FreeITSM uses global defaults with per-company overrides, so you never have to flip a risky "global or per-company?" switch. See Settings.
FreeITSM keeps all companies in one database, separated by a company tag on every record β logical isolation, not physical. This is deliberate and keeps the system lightweight. If a client contractually requires their data in a physically separate database, their own encryption keys, or a specific data-residency region, FreeITSM is honestly not the right tool β see Scope.
Because a requester is a single global person (keyed by verified email), the same address is never split into two conflicting accounts β one person has one login, and their tickets are filed per company. See Users & self-service.
Multi-tenancy touches every module, and the biggest engineering risk is a single overlooked query leaking one client's data into another's view. That's why it's built one module at a time, behind the scenes, with every step kept backward-compatible and invisible until it's proven. You will never be asked to pull a half-finished state onto your live system β main stays stable throughout. See the roadmap issue (#24).
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)