We maintain a deployment checklist in Notion that every new JekCMS installation completes before client handoff. The checklist covers 30 items across six categories: environment configuration, database setup, SMTP verification, cache warm-up, a functional test of every admin section the client will use, and a security review. The checklist has caught configuration errors that would have caused problems in production on seven of the last forty deployments.

Keeping Client Customisations Separate

Client customisations live in a dedicated client/ directory that sits outside the core JekCMS directory tree. This means JekCMS can be updated without touching client files. The functions.php in the client directory uses the standard hook API to modify behaviour; if JekCMS changes the hook signatures in a major release, only the client directory needs updating, not the core.

Agency Licensing at Scale

For licensing, we use JekCMS Agency licenses, which cover up to 25 installations per agency seat. Each client site gets a unique license key tied to their domain. If a client churns, we deactivate the key. The licensing dashboard shows which sites are active, when each license expires, and whether each site is running the current JekCMS version.

Support Escalation That Actually Works

Support escalation follows a defined path: the client emails the project manager, who triages within four business hours. Bugs in JekCMS core go to the JekCMS support channel; client-specific issues — theme problems, content questions, admin panel usage — stay internal. We do not give clients direct SSH or database access; all changes go through the CMS or a documented deployment process with a rollback step.

Deployment Automation with Scripts

Manual deployments do not scale beyond five clients. We maintain a deployment script that handles the full lifecycle of a new JekCMS installation:

#!/bin/bash
# deploy-client.sh - New JekCMS client deployment
SITE_SLUG=$1
DOMAIN=$2

# Clone base installation
cp -r /opt/jekcms-base /var/www/$SITE_SLUG

# Generate unique config
php tools/generate-config.php \
 --slug=$SITE_SLUG \
 --domain=$DOMAIN \
 --db-name=jekcms_$SITE_SLUG

# Run database setup
mysql -u root -p < database/schema.sql

# Set permissions
chmod 755 cache/ uploads/ logs/
chown -R www-data:www-data /var/www/$SITE_SLUG

The script runs in under 90 seconds and produces a working JekCMS installation with the correct database, configuration, and file permissions. We log every deployment in a shared spreadsheet with the date, client name, domain, and JekCMS version.

Rolling Updates Across Client Sites

When a new JekCMS version is released, we update all client sites within 72 hours. The update process uses the built-in Updater class, which creates a backup before applying changes. Our update script iterates through all client directories and runs the update for each:

# Update all client sites
for site in /var/www/clients/*/; do
 php "$site/tools/update.php" --auto-backup
done

We verify each update by checking the site's version.json and running a quick smoke test (homepage loads, admin login works, latest post displays correctly). Sites that fail the smoke test are rolled back automatically and flagged for manual investigation.

Billing and License Management

License Key Lifecycle

Each client receives a unique license key tied to their domain. The key lifecycle follows a defined process:

  • Provisioning: Key is generated during the sales process and stored in our CRM alongside the client record
  • Activation: Key is entered during deployment and activated against the production domain
  • Renewal: Keys renew annually. We send reminders at 60, 30, and 7 days before expiration
  • Deactivation: When a client churns, the key is deactivated, freeing the slot for a new installation

Tracking Costs Per Client

We track three cost categories per client: hosting (server resources allocated), maintenance (hours spent on updates and support), and licensing (JekCMS license fees). The average monthly cost per client is $45 for hosting, $120 for maintenance (approximately 1.5 hours at our internal rate), and $25 for licensing. These numbers inform our pricing — any client plan priced below $250/month is unprofitable at our current team size.

Client Onboarding Best Practices

  • Record a 15-minute screen walkthrough of the admin panel customised with the client's actual content — generic documentation is ignored
  • Create a "sandbox" admin account where the client can experiment without affecting the live site
  • Establish a single point of contact on the client side — multiple contacts lead to conflicting change requests
  • Set expectations about response times in writing before the project begins — not after the first support ticket
  • Document all client-specific customisations in a CLIENT_NOTES.md file in their installation directory
  • Schedule a 30-day check-in call to address questions that arise after the client has used the system independently

One practice that has saved us significant time is maintaining a shared internal wiki with a page for every client.

Each page records the theme in use, any hook overrides in the client directory, the SMTP provider, and known quirks specific to that installation. When a support request comes in, the person handling it can get up to speed in under two minutes instead of digging through configuration files. This documentation habit pays for itself after the third or fourth support interaction per client.