DevOps · Devops

Acumatica Environment Promotion — Dev to Staging to Prod

A practical dev-to-staging-to-production promotion pipeline for Acumatica customizations: version parity, publish-from-production discipline, scheduled maintenance windows, and where deployment packages fit.

John Kihiu12 min read

Most Acumatica shops don't have an environment promotion problem because they lack tooling — they have one because publishing a customization is easy enough to do carelessly. A working dev-to-staging-to-production pipeline is less about scripts and more about a handful of ordering rules: which tenant you publish from, when you're allowed to do it, and what "tested" means before a deployment package moves to the next environment.

Version parity across environments

The pipeline breaks before you even get to the customization if dev, staging, and production are on different Acumatica ERP versions. A customization project built and compiled against one version can fail to publish, or worse, publish with subtly different behavior, against another. The practical rule is to update all instances to the same version before deploying or publishing to production — version drift between environments should be treated as a blocker, not a background task to get to eventually. If staging is two service updates behind production, staging isn't actually verifying anything.

Always publish from production

This is the rule that's easy to get backwards. Publishing should always happen from the Production instance out to all other tenants, never the reverse — publishing from a dev or staging instance risks unpublishing customizations that are live in production, because publish is a synchronization operation, not a one-directional push of "just my changes." Treat Production as the source of truth for what's currently published, and every other tenant as something that gets brought in line with it, not the other way around.

Publishing is not additive

A publish operation reconciles the target against what the source tenant has, which means it can remove customizations the source doesn't know about. If a hotfix went live directly on production and staging was never updated to match, publishing from staging can undo that hotfix. Keep production as the single direction of truth and this class of incident mostly disappears.

Where the deployment package fits

The actual mechanics of building and publishing a customization project — the rebuild, the publish action, what a deployment package contains — are their own topic; I've written about that separately in Acumatica rebuild and publish best practices if you want the mechanics specifically. For the promotion pipeline, the part that matters is sequencing: a customization is developed in Dev, then published to a Staging/QA tenant that mirrors production's version. It gets tested there — and tested after publishing, not before, since publishing is what surfaces conflicts with other customizations or platform behavior that a local dev sandbox won't show. Only once it's verified on staging do you download the deployment package from that tenant, ready to move to Production.

YAML · PROMOTION SEQUENCE
# Not a literal pipeline config - the ordering that matters
steps:
  - stage: Dev
    action: develop and compile the customization project
  - stage: Staging/QA
    action: publish to a tenant matching production's ERP version
    verify: regression-test screens the customization touches
  - stage: Package
    action: download deployment package from Staging (post-publish, post-verify)
  - stage: Production
    action: publish package during a scheduled maintenance window
    from: Production tenant only

Scheduling the production publish

Publishing isn't a quiet background operation from the end user's point of view — a customization can modify a screen someone is actively using, and the site restarts that come with publishing will drop in-progress work if a user is mid-edit. That's the practical argument for publishing after hours: schedule a maintenance window, disable integrations that might be mid-transaction, and lock users out so nobody loses unsaved changes when the application pool recycles. None of this is exotic, it's the same discipline you'd apply to any system that can't tolerate a user losing work to a restart they didn't know was coming.

Regression-test the screens the customization touches, not just the new feature

A customization verified only against its own happy path on staging can still break an unrelated screen it shares a graph or DAC extension with. Before a deployment package leaves staging, walk through the existing screens the customization modifies or extends — not just the new functionality — since that's the class of regression that shows up in production as "someone's normal workflow stopped working" rather than as a visible bug in the new feature.

Wrapping up

A reliable Acumatica promotion pipeline comes down to a short list of disciplines: keep every environment on the same ERP version so staging actually verifies what production will run, always publish outward from Production so you never accidentally unpublish a live customization, test on staging after publishing rather than before, and only cut the production deployment package once that verification has actually happened. Schedule the production publish itself for a maintenance window, because the moment a customization ships, some restart or lockout is going to affect a user who didn't ask for it. None of this is complicated — it's just easy to skip under deadline pressure, and skipping it is exactly how a Friday-afternoon publish turns into a Saturday 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.