DevOps · Customization

Publishing Acumatica Customizations to Production

A safe, repeatable publish workflow for Acumatica customizations — pre-flight checks, packaging, validation, and the rollback plan that no one ever writes but everyone needs.

John Kihiu12 min read

Publishing a customization to a production Acumatica tenant is the moment your code touches live data and live users. The framework gives you the tools — customization packages, validation, and a publish log — but not a process. The safe path is boring and repeatable: freeze the package, validate it against a copy of production, publish in a maintenance window, and keep the previous package on hand so a rollback is a two-minute action rather than a panic.

What a customization package actually contains

A published package is a bundle of items: custom screens, DAC and graph code (as source or referenced compiled DLLs), generic inquiries, reports, database scripts, site map nodes, and system-locale/UI changes. Some of these change the database schema; others only add files or metadata. Before you publish anything, open the package and look at the item list — a package that includes Custom Tables or Database Scripts is a schema change, and schema changes are the ones you cannot casually undo. Knowing that up front decides how careful the release has to be.

Pre-flight checks before you touch production

The single most valuable habit is validating on a restored copy of production, not on a clean demo tenant. A package that publishes cleanly on a fresh install can fail on production because of existing data, a conflicting ISV customization, or a field that a user already populated. The pre-flight I run:

Build number must match

A customization package validated against 23R2 build X may not publish against build Y. Acumatica ties compiled extensions to the platform version. Always validate on the exact build production is running, and re-validate after any platform update, before you publish custom code on top of it.

Packaging a reproducible artifact

Export the package to a versioned .zip and commit it (or its source project XML) to source control. The published-to-production artifact must be the identical file you validated on staging — not a re-export "with one small fix." If you can rebuild the same bytes from a tagged commit, you have a real release; if the package only exists inside the tenant, you have a liability. Name the file with the version and date so the rollback target is unambiguous.

TEXT · RELEASE ARTIFACTS
releases/
  Distribution-v14.2-2026-05-12.zip   ← publishing this
  Distribution-v14.1-2026-04-28.zip   ← rollback target
git tag: cust/distribution-v14.2

The publish step and merge behaviour

When multiple customization projects are published together, Acumatica merges them, and the merge order matters when two projects touch the same screen or DAC. Publish in a maintenance window: users off, a fresh backup taken immediately before, and the previous package staged for rollback. The publish runs a compile; if compilation fails, the tenant can be left with the old published set still active, but you do not want to discover that live. Watch the publish log to completion rather than assuming success.

The rollback plan no one writes

Rollback splits by what the package changed. For file/metadata-only changes, re-publishing the previous package restores the prior state cleanly. For schema changes, un-publishing does not drop columns or tables that were added, and it certainly does not restore data — so your real rollback for a schema-touching release is the database backup you took before publishing. Decide which category you are in before you publish, and write the rollback steps down.

What the package changedRollback
Screens, reports, GIs, code onlyRe-publish previous package
Added tables/columns (schema)Restore pre-publish DB backup
Data migration script ranRestore backup; script is not reversible
Take the backup even if you are sure

The pre-publish backup costs minutes and is the only thing standing between a bad schema change and a full restore from last night's tape. Every release I have ever regretted was one where "this one is trivial" meant no fresh backup.

Wrapping up

A safe production publish is not clever, it is disciplined: validate the exact package on a copy of production at the exact build, ship the identical versioned artifact, publish in a window with a fresh backup, and know before you start whether your rollback is a re-publish or a restore. Do that every time and publishing stops being the scary part of the release.

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.