AskArunjyoti

Arunjyoti Dey · Enterprise & solution architect · Melbourne

Transformation, connected and AI‑accelerated.

Over many years and many programs, as a developer, then a lead, and now a lead architect, I've worked on ERP, CRM, integration and Single View of Customer transformations. These are my field notes on making them connect, and on using AI-driven delivery to get there faster with less risk.

The connected transformation ERP and CRM both connect through an integration layer, which produces a Single View of Customer. AI-driven delivery sits underneath all four. FIG. 1 · ONE LANDSCAPE, NOT FOUR PROGRAMS ERPS/4HANA · RISE · CLEAN CORE CRMSALES · SERVICE · ORDERS IntegrationAPIs · EVENTS · DATA Single View of CustomerONE CUSTOMER, EVERY CHANNEL AI-DRIVEN DELIVERY · DISCOVER → DESIGN → BUILD → TEST → RUN

01 · What I transform

Four transformations that always connect.

I've worked on each of these across different programs and organisations over the years. The lesson that keeps repeating is that they depend on each other, even when they're run as separate projects with separate teams. The ERP sets the core, CRM shapes how you engage, integration connects them, and a single view of the customer is the payoff.

01 S/4HANA · CLEAN CORE Finance Procurement Inventory Sales & delivery EXTENSIONS ON BTP, OUTSIDE THE CORE

ERP transformation

Moving off legacy ECC to SAP S/4HANA and RISE with a clean core, so the business can keep upgrading without starting over.

  • S/4HANA
  • RISE
  • Clean core

From the fieldOrder fulfilment, pricing and product data designed so the ERP stays the system of record, not the system everyone works around.

02 SALESORDER MGMTSERVICE Lead Deal Order Case Customer & account record

CRM transformation

Salesforce sales, service and order management, built around how teams actually work and designed for adoption from the start.

  • Salesforce
  • Order management
  • Service

From the fieldOrder orchestration across web, store, B2B and bulk channels, with the CRM orchestrating and the ERP fulfilling.

03 APIS · REAL-TIME REQUEST / RESPONSE Channel API Service EVENTS · TOPICS AND QUEUES Producer Topic Queue Queue PUBLISH ONCE · EACH CONSUMER OWNS ITS QUEUE

Integration transformation

Replacing point-to-point connections with reusable API- and event-led services, and a data layer the business can trust.

  • Integration Suite
  • Event mesh
  • Datasphere

From the fieldShared enterprise services for account, order, product, pricing and billing, each with one owner and one contract.

04 CRMERPeCommercePOSMarketingService MDM GOLDEN RECORD

Single View of Customer

Bringing customer data from every channel into one view that marketing, sales, service and stores actually use.

  • Identity
  • Data quality
  • Omnichannel

From the fieldCustomer lookup and account data served once, as a service, instead of copied into every channel.

02 · How I deliver

AI-driven delivery, with enterprise guardrails.

I use AI across the whole delivery lifecycle, from requirements to run, in the day-to-day work of designing and building integrations on live programs.

Stage 1

Discover

Turn workshop transcripts, documents and process maps into structured, system-attributed requirements.

Stage 2

Design

Draft designs, mappings and decision records early, then check every claim against the real API specs.

Stage 3

Build

AI agents build and review integration flows from the design, working to the organisation's own standards.

Stage 4

Test

Test cases and data generated from requirements, so coverage keeps up with change.

Stage 5

Run

Design pages versioned with the code, so knowledge stays after the project team leaves.

The guardrails

A human owner for every step

The architect's edited version is the source of truth, not the AI's first draft.

One shared rulebook

Security and integration standards sit in a rules file every agent reads, every time.

Clear data boundaries

AI works under the same data rules as the human team. Nothing sensitive crosses a line it shouldn't.

People deploy

AI can build and push to development. A person verifies and promotes.

03 · About

I'm Arunjyoti Dey, an enterprise and solution architect based in Melbourne. Most people call me Arun.

