Ivan Mišić product · tech · ai

Build the API layer before replacing the billing system.

FEB 15, 2026 · updated AUG 17, 2026 · 6 min · 1,072 words

on this page · 8

Digital delivery should not wait for a full core-system transformation.

In telecom, that usually means the OSS/BSS estate. In other industries, the names differ, but the problem is the same: a new app or customer journey needs data and actions from billing, CRM, catalog, ordering, provisioning, or another system that was not designed for modern digital products.

The tempting response is to start a large replacement program. I would start with a smaller question: what stable contract does the digital product need?

Build that API layer first. Let it translate between new digital demand and the systems already running the business. Then modernize those systems behind the contract at the pace the backend can handle.

The Transformation Trap

A core-system replacement can be necessary. It is also a poor dependency for a digital roadmap.

The replacement has to deal with old business rules, integrations, reporting, finance, operations, and customer-service processes. The digital product needs a clear way to read a balance, show an offer, submit an order, or check its status. Those are related problems, but they do not need the same delivery plan.

When they are tied together, every new digital capability inherits the scope and risk of the backend program. The customer waits for the whole estate to become modern instead of getting a smaller useful scope live.

That is the assumption I would challenge.

Put a Stable Contract in the Middle

The digital product should talk to a stable API contract, not directly to every core system.

The API layer exposes the capabilities the product needs in a consistent shape. Adapters behind it translate those requests into the data models, protocols, and business rules used by the existing systems. Microsoft describes a similar boundary as an Anti-Corruption Layer: the new product keeps its own model instead of copying the legacy system's structure.

The old systems can stay ugly. They just stop setting the shape of every new product.

The first benefit is calendar time. The digital team can build against the contract while the backend teams improve or replace the systems behind it. If a billing platform changes later, the adapter changes. Every app should not have to learn the new billing interface.

Architecture showing a mobile app using one standardized API contract that translates profile, product, billing, usage, and order requests across legacy billing, catalog, and usage systems

The stable contract separates digital demand from backend change. It does not remove the hard work around consistency, latency, error translation, and ownership.

Billing Is One Example

Billing makes the problem easy to see because it sits behind balances, invoices, payments, contracts, and product changes. The same approach applies to CRM, product catalog, order management, provisioning, usage, and other core capabilities.

Keep the scope narrow. Start with the capabilities required by a real digital journey. Add another contract when there is another useful demand.

The Iceberg Model of enterprise backends: a cheerful surface hiding underwater complexity

Customers do not need to know how many systems are involved in showing a bill or changing a product. They need a clear result. The abstraction layer is the boundary that keeps the complexity below the surface without pretending it has disappeared.

What the API Layer Should Expose

The contract should describe what the digital product needs, not reproduce every table and code from the systems behind it.

Capability Digital Contract Where the Complexity Usually Lives
Customer profile Name, contact details, account status CRM or customer master
Products and entitlements Active products, prices, allowances Catalog, billing, and entitlement systems
Billing and payment Balance, invoices, payment options Billing, finance, and payment services, depending on the current architecture
Usage Current usage, history, remaining allowance Network and operational systems
Orders and changes Create, track, change, or cancel an order Ordering and provisioning systems

This table is only an example. The source of truth and ownership will differ between companies. Design the contract around a real digital need. Let each adapter handle the backend that exists today.

What This Layer Does Not Solve

An abstraction layer moves the boundary. It does not remove the complexity.

Data ownership. The layer needs to know which system owns each field. If it keeps a cache or read model, the team must define how fresh the data needs to be and what happens when synchronization fails.

Transactions. A read is usually easier than an order, payment, or plan change. Multi-step operations need clear consistency rules, monitoring, retries, and a way to recover when only part of the work succeeds.

Error translation. A legacy error code may be correct for the backend and useless to the app. The API layer has to translate it without hiding the real failure from support and operations.

Performance and resilience. The extra layer adds latency and another component that can fail. Caching, timeouts, capacity, observability, and fallback behavior need deliberate design.

Contract governance. A stable contract still changes. Versioning and compatibility need one owner, or every digital team will create its own unofficial version.

Treat It as Infrastructure

I would fund and own the API layer as infrastructure. Give it one accountable team, a budget, and a roadmap tied to real product demand.

Digital and backend teams should shape its priorities, but shared input is not shared accountability. Someone has to own the contract, the production incidents, and the decision about what belongs in the layer.

If every change needs a temporary project and another funding discussion, the operating model has turned the layer into a queue.

When Replacement Is Still the Right Call

Building around a system is not an argument for keeping it forever.

Replacement still makes sense when the system blocks the business model, vendor support is ending, or the business process must change. It also makes sense when adapters and workarounds cost more than replacing it properly.

Even then, the contract still helps. Replace capabilities behind it in phases while the digital products keep using the same interface. The Strangler Fig approach uses this kind of gradual replacement to deliver value earlier and reduce the risk of one large cutover. Each phase still needs monitoring, rollback, and a clear exit condition.

Ask a Better Question

When someone proposes a major OSS/BSS or core-system transformation, ask:

  • What digital capability is waiting for it?
  • What stable contract would let that capability move now?
  • Can the backend change behind that contract without forcing every digital product to change?
  • What operational cost and failure modes will the new layer add?

If full replacement is still necessary, do it. If one API contract can separate the timelines, build that first.

The backend does not need to be modern before the digital roadmap can move.

Get Personalized Help

Copy this prompt to ChatGPT, Claude, or your favorite AI assistant. Fill in your details and get guidance tailored to your specific situation.

I read the abstraction layer approach at https://ivanmisic.net/blog/digital-transformation/dont-replace-billing-system and want to apply it to my situation.

My context:
- My role: [YOUR TITLE - e.g., Head of Digital, Product Manager, CTO, Enterprise Architect]
- The legacy system: [WHAT SYSTEM AND ROUGHLY HOW OLD - e.g., "SAP billing, 15+ years", "in-house CRM built in 2008", "Oracle provisioning stack"]
- The replacement plan: [CURRENT STATUS - e.g., "18-month replacement approved", "vendor selection in progress", "replacement failed last year, starting over"]
- What I need to build: [YOUR DIGITAL INITIATIVE - e.g., "new customer-facing app for self-service billing and plan changes"]
- What I need from the legacy system: [KEY DATA/CAPABILITIES - e.g., "customer profile, current plan, usage data, ability to change tariff"]

Help me:
1. Design the minimum viable API layer: Based on what I need, what specific endpoints should I build first to unblock my digital product without touching the legacy system?
2. Assess the hard parts: Looking at the article's complexity table, which of my needs are simple reads vs. complex transactions, and what caching or sync strategy would you recommend?
3. Draft the CTO memo: Write a concise argument (200 words) for why building the abstraction layer now actually de-risks the eventual system replacement, not delays it.