Think about the last time you ordered food online.
You pick a restaurant, add a few things to your cart, enter your address, choose a payment option and click Place Order.
A few seconds later, you see:
Order Confirmed.
From your point of view, it was one click. Behind that click, though, several different pieces of software have to communicate with each other, make decisions, process information and eventually bring a result back to your screen.
Let's take that one everyday action and unpack what is actually happening.
So, what happens after you click?
A simplified view: in a real application, some checks may happen in parallel, while others have to wait for a result before they can continue. The exact sequence depends on how the product has been designed.
Before we go further, let's decode that flow.
There are a few terms in the diagram that you'll hear constantly in technology projects. Let's make them concrete using our food-order example.
The app
This is the part you interact with. The food delivery app on your phone is the frontend.
When you choose a restaurant, add food to your cart or tap Place Order, you're interacting with this part of the system.
The backend
The backend is the part running behind the scenes. It receives information from the app and performs the work needed to process the request.
You don't see the backend on your screen. When you click Place Order, the app needs somewhere to send that request. The backend is one of the places involved in handling it.
The system
When we say the system, we're usually talking about the different software components working together to deliver a particular function.
For our food-order example, that could include the app, backend services, payment services, databases, the restaurant's order system and other supporting services.
API
An API is a way for two pieces of software to communicate with each other.
The food delivery app needs to send your order information to the backend. It can do that through an API.
You can think of the API as the agreed way of asking another software component to do something or provide information.
The app needs to know what information to send, where to send it and what kind of response it can expect back.
Database
A database is where information can be stored and retrieved.
Once your order has been created, information about that order needs to be stored somewhere so it can be retrieved later — for example, to show your order history or update the order status.
Response
The communication doesn't stop when the app sends the request. Something eventually comes back. That's the response.
For example, the backend may return information telling the app that the order was successfully created. The app can then use that information to show:
Order Confirmed.
So the journey is really more like:
And that simple pattern appears in many things we use every day.
Now let's look at this like a PM.
This is where a simple button starts becoming a much bigger delivery problem.
Imagine someone gives you a requirement:
At first, that sounds pretty straightforward.
But as a PM, you'd probably start asking a few questions.
What exactly should happen when the user clicks it?
- Does the button become disabled immediately?
- What does the user see while the request is being processed?
- What if payment takes a few seconds?
- What if the user taps the button twice?
- What if the restaurant becomes unavailable between adding the food and placing the order?
- What if payment fails?
- What if payment succeeds but something goes wrong while creating the order?
Suddenly, “Build a Place Order button” isn't a very complete requirement anymore.
The button is only the visible part of the feature.
What's happening behind the screen?
Think about everything that needs to happen for that button to actually work.
- Validate the order
- Check restaurant and item availability
- Validate delivery information
- Process payment
- Create the order
- Save the order information
- Notify the restaurant
- Return the appropriate status to the app
Those responsibilities may sit with different technical components or even different teams.
This is where a PM starts looking beyond the individual task.
Instead of asking only:
you start asking:
And who is actually building all this?
A feature like this may involve several teams.
Builds what the customer sees and interacts with.
Builds the services that process the order.
Handles communication with the payment provider or payment system.
Tests whether the feature behaves correctly, including what happens when things go wrong.
May be involved in infrastructure, deployment, environments, monitoring and operational readiness.
There may be other teams too, depending on the product.
The PM's job isn't to personally build each of these pieces. It's to understand enough about the overall flow to see how the pieces fit together.
What can happen in parallel?
This is another important part of technical delivery.
Not every activity has to wait for the previous one to finish.
While the backend team is building the order-processing logic, the frontend team can work on the Place Order experience. QA can prepare test scenarios. Infrastructure work can happen alongside development.
But there are still points where teams need to agree.
For example, the frontend needs to know how it should communicate with the backend.
What information does it send? What does the backend expect? What does the response look like? What happens if the request fails?
That agreement becomes important because teams may be working in parallel.
This is where understanding something as simple as an API becomes useful for a PM.
“Have the frontend and backend teams agreed on the request and response?”
“Can these two teams continue working independently, or is there a dependency between them?”
What happens when something goes wrong?
Let's say you click Place Order.
The payment goes through.
But the order isn't created.
What does the customer see?
And more importantly, what happened behind the scenes?
This could involve several different systems. Maybe the payment service says successful, but the order service doesn't receive the expected response. Maybe the order was actually created, but the app didn't receive the confirmation. Maybe the restaurant system wasn't updated.
From the customer's perspective, they may simply see:
Something went wrong.
From a delivery perspective, there are several questions to answer:
- Where exactly did the flow stop?
- Which component is responsible?
- Did the payment actually go through?
- Was the order created?
- Can the request be retried safely?
- What should the customer see?
- How does the team know this happened?
“Where in the request flow is the failure occurring?”
Now think about scale.
Imagine the same food delivery application when it is relatively small. Maybe a few hundred people are placing orders at a particular time.
Now imagine a major sale, a festival, a cricket match ending, or a popular restaurant promotion. Suddenly, thousands of people may be placing orders around the same time.
The flow hasn't changed from the customer's perspective. They still click Place Order.
But the system now has to handle much more traffic.
That raises a different set of questions:
- Can the system handle the increased number of requests?
- Which component could become a bottleneck?
- Can different parts of the system scale independently?
- How will the team know if something is slowing down?
- What happens if one component becomes overloaded?
Again, the PM doesn't need to design the scaling architecture. But understanding the flow makes it possible to have a meaningful conversation about the risks.
And this is where “done” gets interesting.
Imagine the frontend team says:
“Place Order is done.”
The backend team says:
“Order API is done.”
The payment team says:
“Payment integration is done.”
QA says:
“Testing is complete.”
Does that automatically mean the feature is ready for customers?
Not necessarily.
You still need to ask:
- Can the customer actually place an order?
- Does the payment work?
- Is the order created correctly?
- Does the restaurant receive it?
- Does the customer receive the correct response?
- What happens when payment fails?
- What happens when the restaurant is unavailable?
- What happens if the customer taps the button twice?
- Has the complete journey been tested?
That's the difference between tracking individual deliverables and understanding end-to-end delivery.
The PM mental model
Let's go back to where we started.
You clicked:
Place Order.
What looked like one action actually involved:
And around all of that are:
Teams. Dependencies. Parallel work. Risks. Failure scenarios. Testing. Operational readiness.
That's the part I find particularly useful for a PM to understand.
When someone says:
you should be able to ask:
When someone says:
you can ask:
When someone says:
you can ask:
Those questions come from understanding the flow.
One button. A lot of thinking.
The next time you click Place Order, you probably won't see any of this.
You'll just see:
Order Confirmed.
But behind that confirmation is a chain of software components, decisions, dependencies and teams working together.
And that's the shift this series will explore.
You start with a feature that looks simple on the surface. Then you learn to see the technical flow underneath it — and eventually, the delivery questions that come with it.
The question changes from:
to:
“What has to be true for the whole thing to actually work?”
TECH WITHOUT THE JARGON · #02
What Are Microservices — and Why Does Your App Need Them?
From one customer experience to many services working underneath it.