I'm currently a lead architect on the ERP (SAP S/4HANA, RISE) and CRM (Salesforce) transformations at a major Australian retailer, where I lead a small team of integration architects. My domain spans supply chain, B2B, product and pricing, marketing technology, digital channels, and store and point-of-sale systems.

I've spent many years on ERP, CRM, integration and customer data transformations across several organisations: first as a developer, then as a technical lead, and now as a lead architect. My background covers data, applications, master data, analytics and integration. The lesson that keeps repeating is that these transformations succeed or fail together. This site is where I share what I've learned along the way.

Based in
Melbourne, Australia
Platforms
SAP S/4HANA, Integration Suite, Salesforce
Languages
English, Hindi
Connect
LinkedIn

04 · Ask

Stuck on a transformation question? Ask.

Send me the question you're wrestling with on ERP, CRM, integration, customer data or AI in delivery. I answer the most useful ones here, anonymised, so others can learn from them too.

Email arun@askarunjyoti.com LinkedIn linkedin.com/in/arunjyoti-dey Questions in the queue
  • Should integration go on the ERP program's budget or its own?
  • How much customisation is too much for a clean core?
  • Where do we start with a single customer view?
Answered · IntegrationA transfer between two systems failed. Should the integration layer keep retrying, or should the owning system go and check?

Start by asking which system owns the outcome. If the receiving side has a standard API that reports status, the cleanest answer is often for the owning system to poll it on a schedule and act on what it finds. That keeps the recovery logic with the team that understands the business consequence.

What I try to avoid is adding a new component into the live transaction path just to handle failures, or copying existing integration flows to build a recovery variant. Both work on day one. Both become something you maintain forever, and the copy drifts from the original the first time either changes.

Rule of thumb: the happy path and the recovery path should have the same owner, and recovery should reuse standard interfaces wherever they exist.

Answered · EventsWho should own credentials and access on a shared event broker?

Separate the people who build integrations from the people who grant access. A platform team should own identities, access control profiles and queue ownership. Integration developers and direct consumers request access; they don't mint it.

Then keep the patterns few and boring: one identity per domain or application, per environment, named the same way as your topics so anyone can read it. OAuth client credentials in production, certificates as a fallback, basic authentication only in development. And make consumers read from queues they own rather than subscribing to topics directly, so you always know who receives what.

Rule of thumb: if you can't answer "who can read this event?" from your naming alone, the standard isn't finished.

05 · Writing

Field notes from real programs.

Practical lessons from transformation work, anonymised and written for the people running these programs: CIOs, program directors and architects.

Field notes · ERP + CRM

Whose requirement is it anyway?

The most expensive defects on an order orchestration program started as sentences that didn't name a system.

New
ERP

Clean core is a business decision, not a technical one

Every customisation you keep is a cost you pay at every upgrade. How to have that conversation with the business.

Planned
← All field notes

Field notes · Customer

Single View of Customer: start from the outcome and work backwards

Most single view of customer programs start with the data and hope the value turns up later. I'd rather start from the outcomes the business actually wants, such as rewarding loyal customers and reaching them at the right moment, and work backwards to what has to be built.

The trap: starting with the plumbing

A single view of customer program usually begins with master data management. Pick a platform, define the customer model, match and merge duplicates, and produce a golden record. All of that is necessary. The trouble is that many programs stop there and declare success.

A golden record isn't an outcome. Nobody in the business wakes up wanting one. They want to keep good customers, sell to them at the right time and stop wasting money on the wrong ones. If the program doesn't start from those goals, it ends with clean data and no one using it.

Start with the outcomes

Two outcomes come up again and again, and both are easy for a business to recognise.

The same pattern travels well beyond cars. In retail there are short cycles, like a business that reorders a ream of paper every few weeks, and long ones, like a customer who replaces their phone every two or three years. Get the timing right and marketing feels like service rather than noise.

