Every task to migrate the suite to Azure, in the order it has to happen — 7 phases, 26 steps, each with an owner and a time estimate — plus a post-migration QC section covering exactly what to re-check. The execution reference for IT / the Microsoft partner.
Today every app is reached through PayFlow — it became the de-facto gateway simply because it was the first tool built, never by design. That's why one app stumbling can take the whole suite down. In the new setup a dedicated gateway is the single entry point and Cloudflare Access is the one central login; PayFlow, SalesFlow, Fire Doors, WebServe, Dispatch and CaseFlow all sit behind it as equal peers. No single app is the front door anymore — the login is (steps 7 & 13).
Nothing else can start until the machine, database and vault exist. These four can all be done in one sitting.
Rebuild the environment the suite runs in today — on Linux, with sturdier plumbing.
C:\AM Apps\… to /opt/am-automate/….1.5–2.5 daysMove all the apps' data onto managed PostgreSQL / the new host and get every credential into the vault — rehearsed, not rushed at cutover.
Stand up the secure public address and the Microsoft-login gate in front of it.
amautomate.amsbm.co.uk and a named Cloudflare Tunnel from the VM (outbound-only, no open ports).1–2 hrsProve the new setup end-to-end while the office server keeps running the business. The QC section at the foot of this document is the detailed checklist for this phase.
The only phase that touches the live business. Everything here happens inside one planned quiet window.
amautomate.amsbm.co.uk — send the address round, update bookmarks.minimalLet the new host earn trust in production before the old one is switched off for good.
The migration moves the environment, not the business logic — the rules, bug-fixes and QC hardening built into the apps travel with the code untouched, so this is a targeted regression pass, not a rebuild. Because the old server stays live throughout, use diff-based QC: run the same real input through both the old and new stacks and compare the output. The areas below are where environmental change realistically shows up, ranked by exposure — work the register first, then the per-app checks.
| Area | Exposure | Why it's exposed | Check this | Fix |
|---|---|---|---|---|
| Document rendering (PDF fonts) | Medium | Chromium substitutes any Windows font that isn't on Linux — output can come out with subtly wrong spacing or a different typeface. | Eyeball every document type against old output: quote cover, advice letter, breach notice + demand pack, Certificate of Compliance, booking confirmation, PayFlow / CaseFlow letters. | Install the matching fonts on the VM. |
| Database layer (PayFlow · Dispatch · CaseFlow) |
Medium | SQLite is loosely typed; PostgreSQL is strict. Risk sits in any raw SQL and in dates/numbers/booleans that were stored loosely. | Row counts match the old DB; same invoice in → same routing + GL coding out; same ledger → same eligibility decision. | Port the raw SQL; add explicit type casts. |
| File paths & case-sensitivity (all six apps) |
Low · loud | Linux uses / and is case-sensitive; a Windows C:\ path or a wrong-case filename breaks — but it fails immediately and visibly, not silently. |
Boot each app and watch the logs for file-not-found; grep the code for C:\ and backslashes. |
Correct the path / filename case. |
| Gateway & central login (new architecture) |
Low | The one deliberate structural change — routing and auth now sit at the gateway instead of running through PayFlow. | Each app loads and authenticates behind the new proxy; stopping one app does not take the others down. | Adjust the proxy route config. |
| Scheduled jobs (rebuilt on cron / systemd) |
Low–Med | The timing glue is re-implemented from Windows Task Scheduler, so a job could silently fail to fire. | After the first scheduled run, confirm each one fired: Blockman sync, GL / nominal-code sync, Stripe sync, booking + funnel emails, quote publish, DB backup. | Fix the cron entry / systemd timer. |
| Cloud integrations (Blockman · Xero · Stripe · FixFlo · Graph) |
Very low | Same code, same credentials, same endpoints — reached identically from Linux. Environment-independent. | One live read per integration; confirm the Xero token still refreshes from one process only (single-owner). | Usually none. |