This is an example. Northwind Industrial Supply is a fictional company and this assessment describes a synthetic scenario. It was written by Antegrate to show the structure, depth and reasoning of a real Technical Systems Assessment. It is not client work, and no part of it describes an actual customer’s systems.
Northwind Industrial Supply — Order Management Platform
- Antegrate · Dorian Ben Haim, Principal
- 3 weeks, fixed fee
- CEO, CFO, VP Engineering, Head of Operations
Section 1
Executive summary
Northwind asked us one question: why does the Meridian partner integration cost five to seven months when it was expected to take six to eight weeks?
The answer is not that the estimate is wrong. The estimate is approximately correct, and the reason it is correct is the finding of this assessment.
The order management platform works. It processes roughly 2,400 orders a week, has not had an unplanned outage exceeding 30 minutes in the last 14 months, and contains fifteen years of pricing, freight, tax and contract logic that is largely correct. It is not failing. It is not obsolete. It does not need to be replaced.
What it has lost is the ability to absorb change cheaply. Every external integration built since 2019 was added by extending the order pipeline directly rather than by connecting at a boundary. There are now three of them, each slightly different, none isolated. Meridian would be the fourth — but it is the first that requires real-time, bidirectional communication, and the pipeline was built around nightly batch assumptions. The estimate is high because Meridian cannot be added to the current design; it can only be added through it.
Our recommendation: do not rewrite the platform. Build the integration boundary that should have existed, and deliver Meridian through it.
This is not a compromise between rewriting and patching. It is the only sequence that meets the commercial deadline and leaves the system cheaper to change afterwards. Meridian pays for the seam; every integration after it can reuse a boundary that no longer has to be built from scratch.
The decision, in numbers
| Option | Effort | Elapsed | Indicative cost | Meets Meridian deadline? |
|---|---|---|---|---|
| Patch Meridian into the existing pipeline | ~600 hrs | 14–18 weeks | ~$66K | Probably — with material schedule risk |
| Recommended: seam + Meridian + stabilization | ~1,080 hrs | 16 weeks | ~$119K | Yes, with ~5 weeks of buffer |
| Full platform rewrite | 15,000–31,000 hrs | 18–30 months | $1.65M–$3.4M | No |
Costs normalize internal and external engineering effort at a blended $110/hr so that the options can be compared on one scale. They are not incremental cash expenditure. Actual budget impact depends on how much is delivered by existing salaried capacity versus bought externally. Substitute your own rate; full basis in §8.
The patch option is ~$53K cheaper today and leaves you in exactly this position again when the fifth integration arrives — except with four coupled integrations instead of three. We do not recommend it, but we have costed it honestly because it is a legitimate choice if cash is the binding constraint this quarter.
The three findings that matter
- 1Integration failures are not surfaced. Two of the three existing integrations can fail silently. Operations staff and, on at least two occasions, customers have been the detection mechanism. This is the cheapest thing to fix and the highest-value thing on the list.
- 2There is no integration boundary. Partner logic lives inside the order pipeline. This is why Meridian is expensive, and it will be why the next one is expensive.
- 3Release capability depends on one person. Deployment is manual, the runbook is incomplete, and one senior engineer performs every release. This is an operational risk that is unrelated to Meridian and larger than it.
Findings 1 and 3 are addressable in under six weeks and do not depend on the Meridian decision.
Section 2
What we examined, and what we did not
A three-week assessment is a bounded diagnostic, not an audit. Being explicit about the boundary is part of the deliverable.
Examined
- Six stakeholder sessions: VP Engineering, two senior engineers, the release engineer, Head of Operations, and the commercial owner of the Meridian relationship
- Solution structure, project dependencies, and the order submission path end to end
- All three external integration implementations, in full
- Database schema, and the 46 stored procedures reachable from the order and pricing paths
- Deployment scripts, the release runbook, and the last six release records
- Application and IIS logs for a 30-day window
- The engineering estimate for Meridian and its underlying breakdown
Not examined
- The full 340-procedure stored procedure inventory. We sampled the order and pricing paths only.
- Front-end code beyond the order entry and quoting screens
- Security posture, penetration testing, or compliance review. We saw nothing alarming, but we did not look properly. This should not be read as a clean bill of health.
- The reporting and BI layer, the warehouse handheld application, and the customer portal
- Infrastructure cost optimization
- Test coverage measurement — we reviewed the test projects’ structure but did not run coverage analysis
Where a finding below rests on a sample rather than a complete review, we say so.
Section 3
Current state
3.1 System overview
The platform is a .NET Framework 4.8 application on IIS, running on two application servers behind a hardware load balancer, with SQL Server 2019 on a separate host. Two newer satellite services (notifications, document generation) run on .NET 8 in the same environment. All of it is on-premise.
| Core platform | .NET Framework 4.8, ASP.NET MVC + WebForms (legacy screens), IIS 10 |
|---|---|
| Data | SQL Server 2019, ~340 stored procedures, ~180 tables |
| Satellites | Two .NET 8 services (notifications, documents) |
| Deployment | Manual, two servers, ~3 hrs per release, Sunday maintenance window |
| Release cadence | Every 3–4 weeks |
| Engineering team | 14 (8 backend/full-stack, 2 front-end, 1 QA, 1 part-time infrastructure, 2 leads) |
| Volume | ~2,400 orders/week, ~$41M annual GMV through the platform |
The technology is not the problem. .NET Framework 4.8 is supported, SQL Server 2019 is supported, and nothing in this stack is forcing a migration on a vendor’s timetable. Anyone who tells you the age of the framework is itself the issue is selling something.
3.2 Where change is difficult, and why
We traced four recent changes through the codebase — a freight rule change, a new customer-tier discount, a carrier rate update, and a tax jurisdiction addition. All four required edits in more than three places.
The pattern is consistent: there is no single authoritative answer to “what does this order cost.” Pricing is computed in at least three locations:
- OrderPricingService in the application layer, for interactive quoting
- usp_Order_CalculateTotals, invoked during order submission
- A partial recomputation inside the ERP synchronization job, so that batch-imported orders reconcile
These three implementations agree most of the time. They have diverged twice in the last two years, both times detected by finance during month-end reconciliation rather than by a test.
This is the mechanism behind “small changes require touching half the system.” The system is not tangled arbitrarily. It has three copies of one decision, and every change to that decision has to be applied three times, correctly, by someone who knows all three exist.
This is design debt, not decay. Each duplication was a reasonable local decision — the stored procedure was added for batch performance, the job’s recomputation for a real reconciliation bug. Nobody made a mistake. The cost compounded quietly.
3.3 The integration layer
Three external integrations, all built inside the order pipeline, none behind an abstraction.
ERP synchronization — silent failure. A nightly job consumes a flat file of inventory and price updates. When the file is malformed or absent, the job logs a warning and exits successfully. Inventory then serves stale figures until the next successful run. We found four occurrences in the 30-day log window. In two of them, the first detection was a customer ordering an item that was not in stock.
Carrier API — vendor-driven fragility. The endpoint URL and API version are compile-time constants in three places. The carrier deprecated the version currently in use with an announced sunset. More significantly, the retry wrapper catches Exception, logs at Debug level, and returns a default rate. A rate lookup failure is therefore indistinguishable from a successful lookup that returned the default.
Payment provider — synchronous coupling. The credit check is a blocking call inside order submission with a 30-second timeout, no circuit breaker, and no queue. When the provider is slow, order submission is slow; when it is down, orders cannot be submitted at all. This has happened once in 14 months, for 40 minutes.
Each integration is individually repairable. The reason we treat them as one finding is that they are three solutions to the same problem, and none of them is reusable. Meridian would be the fourth.
3.4 Deployment and release
| Method | Manual. RDP to each application server, stop app pool, file copy, run SQL scripts by hand, restart, manual smoke test |
|---|---|
| Duration | ~3 hrs, Sunday evening maintenance window |
| Performed by | One senior engineer. Every release for the past two years |
| Runbook | Confluence page, last substantively updated 2023, incomplete — three steps performed in practice are not documented |
| Database changes | Hand-ordered script folder. No migration tooling, no automated verification that a script has already run |
| Rollback | Restore from file backup. Exercised twice; took 4 and 6 hours respectively |
| Environments | Production and a shared staging environment that has drifted from production configuration |
The releases succeed. That is worth stating plainly — this is a disciplined manual process performed by someone competent. But the capability lives in one person’s working memory, the rollback path is slow enough that nobody wants to use it, and the 3-hour window is a structural reason the team batches changes into large, riskier releases every 3–4 weeks instead of shipping small ones.
Deployment friction is a change-cost multiplier. It does not appear on any estimate, and it inflates every estimate.
3.5 Knowledge concentration
Three areas have a single knowledgeable owner: the release process, the ERP synchronization job, and the freight rate engine. In each case, one person can explain how it works and no written material would let a competent engineer reconstruct it.
We raise this as a technical finding because it directly affects change cost. Every change touching those three areas is scheduled around one person’s availability, and two of the four changes we traced had waited on exactly that.
Section 4
Findings and risks, ranked
Ranked by expected cost of inaction, not by severity of the underlying defect.
| # | Finding | Impact | Effort |
|---|---|---|---|
| 1 | Integration failures are not surfaced; two of three can fail silently | Customer-visible incidents; stale inventory; erosion of trust in system data | Low |
| 2 | No integration boundary — partner logic is inside the order pipeline | Meridian costs 5–7 months instead of 6–8 weeks; every future partner repeats this | Medium |
| 3 | Release capability depends on one person; rollback is slow | Operational risk unrelated to any project; forces large batched releases | Medium |
| 4 | Pricing logic duplicated in three implementations | Silent divergence; already caused two reconciliation errors; inflates every pricing change | Medium–High |
| 5 | Carrier API version sunset announced | A hard external deadline exists; currently unowned | Low |
| 6 | Payment provider called synchronously without a circuit breaker | Provider degradation blocks order submission | Low |
| 7 | Staging has drifted from production | Reduces the value of pre-release testing; contributes to release-day surprises | Low |
| 8 | Knowledge concentration in three areas | Schedule dependency on individuals; recruitment and absence risk | Low–Medium |
Findings 1, 5, 6 and 7 are inexpensive and independent of the Meridian decision. They should proceed regardless of what leadership decides about the platform.
Section 5
The rewrite question
Leadership is weighing three options: patch Meridian, modernize incrementally, or rebuild the platform. We were asked to give a view. Do not rebuild it.
We are not arguing that the platform is good. We are arguing that a rewrite solves a problem Northwind does not have while creating one it cannot absorb.
What a rewrite would discard. The valuable asset in this system is not the code, it is fifteen years of encoded commercial reality — contract pricing tiers, freight rules with genuine exceptions, tax jurisdiction handling, credit terms, and several hundred behaviours that exist because a customer once complained. None of it is documented. Most of it is only discoverable by reading the code that implements it. A rewrite does not port this; it re-derives it, in meetings, from people who will remember it incompletely.
The failure modes are asymmetric. The current system’s worst case is “change is expensive.” A rewrite’s worst case is “there is no working order system, and the old one has been frozen for eighteen months.” The first is a cost. The second is an existence risk for a business running $41M of GMV through this platform.
The timing is disqualifying. Meridian is commercially committed with a deadline roughly five months out. A rewrite is 18–30 months on our estimate. Any rewrite plan requires building Meridian into the legacy system anyway — which means paying the full integration cost and the rewrite cost, and then building Meridian a second time.
Basis for the rewrite estimate. This is an order-of-magnitude figure intended to establish scale. It is not an implementation estimate and should not be planned against.
| Component | Hours |
|---|---|
| Eight functional domains — order capture and quoting, pricing, inventory and availability, credit and payment, fulfilment and shipping, returns and credits, customer and contract management, reporting — at 1,200–2,600 hrs each | 9,600–20,800 |
| Behaviour characterization: recovering undocumented commercial rules by reading the existing implementation | 2,000–4,000 |
| Rebuilding four integrations against the new system | 1,200–2,000 |
| Data migration and cutover | 1,000–2,000 |
| Regression validation and a parallel-operation period | 1,200–2,400 |
| Total | 15,000–31,200 |
At 6–8 engineers and ~140 productive hours per engineer-month, that is 18–30 months elapsed.
The dominant uncertainty is the characterization line, and it is worth being explicit about why: the cost of rewriting this system is driven less by writing code than by discovering what the current one actually does. That work has no shortcut and it cannot be parallelized across a large team.
The conditions that would justify a rewrite are absent. We would change this recommendation if the platform were unstable in the core path, if the stack were out of vendor support, if the domain had fundamentally changed, or if the team could not safely make changes at all. None of those are true. What is true is that a specific, identifiable part of the design — the integration boundary — is missing.
That is a repairable defect, not a reason to start over.
Section 6
Recommendation: stabilize the change surface
The objective is not to modernize the platform. It is to make the parts of it that the business changes most often cheap to change, and to leave the rest alone.
Three interventions, in priority order.
6.1 Make failures visible (do this first, regardless)
Correlation IDs through the order path, structured logging, explicit success/failure signalling from the ERP job with alerting on non-success, explicit capture and quarantine of failed integration work with a path to replay it, and removal of the exception-swallowing retry wrapper in the carrier client.
We are deliberately not prescribing a mechanism here. The current integrations are a nightly file job and two synchronous HTTP calls; there is no message infrastructure to build on, and introducing one before the boundary exists would be solving the wrong problem first. If Phase 1 introduces messaging at the boundary, a dead-letter queue becomes the natural implementation. Until then, a quarantine table and a replay command are sufficient and considerably cheaper.
This does not fix any integration. It means you find out before your customers do. It is the highest ratio of value to effort in this document.
6.2 Build the integration boundary, and deliver Meridian through it
Introduce an explicit integration layer: a defined contract for what an external partner can do (inventory query, order submission, status notification, pricing agreement), adapters implementing that contract per partner, and a translation boundary so partner-specific formats never enter the order pipeline.
Meridian is built as the first adapter. This matters commercially: the seam is not a separate modernization project requiring its own justification — it is the shape the Meridian work takes. The budget is Meridian’s budget.
Migrate the three existing integrations behind the boundary afterwards, one at a time, starting with the carrier client (which has a forced deadline from the announced API sunset anyway). Do not migrate all three before Meridian ships. That inverts the priorities and puts the deadline at risk.
6.3 Automate deployment
A build and release pipeline, scripted and versioned database migrations, one-command deploy to both servers, an automated smoke test, and a rollback that takes minutes.
This is not glamorous and it is not on the critical path for Meridian, which is exactly why it should run in parallel with a separate owner. It removes the single-person dependency, shortens the release window, and — the real benefit — makes small releases cheap enough that the team stops batching a month of changes into one risky Sunday night.
6.4 Consolidate pricing — recommended, but decide separately
Collapse the three pricing implementations to one authoritative path, with the other call sites delegating to it.
We are deliberately separating this from the first three. It is the most valuable structural improvement in the document and the least urgent. It is also the one most likely to surface behaviour differences that require commercial decisions rather than technical ones — the three implementations disagree in edge cases, and someone in finance will have to say which is correct.
Do not start this until Meridian has shipped. It needs the team’s full attention and it should not compete with a committed deadline.
6.5 What we recommend not doing
- Do not migrate to .NET 8 now.
- It is a reasonable eventual goal and it does nothing for change cost today. It would consume the Meridian window entirely.
- Do not move to the cloud as part of this.
- Moving a bad architecture to the cloud gives you a bad architecture in the cloud, on a metered bill. Revisit after §6.2 and §6.4.
- Do not replace the ERP integration with a middleware product.
- The failure is that nobody is told when it breaks, not that file transfer is the wrong mechanism. A platform purchase here buys a licence and keeps the problem.
- Do not attempt to reduce the 340 stored procedures as a project.
- Reduce them as a consequence of §6.4, in the paths that actually block change. A procedure nobody needs to modify costs nothing.
Section 7
Roadmap
The Meridian deadline is the forcing function. This sequence delivers it with buffer while leaving the platform structurally better.
| Phase | Weeks | Work | Depends on |
|---|---|---|---|
| 0 — Visibility | 1–3 | Correlation IDs, structured logging, ERP job success/failure signalling and alerting, remove exception-swallowing in carrier client, capture and replay of failed integration work | Nothing |
| 1 — Boundary + Meridian | 2–16 | Define integration contract, build adapter framework, implement Meridian adapter, integration testing with partner, cutover | Phase 0 for diagnostics |
| 2 — Deployment | 3–12 | Build pipeline, scripted DB migrations, one-command deploy, smoke tests, fast rollback, staging realignment | Nothing — runs parallel, separate owner |
| 3 — Carrier migration | 16–20 | Move carrier client behind the boundary; resolves the announced API sunset | Phase 1 |
| 4 — Pricing consolidation | 20–32 | Single authoritative pricing path; commercial reconciliation of edge cases | Phase 1 complete; business decision |
Meridian is live in week 16 against a week-22 commitment. Phases 0 and 2 are independent of the Meridian decision and can start immediately.
Phases 3 and 4 are deliberately beyond the deadline. Committing to them now, before Meridian has shipped, is the most common way this kind of plan fails.
Section 8
Cost and effort model
Effort in engineer-hours. Ranges reflect genuine uncertainty, not padding.
How to read the cost column. Figures normalize internal and external engineering effort at a blended $110/hr so the options can be compared on a single scale. This is engineering-equivalent delivery cost, not incremental cash expenditure. If Phase 0 and Phase 2 are absorbed by existing salaried engineers, their cash impact is close to zero and their real cost is the other work those engineers do not do. Actual budget impact depends entirely on the internal/external mix, which is a decision Northwind has not yet made. Substitute your own blended rate.
| Phase | Effort (hrs) | Indicative cost | Confidence |
|---|---|---|---|
| 0 — Visibility | 120–160 | $13K–$18K | High |
| 1 — Boundary + Meridian | 620–800 | $68K–$88K | Medium — depends on Meridian’s API quality and their responsiveness in testing |
| 2 — Deployment | 200–260 | $22K–$29K | High |
| Subtotal (committed scope) | 940–1,220 | ~$103K–$135K | |
| 3 — Carrier migration | 90–130 | $10K–$14K | High |
| 4 — Pricing consolidation | 300–420 | $33K–$46K | Low–Medium — scope depends on how many edge-case disagreements surface |
Comparison against the alternatives
| Effort | Elapsed | Cost | Meridian deadline | |
|---|---|---|---|---|
| Patch Meridian into existing pipeline | ~600 hrs | 14–18 wks | ~$66K | Probably, with schedule risk |
| Recommended (Phases 0–2) | ~1,080 hrs | 16 wks | ~$119K | Yes, ~5 wks buffer |
| Full rewrite | 15,000–31,000 hrs | 18–30 mo | $1.65M–$3.4M | No |
The recommended path costs roughly $53K more than patching, in engineering-equivalent terms. What that buys: Meridian delivered with schedule buffer instead of schedule risk, future partner integrations implemented against a reusable boundary rather than rebuilt through the order pipeline, integration failures that announce themselves rather than being reported by customers, and a release process that does not depend on one person’s calendar.
We have deliberately not put a number on the cost of a future integration. The saving is real — the boundary, contract and adapter framework are built once, at roughly 220–280 of Phase 1’s hours — but the size of the saving depends on the functional scope of whatever partner comes next, and we have no candidate to scope against. A figure here would be a guess wearing a decimal point.
The largest single risk to this estimate is Meridian’s own API. Our Phase 1 range assumes documented endpoints, a usable sandbox, and a responsive counterpart during integration testing. We have not seen their documentation. If their API is undocumented or their sandbox is unreliable, Phase 1 moves toward and possibly past the top of the range. We recommend obtaining and reviewing their API documentation before committing to a delivery date — this is a two-day exercise that materially de-risks a five-month commitment.
Section 9
If nothing changes
Stated plainly, because “do nothing” is a real option and deserves an honest forecast rather than a scare.
The platform will keep working. It is stable and it is not degrading on its own.
What continues: Meridian costs 5–7 months and arrives late or over budget. The fifth integration costs the same again. Integration failures continue to be discovered by operations staff and occasionally customers, at the current rate of roughly one every eight days in the log window we reviewed. Pricing divergence remains a month-end reconciliation risk. The carrier API sunset arrives on the vendor’s schedule and becomes an emergency. Release capability remains attached to one person.
None of these is a crisis. That is precisely what makes this decision easy to defer — and deferral is how a system that merely became expensive to change eventually becomes one that cannot change at all.
Section 10
Assumptions and open questions
Things we could not verify in three weeks that would change parts of this document.
- 1Meridian’s API quality and documentation. The single largest estimate risk. Unreviewed.
- 2Pricing edge-case correctness. We established that the three implementations diverge. We did not establish which one is right. This is a finance decision, not an engineering one.
- 3Stored procedure inventory. We reviewed 46 of ~340. The remainder may contain further duplicated business logic. We would expect some; we did not measure it.
- 4Test coverage. Test projects exist and appear maintained. We did not run coverage. Phase 4 in particular assumes a usable regression safety net; if coverage on the pricing path is thin, add 80–140 hrs to Phase 4 for characterization tests.
- 5Team capacity. The roadmap assumes two engineers on Phase 1 and one part-time on Phase 2, without competing commitments. We did not review the wider roadmap.
- 6Security and compliance. Not assessed. See §2.
APPENDIX
Walkthrough session
This assessment is delivered with a live session, structured for both audiences.
Part 1 — Leadership (45 min). The decision, the three options and their costs, why we recommend against a rewrite, what happens to the Meridian deadline under each. Questions.
Part 2 — Engineering (75 min). Findings in detail, the integration contract design, phase sequencing, estimate assumptions, and where we think we might be wrong. Bring the release engineer and whoever produced the Meridian estimate.
Antegrate — engineering for systems that have become hard to change.