Start from the outcomes, rewarding loyalty and reaching customers at the right time, then work backwards: timing needs value, value needs history, history needs identity. Build in the opposite order. START HERE: THE OUTCOMES Reward loyalty · Reach customers at the right moment WORK BACKWARDS IdentityWHO IS THIS?HistoryWHAT HAVE THEY DONE?ValueHOW MUCH DO THEY MATTER?TimingWHEN ARE THEY DUE? 1 · SINGLE VIEW (MDM) 2 · ANALYTICS LAYER 3 · LIFETIME VALUE 4 · PURCHASE CYCLES BUILD IN THIS ORDER, AND ONBOARD ENOUGH CHANNELS FOR EACH STEP TO WORK
Fig. 1 · Decide the outcomes first, then work back to what you need to build. Each step depends on the one before it.

Now work backwards

Once the outcomes are clear, the build order falls out of them.

So the program is built in the opposite order to the way it's justified: identity, then history, then value, then timing.

Step 1: Identity, the single view

This is the part most people mean by single view of customer. A master data hub sits in the middle, holding the golden record, with the CRM, ERP, eCommerce, point of sale, marketing and service systems around it as spokes. Each system keeps doing its job, and the hub keeps one trusted version of who the customer is.

One distinction matters here. The single view gives you identity, not history. It tells you this customer is one person with one set of details. On its own, it doesn't tell you what they've done.

Step 2: History, the analytics layer

History comes from a data analytics layer on top of the single view. Its first job is to find the close matches the operational systems can't: the same person with a different email in one channel, or a slightly different address in another. Its second job is to bring transactions from every channel together into one timeline per customer.

This is where most of the business value starts to show, and where most of the hard work sits.

Step 3: Value

With a history in place, you can start rating customers and their transactions: how long they've been with you, how often they buy, what they buy, and whether they come back for service. The scoring model should be agreed with the business, because "valuable" means different things to marketing, sales and service. Done well, it gives everyone one shared view of which customers matter most.

Step 4: Timing

The last step looks for cycles in each customer's history and flags who is coming due. That signal feeds marketing and sales, so the right customer hears from you at the right time, with an offer that fits where they are in the cycle.

The lesson I learned the hard way

In a previous role in automotive, I delivered a single customer view across a group of brands. The vision went further: lifetime value and purchase cycles, built on top of it. I left before that part was built, and the reason is worth sharing. Not all of the channels had been onboarded to the single view, and the organisation was slow to adopt the change. Without enough channels feeding it, there was no complete history, and without history the value and timing steps couldn't start.

The value of a single view only shows up once enough channels feed into it.

If I did it again, I'd plan channel onboarding as part of the program from day one, not as follow-on work. And I'd tie each channel to the outcome it unlocks, so the business can see why it's worth the effort.

Why this matters to the people funding it

Funding a golden record is hard to justify, because nobody can see what it buys. Funding better retention of loyal customers and better-timed marketing is much easier, because the business can picture the result. Starting from the outcome also gives you the right measures from day one: repeat purchase, retention and response to campaigns, rather than the number of records matched.

What I'd do again

  • Agree the business outcomes before choosing a platform.
  • Work backwards from those outcomes to decide what to build, then build forwards: identity, history, value, timing.
  • Remember that the single view gives identity, and plan the analytics layer that turns it into history.
  • Make channel onboarding part of the program, with each channel tied to the outcome it unlocks.
  • Measure the program by business results, not records matched.
← All field notes

Field notes · Leadership

Why I build consensus instead of handing down designs

An architect can hand down a design, but a design people helped shape is the one they defend when it gets hard. That's why I build solutions by consensus with business people, peer architects and the engineers on the ground, and why I treat it as part of the architecture work, not a soft skill on the side.

Why directive designs fail quietly

A directive design looks efficient. One person decides, writes it down and circulates it. The trouble shows up later. The business didn't see its real constraint reflected, so it works around the design. The engineers spot a detail the diagram missed, so they quietly build something slightly different. Peer architects weren't asked, so the next decision in their area pulls the other way.

None of that appears in the design review. It appears months later as rework, exceptions and a solution nobody feels they own.

A solution built by consensus is a solution people accept. That acceptance is what carries it through delivery.

