For AWS access and account requests, see the Platform Catalog and AWS Access Guide .
All frontend services run in two accounts:
Account Purpose Region Production (214061306515)Live traffic (prod) eu-central-1 Non-production (213617179136)Sandboxes, test, preprod eu-central-1
WAF stacks are the exception — deployed to us-east-1 (required for CloudFront).
Stage Account Lifecycle URL Pattern Sandbox Non-prod Temporary (auto-created, auto-deleted) frontend-<branch>.<service>.ui-test.hema.digitalTest Non-prod Permanent (auto-deployed on main) Preview URLs via gateway registration Production Prod Permanent (manual approval for gateway) www.hema.nl / www.hema.com
Aspect Sandbox Test Production Manual approval ✗ ✗ ✓ Monitoring & alarms ✗ ✓ ✓ WAF ✗ ✗ ✓ Spot instances ✓ (cost saving) ✗ ✗ E2E tests (Playwright) ✗ ✓ ✗ Auto-cleanup on branch delete ✓ ✗ ✗ terminationProtection✗ ✗ ✓
Environment Branch Trigger Production mainPush + manual approval Test mainPush (automatic) Sandbox feature/*, fix/*, chore/*Butler push
Environment Branch Trigger Dataset Studio URL Production mainPush productionhema-cms.sanity.studioPre-production mainPush preprodpreprod-hema-cms.sanity.studioStaging mainGit tag stagingstaging-hema-cms.sanity.studioSandbox feature/*Push <branch>_sandbox<branch>-sandbox-hema-cms.sanity.studio
CMS sandboxes create a new Sanity dataset automatically and are cleaned up on branch deletion.
Environment Branch Trigger Domains Production mainPush + manual approval www.hema.nl, www.hema.comIntegration integrationPush Internal preview domains Beta beta/*Push Preview domains Test mainPush *.omni-web-gateway.experience-dev.hema.digitalSandbox feature/*Butler push Temporary preview domains
Every service uses the Environment interface from @hema/common-types:
name : string ; // "prod", "test1", "feature-cofi-123"
service : string ; // "omni-web-content"
component : string ; // "frontend"
temporary : boolean ; // true for sandboxes
configurationName : string ; // "prod" | "int" | "test"
configurationName determines which SSM parameters are loaded — multiple environment names can share the same config (e.g., all sandboxes use test config).
Path Purpose /hema/global/authKong OAuth credentials (Secret) /hema/global/business-base-urlInternal API base URL /hema/global/gateway/account-idGateway account for RAM sharing /hema/<service>/<configName>/base-urlPublic domain per environment /hema/<service>/sanity/project-idSanity project ID /hema/<service>/<configName>/sanity/datasetSanity dataset per environment
Path Service Contents /hema/global/authAll MFEs Kong OAuth { clientId, clientSecret } /hema/global/basic-authGateway/E2E Preview basic auth /hema/<service>/sanityMFEs Sanity { apiReadToken } <stage>/cms-env-varsCMS All CMS env vars bundled
Pattern Example <project>-cicontent-main-ci<project>-rtcontent-main-rt<project>-monitoringomni-web-gateway-prod-monitoring<project>-wafomni-web-gateway-prod-waf
Butler sandboxes: <service>-<branch>-ci, <service>-<branch>-rt