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:
- Restore the current production snapshot to a staging tenant on the same build number.
- Publish the exact package you intend to ship — same version, same items.
- Run Validate in the Customization Project Editor and read every warning, not just errors.
- Smoke-test the screens the package touches with real data volumes.
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.
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 changed | Rollback |
|---|---|
| Screens, reports, GIs, code only | Re-publish previous package |
| Added tables/columns (schema) | Restore pre-publish DB backup |
| Data migration script ran | Restore backup; script is not reversible |
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.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.