Who I bring in

I work with three groups, and I want all three in the room before the design settles.

I gather what each group knows, put the options on the table and work towards an answer everyone can stand behind.

Listening is the method

If I had to name one skill that has made the biggest difference over my career, it's listening. I like hearing different points of view, especially the ones that disagree with mine. When I sit down with someone and properly hear them out, one of two things happens: either I learn something, or they do. Both are useful.

That only works if the disagreement is genuine. I'd rather surface an objection in a workshop than discover it in a defect log, so I go looking for the people most likely to push back.

Get close to the system

Consensus built on slides is fragile. The other half of my approach is to go and touch and feel the system: sit with the developers, look at the actual integration flows and data, and understand how things really work today. Until you get into the detail, you don't understand the complexity that lies underneath, and you can't tell a real constraint from a preference.

It also earns trust. People are far more willing to agree to a design when they've seen the architect understand their part of it.

An example: when the promotion engine goes down

Take a problem every retailer meets sooner or later. A customer is at checkout with a valid coupon, or a promotion that should apply to their basket, and the promotion engine doesn't respond. Each group in the room has a fair point. Marketing wants the promise honoured, because a customer who was told about a discount expects to get it. Finance wants every discount to be accurate and traceable. Store and digital teams want the checkout to keep moving, because a queue or an abandoned cart costs more than the discount.

A directive answer picks one of those and ignores the rest: block the sale until the engine is back, or let the checkout guess at the discount. Working through it together, we landed on a middle ground. The sale goes through, and the coupon or promotion the customer was entitled to is recorded against the order. Once the engine is back, an automated check works out the correct discount, and the difference is refunded or credited to the customer, with a message that explains it.

Nobody got exactly what they started with. The customer still gets their discount, finance gets an accurate and auditable adjustment, and the checkout never stops. Everyone could see their concern respected in the answer, and that's what made it agreeable.

When consensus stalls

Consensus isn't the same as unanimity, and it isn't a licence to wait forever. Sometimes the options are clear, the trade-offs are understood and people still don't agree. At that point someone has to make the call, explain why, and own it. Doing the consensus work first is what makes that call land: people may not love the decision, but they know they were heard and they understand the reasoning.

Write it down

An agreement that lives only in a meeting fades fast. Once we've landed on an answer, I capture it through normal architecture practice: the decision, the options we considered, the constraints that shaped it and who agreed. That record is what stops the same debate restarting six months later with a new set of people.

Why this matters to the people funding it

Consensus can look slower at the start. It's faster over the life of a program. Designs that people helped shape get adopted rather than worked around, surprises surface in design rather than in testing, and fewer decisions get reopened through escalation. Done well, it's like an orchestra: many parts, each playing its own line, all in harmony.

What I'd do again

  • Bring the business, peer architects and the people on the ground in before the design settles.
  • Seek out disagreement early, and listen to it properly.
  • Get into the detail of the real system before asking anyone to agree to a design.
  • When consensus stalls, make the call, explain it and own it.
  • Write the agreement down so it outlasts the meeting.
← All field notes

Pattern · ERP + CRM

How to integrate Salesforce with S/4HANA

Integrating Salesforce and S/4HANA isn't one interface. It's a set of decisions about who owns each object, which way data flows, how the two data models line up and what happens when either side is unavailable. This is the order I make those decisions in.

The two halves of the integration

In practice, a Salesforce to S/4HANA integration has two halves, and they need different thinking.

Generic Salesforce and S/4HANA integration in two halves: A, the Salesforce party model to S/4HANA Business Partners; B, Salesforce order management to S/4HANA sales order and fulfilment Salesforce SAP S/4HANA Integration layer APIS · EVENTS · QUEUES A · CUSTOMER Party modelAccount & contactPerson account Business PartnerCustomer roleAddresses & relationships Customer syncEVENTS · ID CROSS-REF B · ORDERS Order managementOrder & order summaryFulfilment orders Sales & fulfilmentSales orderDelivery & billing Sales orderASYNC + ACKNOWLEDGEMENT Status updatesDELIVERY · INVOICE · EVENTS MONITORING · ERROR HANDLING
Fig. 1 · The two halves of a Salesforce to S/4HANA integration. Product, price and availability flows support the order half.

