DevOps · Devops

Acumatica Canary Deployment

Acumatica Canary Deployment is the Acumatica operations topic that you only get good at by doing it badly a few times.

John Kihiu12 min read

Acumatica's own release process for the Cloud editions is effectively a canary rollout — new builds reach a small ring of tenants before the wider fleet. When you run self-hosted or manage a fleet of client instances, you can borrow the same discipline for your own customization releases: ship a change to one low-risk tenant or environment first, watch it, then widen the blast radius. This is not built into Acumatica; it is a release discipline you impose around deployments of DLLs, projects, and database changes.

What canary means for a monolith

Acumatica is not a fleet of independently deployable microservices, so "canary" does not mean routing 5% of traffic to a new pod. It means picking the smallest real exposure for a change: one tenant in a multitenant deployment, one branch in a multi-company setup used only by a small division, or a dedicated pilot environment with a subset of real users. The goal is the same as any canary — catch a regression while the cost of catching it is still small.

Using tenants as canary rings

If you run Acumatica multitenant, you already have a natural canary boundary. Publish a customization project to a single non-production-critical tenant first, run your smoke tests, and only then push to the tenant snapshot template used for the rest. The Instance Manager lets you manage tenants independently, so a bad customization in the canary tenant does not touch the others. The catch: schema-level changes (new DAC fields backed by real columns) apply at the database level shared across tenants in the same site, so not every change can be canaried this way — only project/customization-level changes that don't alter the shared schema.

Site vs. tenant scope

A customization project publish typically compiles and deploys for the whole site, not a single tenant. True per-tenant canarying only works cleanly when the change is data/configuration-driven — a feature flag stored in a custom setup field that you turn on for one tenant — rather than a code change that recompiles the whole application pool.

Canary via a second application instance

The more reliable pattern for a genuine code canary is to stand up a second Acumatica instance pointed at a copy of the database (or a read-mostly staging copy), publish the new customization there, and route a small slice of real users — often just the QA team plus one or two friendly power users — to that URL for a defined window. Because Acumatica instances are IIS applications, this is just another site binding; DNS or a load balancer can send an internal "canary" hostname to the new pool while production stays on the old one.

TEXT · ROLLOUT SEQUENCE
1. Publish customization to canary instance (canary.internal.company.com)
2. Run automated smoke tests against canary (login, key screens, key actions)
3. Route pilot users (QA + 2-3 power users) to canary for 24-48h
4. Monitor: PXTrace log, IIS error log, SQL Server slow query log
5. No new errors / no regression reports -> publish to production instance
6. Keep the canary instance one version behind production as a rollback target

What to watch during the canary window

A canary is only useful if you are actually watching it. The signals that matter most for an Acumatica release are the application event log for unhandled exceptions, the trace log for new PXException entries that were not present before, and SQL Server's plan cache for a query that suddenly went from an index seek to a scan because a new field on a DAC forced a different join. None of this requires new tooling — it requires deciding in advance what "worse" looks like and checking for it deliberately during the pilot window rather than waiting for a support ticket.

Rolling forward vs. rolling back

Because Acumatica customization packages are versioned and reversible through the Customization Projects screen, rollback during a canary is usually just re-publishing the previous package version to the affected tenant or instance. Keep the previous package archived outside of source control's working tree too — a project export you can hand to a colleague in a hurry is worth more at 6 PM on a Friday than a git tag that requires a full environment rebuild to apply.

Wrapping up

Canary deployment on Acumatica is less about tooling and more about sequencing: pick the smallest real audience, define what you are watching for before you publish, and keep the previous package one click away. It will not catch everything — shared-schema changes and application-pool-wide recompiles limit how granular you can get — but it catches the class of regression that a same-day rollback turns into a non-event instead of an incident.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.