Phase 01 — System Design Foundation | Topic 03
You receive a requirement:
“Build an Order Management System.”
What do you do first?
Open Visual Studio?
Create a database?
Create an OrderController?
Not yet.
Before writing code, we need to answer one simple question:
“What should the system actually do?”
That is the purpose of Functional Requirements.

What Are Functional Requirements?
Functional requirements describe the features, actions, and business operations that a system must provide.
In simple words:
Functional Requirements = What the system should do.
For example, an Order Management System might need to:
Register customers
Allow customers to place orders
Display order history
Allow order cancellation
Allow admins to view orders
Allow admins to update order status
Send order confirmation notifications
These are functional requirements because they describe actual system behavior.
Functional Requirements Start With Users
Before listing features, identify who will use the system.
For our Order Management System:
Customer
A customer might be able to:
Register and log in
Browse products
Place an order
View order history
Cancel an eligible order
Track order status
Admin
An admin might be able to:
View all orders
Update order status
Manage products
View customer information
Generate reports
Send notifications
Now we are getting a much clearer picture of the system.
Features vs User Actions
These two are related, but developers should understand the difference.
Feature
Order Management
User Action
Customer places an order.
Business Operation
The system creates the order, stores the order details, and updates the required information.
Think about it like this:
Feature → User Action → Business Operation
For example:
Order Cancellation → Customer cancels order → System validates whether cancellation is allowed and updates the order status.
This way of thinking becomes extremely useful when designing APIs and business logic.
Let's Convert Requirements Into APIs
Once we understand the functional requirements, we can start thinking about APIs.
For example:
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
// Create a new order
[HttpPost]
public IActionResult CreateOrder(OrderRequest request)
{
// Business logic goes here
return Ok();
}
// Get a customer's order
[HttpGet("{id}")]
public IActionResult GetOrder(int id)
{
return Ok();
}
// Get all orders
[HttpGet]
public IActionResult GetOrders()
{
return Ok();
}
// Update order status
[HttpPut("{id}/status")]
public IActionResult UpdateStatus(int id, UpdateStatusRequest request)
{
return Ok();
}
// Cancel an order
[HttpDelete("{id}")]
public IActionResult CancelOrder(int id)
{
return Ok();
}
}Notice something important.
We didn't randomly create these APIs.
Each API came from a functional requirement.
For example:
Requirement | Possible API |
|---|---|
Place Order |
|
View Order |
|
View Orders |
|
Update Status |
|
Cancel Order |
|
This is how requirements start turning into technical design.
But Functional Requirements Are More Than APIs
This is where many developers make a mistake.
They think:
Functional Requirement = API Endpoint
Not exactly.
An API is only one way of implementing a requirement.
Consider:
Customer can cancel an order.
The requirement does not tell us to simply execute:
order.Status = "Cancelled";We also need to understand the business rules.
For example:
Can a shipped order be cancelled?
Can a delivered order be cancelled?
Can an already cancelled order be cancelled again?
Should the customer receive a notification?
Should inventory be restored?
Now the functional requirement is becoming a real business operation.
Functional Requirements Drive the System Design
This is why requirements should be understood before architecture.
A simple requirement such as:
“Send an email after an order is placed.”
can lead to additional design questions:
Should email sending happen immediately?
What happens if the email service is unavailable?
Should failed emails be retried?
Should email processing happen in the background?
Do we need a message queue?
A simple business requirement can therefore influence:
API → Business Logic → Database → Background Processing → Messaging → Resilience
This is the real connection between requirements and System Design.
A Simple Checklist
Before designing your application, ask:
👤 Users
Who will use the system?
⚙️ User Actions
What can each user do?
🧩 Features
What features does the system need?
💼 Business Operations
What business processes must the system support?
🗃️ Data
What information is required?
⚠️ Rules
What conditions or restrictions apply?
🔌 APIs
What operations need to be exposed?
If you can answer these questions, you have a much stronger foundation for your system design.
IMPORTANT: Don't Start With Technology
When you receive a requirement, don't immediately think:
“Should I use ASP.NET Core, SQL Server, Redis or Microservices?”
First understand:
What should the system do?
Then identify:
Users → Actions → Features → Business Operations → Data → APIs
Only after that should you start making architectural and technology decisions.
Final Takeaway
A strong developer doesn't just ask:
“How do I implement this?”
A strong developer first asks:
“What exactly does the system need to do?”
That small change in thinking can make your API design, database design, business logic, and overall architecture much clearer.
And this is one of the first steps in moving from:
“I write .NET code.”
to
“I can design .NET systems.”
What's Next?
Phase 01 — System Design Foundation | Topic 04 — Non-Functional Requirements: How Should the System Work?
In the next article, we'll look at the other side of requirements:
Performance, scalability, availability, security, reliability, and more.

Join the conversation! Your thoughts help the community grow.