Get the customer half right first. S/4HANA can't create a sales order for a customer it doesn't recognise, so in my experience many order failures in testing trace back to the customer half rather than the order half.

1. Decide ownership before you draw a single interface

The most common mistake I see is starting with a list of interfaces. Start with a list of business objects instead, and give each one exactly one system of record: customer and account, product, price, order, fulfilment and delivery, invoice and payment.

A common split is that the CRM owns engagement, order capture and orchestration, while the ERP owns product master, the pricing engine, fulfilment and finance. Your split may differ. What matters is that it's written down and that nobody can point to an object with two owners.

Every object gets one owner. Everything else holds a copy, and knows it's a copy.

Once ownership is clear, most interfaces design themselves: data flows out from the owner to whoever needs a copy, and changes flow back to the owner as requests, not updates.

2. Pick a pattern per flow, not one for everything

Different flows need different patterns. All of them go through the same governed middle layer.

Everything goes through the integration layer, even when a direct connector exists. The connector saves a week at the start and costs you visibility, reuse and a single place to enforce security for the life of the platform.

3. Respect that the data models don't line up

SAP thinks in documents: header, items, schedule lines. Salesforce order management thinks in orders, order items and delivery groups. Mapping one to the other is where most build effort goes, and where a few lessons repeat.

4. Design failure as a first-class flow

Every flow needs an answer to "what if the other side said no, or didn't answer?"

5. Plan the cutover traffic, not just the cutover date

On go-live, the CRM may be ready long before the ERP is accepting orders. Build a control so the CRM pushes only when the ERP is ready, and release the backlog in small batches rather than all at once. A controlled trickle lets you spot a mapping problem on the first handful of orders, not the first few thousand.

Why this matters to the people funding it

A Salesforce to S/4HANA integration lives for a decade. Clear ownership reduces rework during the build; a governed middle layer reduces the cost of every change after it; and designed failure paths are what stop an outage turning into a week of manual reconciliation.

What I'd do again

  • Write the object ownership table first and get it signed off.
  • Choose a pattern per flow, and route everything through the integration layer.
  • Use full-replace for unstable child records and do time conversion in one place.
  • Design the failure and cutover paths with the same care as the happy path.
← All field notes

Pattern · Integration

Enterprise services: integrate once, change behind the contract

Point-to-point integration ties every consumer to every backend's quirks, so changing a provider means changing everyone. An enterprise service puts one owned, reusable contract on the integration middleware in front of a business capability, so consumers integrate once and backends can change behind it.

The problem with point-to-point

Picture a retailer where the website, the store systems and the CRM each call the pricing engine directly. Each has its own credentials, its own retry logic and its own idea of what a price includes. Now replace the pricing engine. That's three projects, three test cycles and three chances to get it wrong.

Multiply that across accounts, orders, products, pricing and billing, and you have a landscape where every change is expensive and nobody can say who depends on what.

What an enterprise service is

An enterprise service is a business capability exposed through the integration middleware with four properties:

Swapping or adding a provider happens behind the contract. Consumers don't change.

The kinds of capability that suit this are the ones many systems need and few systems should own the details of: customer account, order, product, pricing and billing.

Design rules I hold to

Model what consumers need, not everything the provider offers. A canonical product model doesn't need every attribute every backend holds. It needs what your consumers use, expressed so that adding a source system is a mapping exercise, not a redesign.

Separate provider responsibilities from service responsibilities. On a billing service, it's easy to blur the line between the two. Tax and invoice rules belong to the billing engine behind the service; retries, error mapping and consumer access belong in the service layer. Write down which is which before anyone builds.

Validate every claim against the provider's spec. Before circulating a service design, I do a revalidation pass of every statement against the provider's actual API documentation. It has caught substantive errors more than once.

