Different sub-systems take care of functional domains like events, organizations, services and templates.

Each sub-system maintains a number of entities that are stored separately. These entities are signified in the following diagram:




  • Green: organization domain
  • Purple: events domain
  • Salmon: services domain
  • Yellow: templating domain


Something that may not be immediately clear when using Emcee, is its multi-tenant characteristics, entirely separating data of different organizations. As long as organizations aren't shared by multiple users (that would be a later feature), they are just silently created when a users signs in for the first time.

Users can sign up using accounts from third-party OAuth providers, such as Facebook and GitHub, so that the user entity needs only store an identifier from their respective OAuth provider. Native users are supported via the native user entity (i.e. user name and password credentials accepted via form login or HTTP BASIC authentication), although this functionality isn't currently exposed (that would be another later feature).

Contacts are different than users, in that they only represent a single contact detail, such as an e-mail address or (later features) a phone number for text messages, or the identifier from your favorite chat network (e.g. Slack). Users and contacts can be organized in teams (in any number of those). Either contacts or teams can be associated with services and service groups (associated user entity).

Services and service groups can be associated with events (event association entity), and thus by extension their associated contacts or teams are associated with these events. Read more about the status of an event.

Events are also saved with the scheduled notifications that a user configures for them. When scheduled notifications are actually scheduled, an action entity is created, to be associated with a Quartz job. A scheduled notification is associated with an existing template. When the notification is prepared (for the configured schedule), the template is filled with data from the event. For this purpose an event may already have a number of entered line items, otherwise it can derive details from the event, all to substitute line item types from a template into the real notification.