Validate early, at every entry point. Some providers reject a whole request for one bad field. An ERP rejecting a whole order over one missing account detail is the classic case. Validate where data is entered, and keep a safety net downstream.

Standardise the boring parts. Security identities per domain, shared error handling and central alerting are set once for all services, not reinvented by each one.

One service, one repository, one design page. The design page is versioned with the code, so the documentation describes what's actually running.

Where it doesn't fit

An enterprise service isn't free. It adds a hop. Replacing a slow legacy endpoint with a service is usually low-risk. Replacing a consumer's own fast local backend is not: if a channel answers a price in tens of milliseconds today, a central service has to be performance-tested against that before anyone commits, and the consumer may need its own optimisation.

The data platform has a role too, but for scheduled consumption and analytics, not as a real-time backend for customer-facing journeys.

The business case in one paragraph

Enterprise services turn integration from a cost you pay per consumer into an asset you build once. They lower the cost of switching providers, which strengthens your hand in commercial negotiations. They shorten onboarding for new channels. And they give you one place to answer the questions auditors and security teams always ask: who calls what, with which identity, and what happens when it fails.

What I'd do again

  • Start with capabilities many systems need, where provider change is likely.
  • Keep the canonical model lean and consumer-driven.
  • Write down provider versus service responsibilities, and revalidate against the spec.
  • Performance-test before replacing anything a consumer already does fast.
← All field notes

How-to · AI delivery

AI-driven integration development on SAP Integration Suite

This is the practical companion to my lessons piece on AI in delivery: the toolchain, the inputs, the workflow and the controls I use to have AI agents build and review integration flows on SAP Integration Suite. None of it depends on a particular model; all of it depends on discipline.

The toolchain

Keep it to one front end. Developers work in VS Code, with the AI coding agent, Git and the platform tooling all in the same place. Each interface or enterprise service gets its own Git repository. Design pages live in the team wiki, one per interface, and each version of a design page is paired with the version of the integration flow it describes.

One rule up front: check whether a repository already exists before creating one. It sounds trivial. It's the first thing that goes wrong when several people start at once.

Three kinds of work

Every piece of work starts as exactly one of these:

Naming the kind of work tells the agent, and the reviewer, what "done" looks like.

The inputs that decide the quality

The agent is only as good as what it's given. For new development that means:

Most "AI got it wrong" moments were really "the design didn't say".

The workflow

Two human gates: the architect approves the breakdown, and a person verifies and deploys.

What goes in the rules file

Think of it as the standards a senior reviewer would otherwise apply by memory: security and authentication patterns, naming, error handling and dead-letter routing, logging rules (what must never be logged), central alerting conventions and preferred adapters. Write it once for the organisation, and every agent and every developer gets the same reviewer.

Review mode: the underrated use

The same setup works in reverse. Point the agent at an existing flow with the rules file, and it reports where the flow breaks the standard and proposes fixes. Retrofitting existing interfaces to a standard is work that almost never gets prioritised by hand. With an agent, it becomes routine, and it's the safest place for a team to learn the approach.

What's still manual, on purpose

Deployment. Automated deployment from the agent didn't work in my first iteration, and I'm in no hurry. A person verifying before deploying is a cheap control, and nothing about the speed-up depends on removing it.

Beyond integration

The same shape carries over to CRM development: agents with explicit human checkpoints, read-only access where they need to inspect a real environment, and security scanning built into the developer's tools from the first line rather than bolted on at the end. Most real features cross CRM, ERP and integration anyway, so the approach should too.

Why this matters to the people funding it

The value isn't that an agent writes integration code. It's that design intent survives from the meeting room to the running interface, standards are applied every time instead of when someone remembers, and the documentation is always current. That's lower rework, lower operational risk and less dependence on any one person's memory.

What I'd do again

  • One front end, one repository per interface, design pages versioned with the code.
  • Write the rules file and a worked example before the first real build.
  • Make the architect's approval of the flow breakdown a hard gate.
  • Start the team in review mode, and keep deployment human.
← All field notes

Case study · Resilience

Design for the outage you'll actually have

When a cloud service on the checkout path goes down, the usual answers are to accept the lost sales or build expensive multi-region failover. On one program we chose a third option: take the order now, confirm the detail later, and design the recovery as carefully as the happy path.

The problem

Every retailer has a service that tells the customer when their order will arrive or be ready to collect. On this program that delivery-promise service ran on a cloud platform, and every channel called it before the customer could pay.

That made it a single point of failure at the most expensive moment in the journey: just before money changes hands. The platform's planned maintenance and its rare unplanned incidents both landed in the same place. Customers could browse and fill a basket, then hit a wall.

I was asked to find a high-availability or disaster recovery answer. The brief sounded technical. The answer turned out to be mostly a business design.

The options

The first two options treat it as an infrastructure problem. The fourth treats it as a customer problem, which is what it actually is.

The decision

The happy path is unchanged. The new work is the hold state and what happens after it.

When the promise service is unavailable, channels accept the order without a confirmed date and send it to order management in its own hold state. Once the service is back, the held orders are confirmed and released, and customers get a message written for exactly that situation. If, in the worst case, an order can't be honoured, we contact the customer, cancel cleanly and reverse the payment.

A sale that's slow to confirm is a much smaller problem than a sale you never made.

For executives, that's the trade in one line. The risk moves from infrastructure few people understand to a customer process everyone does: communication and, occasionally, a refund. And it costs a fraction of building and testing failover.

The details that made it work

A distinct status, not a reused one. It was tempting to park these orders as drafts. But a draft means "the customer hasn't finished", and that's not true here. A first-class hold state means fulfilment can't accidentally pick it up, and operations and reporting can see exactly what's waiting.

Know who you affected from minute one. The list of impacted customers is captured as the outage happens, not reconstructed afterwards. Remediation becomes a task, not a forensic exercise.

Different dependencies deserve different answers. For the integration platform itself, the answer is the opposite: a clean fail. No order accepted, no payment authorised. If you can't reliably record an order, holding it is worse than refusing it. Anyone who has reconciled orders and payments after an integration incident knows that's work you want to design away.

One page per dependency. Each critical dependency gets a one-page outage design in the same template: what the customer sees, what we capture, how we recover, who owns it. That format is what got this approved quickly.

What I'd do again

  • Start from what the customer experiences at the moment of failure, not from the platform's availability options.
  • Treat the recovery path as a requirement with an owner, not a runbook written later.
  • Be comfortable with asymmetric answers. Accept-and-hold for one dependency, clean fail for another.
  • Put each outage design on one page. If it doesn't fit, it isn't understood yet.
← All field notes

Field notes · AI delivery

Where AI actually speeds up enterprise delivery, and where it doesn't

I ran a proof of concept using AI agents to review, fix and build integration flows on SAP Integration Suite, then started moving a small group of developers onto the approach. The speed-up was real, but it came from places I didn't expect, and the hard parts weren't the AI.

Why I tried it

Integration delivery on a large ERP program usually runs as a relay. An architect writes the high-level design. Someone turns it into a detailed design. A developer builds from that. Each handoff loses context, and most rework traces back to something that was clear in a design meeting and gone by the time it reached the build.

So the question wasn't "can AI write code?" It was "can AI shorten the relay without dropping the baton?"

Where it genuinely sped things up

Where it didn't

Deployment. Automated deployment from the agent didn't work in the first iteration. So we kept it simple: the agent pushes to development, a person verifies, a person deploys. Automating that is a later step, and nothing about the value depends on it.

Consistency across repositories. Once I was working across several interfaces, each one started to drift: slightly different error handling, naming, logging. The fix wasn't a better prompt. It was a shared knowledge base, plus the organisation's security and integration standards in a single rules file that every agent reads on every build.

Handoffs. This was the big one. If an architect produces a finished build with AI, then hands it to a developer who wasn't in the design conversation, you've rebuilt the relay. The developer has the code but not the why. The real gain came from letting the people who hold the design context carry it through to a tested build in development.

AI didn't remove the handoff problem. It made it impossible to ignore.

The guardrails

None of this works inside an enterprise without rules that hold whether a person or an agent is doing the work.

Rolling it out

I didn't switch the whole team over. We started with a handful of developers, with change support for their day-to-day ways of working, and a single team guide covering process, documentation structure and onboarding. Every piece of work starts as one of three things: new development, a fix, or documenting an existing interface.

The message I give leadership is deliberately modest. This is a step-by-step learning process, not full automation. The agent sometimes gets things wrong. That's exactly why the knowledge base and the human review points exist, and why they matter more than the model.

What this means for a program budget

Build time shrinks, but that was never where most of the cost was. The bigger saving is in rework and handoffs, and you only get it if you change the operating model, not just the tooling. If you buy licences and keep the relay, expect a modest gain. Redesign who carries the design through to the build, and the gain compounds.

What I'd do again

  • Start with review and documentation of existing interfaces. Low risk, high value, and it teaches you your own standards.
  • Write the shared rules and knowledge base before scaling past one person.
  • Keep deployment human until everything upstream is boring.
  • Fix the handoff, not just the build. Let design context travel with the work.
← All field notes

Field notes · ERP + CRM

Whose requirement is it anyway?

On an order orchestration program spanning a CRM and an ERP, the most expensive defects started as sentences in requirements documents that didn't say which system owned the behaviour. Two disciplines fixed most of it: attribute every requirement to exactly one system, and keep one tiebreaker document for order state.

The setup

The target design was a familiar one: the CRM orchestrates the order, the ERP fulfils it, and an integration layer sits between them. Orders came from several channels and covered several types of product, each with its own path through the two systems.

Two platform teams, two backlogs, and one set of requirements written by people who, quite reasonably, thought about the business process rather than the systems.

The problem

Take a harmless-looking requirement: "The customer is notified when the order ships." Which system detects that the order shipped? Which one sends the notification? Which one stores that it was sent?

When a requirement doesn't say, one of two things happens. Both teams build it and the customer gets two messages. Or each team assumes the other has it and the customer gets none. Either way, you find out in integration testing, which is the most expensive moment to discover a design gap.

Ambiguous ownership doesn't show up in design reviews. It shows up in test, with a deadline attached.

Discipline one: precise system attribution

Every requirement names exactly one system and states only what that system must do. If two systems are involved, it becomes two requirements, plus an interface between them.

That sounds bureaucratic. In practice it made requirements shorter. A CRM requirement no longer describes what the ERP does, and an ERP requirement no longer smuggles in CRM obligations. Each team reads its own list and knows that's the whole job.

The supporting artefact is a requirements traceability matrix per system, not one giant matrix with a "system" column that everyone filters differently.

Discipline two: one tiebreaker

Large programs accumulate logic sheets: one per channel, one per product type, one from each workshop. Sooner or later two of them disagree.

We kept a single authoritative order-state model. Every state an order can be in, which system owns each transition, and what triggers it. When documents conflicted, the state model won, and any change to behaviour went through it first. It turned arguments about wording into a question with one place to look up the answer.

The deliverables that held it together

The same rule applies to integration decisions

Later, we had to decide how to recover orders that failed to transfer between two order management systems. Options included adding a separate orchestration component, or copying existing integration flows to build a recovery variant. We chose to have the owning system poll the other's standard API on a schedule.

Same principle: the system that owns the outcome owns the recovery, and nothing new goes into the live transaction path unless it has to. Copied flows and extra components look cheap on day one and cost you on every change after that.

Why this matters to the people funding it

None of this is clever. It's a writing discipline. But it moves the discovery of design gaps from test back into design, where fixing them costs a conversation rather than a sprint. On a program with fixed cutover dates, that's the difference between a controlled plan and a late scramble.

What I'd do again

  • Ban requirements that don't name exactly one system.
  • Create the state model first and make it the tiebreaker from day one.
  • Keep traceability per system, so each team owns a complete list.
  • Apply the same ownership test to every recovery and error path.