You're Probably Writing Business Software

If you think "business software" means enterprise payroll systems, accounting platforms, or some massive application used by thousands of employees, think again.
If you work on a web application or SaaS product, you write business software.
It doesn't matter whether you're building a food-delivery app, a developer tool, an e-commerce platform, a social network, or a simple internal dashboard.
The moment your application starts making decisions about money, users, permissions, ownership, states, time, or responsibilities, you're implementing business rules.
And that changes how you should think about software development.
What Actually Makes Software "Business Software"?
Let's forget the image of a typical enterprise application for a moment.
Imagine you're building a simple SaaS application where users can create projects and invite teammates.
At first, it sounds like basic CRUD:
- Create a project
- Read a project
- Update a project
- Delete a project
But then the questions start appearing:
- Who can create a project?
- Can every user create unlimited projects?
- Can a member delete a project?
- Can someone outside the organization be invited?
- What happens when an invitation expires?
- What happens when a user leaves the organization?
- Can an organization have multiple owners?
- What happens when the subscription expires?
- Can users still access their projects after cancellation?
Those aren't database questions.
They're not React questions.
They're not PostgreSQL questions.
They're business questions.
And once your software has to answer those questions, you're writing business software.
Almost Every SaaS Application Has Business Rules
Consider a food-delivery application.
From the outside, it might look like a simple application:
Customer → Restaurant → Order → Payment → Delivery
But underneath that interface is a collection of business rules.
For example:
- A restaurant cannot accept orders while closed.
- An order cannot be delivered before it is confirmed.
- A cancelled order may or may not be refundable.
- A restaurant receives only part of the payment.
- The platform takes a commission.
- A driver can only accept certain deliveries.
- A customer cannot cancel an order after a certain point.
- A refund may take several days to process.
None of these rules come from your framework.
Your framework doesn't know what "cancelled" means to your business.
Your database doesn't know whether a customer deserves a refund.
Your API doesn't know whether a restaurant is allowed to accept an order.
You have to model those rules.
That's business software.
The UI Is Not the Business Logic
One of the easiest mistakes developers make is confusing what the interface allows with what the business allows.
Suppose you have a button:
[ Cancel Subscription ]
You might implement:
if (user) {
cancelSubscription(user);
}
But that's not enough.
The real questions might be:
Can this user cancel the subscription?
↓
Is the subscription active?
↓
Is there an unpaid invoice?
↓
Does cancellation happen immediately?
↓
Does the customer retain access until the billing period ends?
↓
Is the customer eligible for a refund?
↓
What happens to the team's members?
↓
What happens to scheduled payments?
↓
What should the billing provider receive?
↓
What should we record in our audit log?
Now you're dealing with business rules.
The button was easy.
The business process was not.
Business Rules Are Everywhere
Once you start looking for them, you'll see business logic everywhere.
E-commerce
An online store isn't just:
Products + Cart + Checkout
It has rules.
- Can a product be purchased?
- Is it in stock?
- Which price applies?
- Is the customer eligible for a discount?
- Is tax required?
- Can an order be cancelled?
- When can a refund happen?
- Who pays shipping?
- What happens when part of an order is returned?
These are business decisions.
Banking and Fintech
A payment application is an even clearer example.
A payment can move through states such as:
PENDING
↓
PROCESSING
↓
SUCCESS
or:
PENDING
↓
FAILED
Or:
SUCCESS
↓
REFUND_REQUESTED
↓
REFUNDED
Each transition has rules.
Can a successful payment become pending again?
Can a refunded payment be refunded twice?
What happens if the payment provider sends the same webhook three times?
What happens if your application crashes after receiving a successful payment but before saving it?
These aren't merely technical edge cases.
They're part of the business behavior of the system.
Even "Simple CRUD" Has Business Logic
Developers sometimes say:
"It's just a CRUD application."
Usually, it isn't.
Suppose you're building an employee-management application.
You have:
Employee
Department
Manager
Leave Request
You might start with:
POST /employees
GET /employees
PUT /employees/:id
DELETE /employees/:id
Looks simple.
Then someone asks:
"Can a manager delete an employee?"
Now you need a rule.
Maybe the answer is:
Only HR administrators can delete employees.
Then another question appears:
"What happens to the employee's pending leave requests?"
And another:
"Should historical records still show the employee?"
And another:
"What happens to documents owned by that employee?"
And suddenly your "simple CRUD application" has a domain.
That's the point.
CRUD describes how data is manipulated. It doesn't describe what the business means.
Business Logic Is About Meaning
This distinction is extremely important.
Consider:
order.status = "cancelled";
Technically, that's easy.
But what does cancelled actually mean?
Does it mean:
- The customer requested cancellation?
- The restaurant rejected the order?
- The payment failed?
- The driver couldn't be assigned?
- The business cancelled it?
- The order was automatically cancelled after a timeout?
Those might all have different consequences.
Maybe:
Customer cancellation
→ Full refund
while:
Restaurant cancellation
→ Full refund + restaurant penalty
and:
Payment failure
→ No refund because no payment was captured
The database field is the same:
status = cancelled
But the business meaning is different.
This is why good application architecture isn't just about organizing files.
It's about representing the domain correctly.
The Five Things Business Software Constantly Deals With
A useful way to recognize business logic is to look for these five areas.
1. Money
Whenever your software handles money, you're almost certainly writing business software.
Examples:
- prices
- discounts
- taxes
- invoices
- subscriptions
- refunds
- commissions
- balances
- payouts
- currency conversion
A simple-looking calculation like:
total = price - discount
can become surprisingly complicated.
What if the discount is percentage-based?
What if there's a maximum discount?
What if tax is calculated before the discount?
What if the customer uses a coupon?
What if the order contains products with different tax rules?
Money introduces business rules very quickly.
2. Ownership
Ask:
Who owns this thing?
For example:
Who owns the project?
Who owns the account?
Who owns the uploaded file?
Who owns the organization's data?
Who receives the money?
Ownership affects permissions, billing, deletion, access, and responsibility.
A surprisingly large amount of application complexity comes from answering:
"Who is allowed to do what to which resource?"
3. Permissions
Authentication answers:
"Who are you?"
Authorization answers:
"What are you allowed to do?"
Business software needs the second one constantly.
For example:
Owner
├── Manage billing
├── Delete organization
├── Invite members
└── Manage roles
Admin
├── Invite members
├── Manage projects
└── Manage users
Member
├── View projects
└── Create tasks
Those aren't merely technical permissions.
They're representations of how the organization operates.
4. State
Business processes are usually stateful.
An order isn't simply "an order."
It moves through a lifecycle:
CREATED
↓
CONFIRMED
↓
PROCESSING
↓
SHIPPED
↓
DELIVERED
And there are rules about which transitions are valid.
For example:
CREATED → CONFIRMED ✓
CONFIRMED → PROCESSING ✓
PROCESSING → SHIPPED ✓
SHIPPED → DELIVERED ✓
DELIVERED → CREATED ✗
Thinking in terms of states and transitions can make complicated business processes much easier to understand.
5. Time
Time creates business rules everywhere.
Consider subscriptions.
A subscription might be:
Active
today but scheduled to become:
Cancelled
at the end of the billing period.
That means your system needs to understand:
- current state
- future state
- effective date
- billing period
- grace period
- expiration
- renewal
Time isn't just a timestamp stored in PostgreSQL.
Time can be part of the business model.
The Most Dangerous Bugs Are Often Business Bugs
Developers often focus heavily on technical failures:
500 Internal Server Error
Database connection failed
NullPointerException
Timeout
Memory leak
Those bugs are obvious.
But business bugs can be much more dangerous because the application appears to work.
Imagine:
Customer pays $100
↓
Application records $100
↓
Payment provider sends webhook
↓
Webhook is processed twice
↓
Customer balance becomes $200
Nothing necessarily crashed.
The server may return 200 OK.
The database may be perfectly healthy.
The code may have passed all basic tests.
But the system is wrong.
That's a business correctness problem.
Idempotency Is Business Logic Too
Take payments as an example.
A payment provider might send:
payment.success
more than once.
Your application needs to make sure that processing the same event twice doesn't create two payments.
Conceptually:
Receive payment event
↓
Have we already processed this event?
↓
YES → Ignore it
NO → Process it
That's often described as a technical implementation detail.
But underneath it is a business rule:
A payment should only affect the customer's financial state once.
The technology implements the rule.
The rule comes from the business.
Your Framework Doesn't Understand Your Business
This is one of the most important lessons.
Laravel doesn't know what an invoice means.
Django doesn't know when an order should be refundable.
Spring doesn't know who should approve an expense.
React doesn't know whether an employee can delete another employee.
PostgreSQL doesn't know whether a subscription should remain active after cancellation.
These technologies give you tools.
They don't give you your domain.
You have to build that understanding yourself.
This Is Why Domain Modeling Matters
Once you recognize that you're writing business software, concepts like domain modeling and Domain-Driven Design become much more practical.
Instead of starting with:
"What tables do I need?"
you can start with:
"What concepts exist in this business?"
For a subscription system, you might discover:
Customer
Organization
Subscription
Plan
Invoice
Payment
SubscriptionChange
Then ask:
- What does each concept mean?
- What rules govern it?
- What relationships exist?
- What states can it have?
- What actions are allowed?
- What events happen when something changes?
Only then should you worry about how those concepts map to tables, APIs, classes, and UI components.
Don't Let Your Database Become Your Domain Model
A common approach is to design the database first:
users
orders
products
payments
subscriptions
Then build the entire application around those tables.
That can work for simple systems.
But as the business becomes more complicated, problems appear.
Your application starts looking like:
Controller
↓
ORM Model
↓
Database
with business rules scattered everywhere:
Controller
Service
Model
Middleware
Job
Webhook Handler
Frontend
Now nobody knows where the actual business rules live.
A better question is:
Where does this business rule belong?
For example:
"An order cannot be refunded after 30 days."
That rule should have a clear home.
You shouldn't have one version of the rule in the frontend, another in an API controller, and another in a background job.
Business Software Is Mostly About Rules
When you strip away the UI, APIs, frameworks, and databases, many applications can be described surprisingly simply:
Entities
+
Rules
+
State
+
Events
+
Processes
For example:
Customer
Subscription
Payment
plus:
A customer can have one active subscription.
A subscription belongs to a plan.
A subscription generates invoices.
A payment settles an invoice.
A failed payment may put a subscription into a grace period.
That's the actual system.
The React components and API endpoints are just ways of interacting with it.
The Developer's Job Is More Than Writing Code
This is where software engineering becomes more interesting.
If you're building software for a real business, your job isn't simply:
"Turn this ticket into code."
Your job is also to understand:
- What problem are we solving?
- What does the business mean by this concept?
- What rules must always hold?
- What can change?
- What must never happen?
- Who is responsible for what?
- What happens when something fails?
- What happens when users do unexpected things?
- What happens when external systems disagree with us?
The better you understand these questions, the better software you can build.
Talk to the Business
You don't necessarily need to be a business expert.
But you do need to ask questions.
Instead of asking:
"What endpoint should I create?"
try asking:
"What should happen when this happens?"
Instead of:
"Should this field be nullable?"
ask:
"Can this information legitimately not exist?"
Instead of:
"Can I delete this record?"
ask:
"What does deleting this record mean to the business?"
Instead of:
"What status should I add?"
ask:
"What states can this process actually be in?"
These questions lead to better designs.
The Best Developers Understand the Domain
You don't have to become a product manager.
You don't have to become an accountant.
You don't have to become a lawyer.
But if you're building accounting software, understanding basic accounting concepts will make you a better engineer.
If you're building payment software, understanding payment flows will make you a better engineer.
If you're building logistics software, understanding fulfillment will make you a better engineer.
If you're building healthcare software, understanding the domain will make you a better engineer.
Technical skill tells you how to build something. Domain knowledge helps you build the right thing.
So, Are You Writing Business Software?
If your application has:
- Users
- Accounts
- Payments
- Permissions
- Orders
- Subscriptions
- Workflows
- States
- Notifications
- Approvals
- Ownership
- Deadlines
- Policies
- Rules
then the answer is almost certainly yes.
You might call yourself a:
Frontend Developer
Backend Developer
Full-Stack Developer
SaaS Developer
Mobile Developer
But if you're building software that helps people or organizations perform real-world processes, you're also building business software.
The Mindset Shift
The biggest change isn't learning another framework.
It's learning to stop seeing your application as:
Screens
+
API endpoints
+
Database tables
and start seeing it as:
A model of a real-world system.
Your job is to make that model accurate.
When a customer pays, your software should understand what "paid" means.
When an order is cancelled, your software should understand what "cancelled" means.
When a subscription expires, your software should understand what access should change.
When a user is promoted to administrator, your software should understand what new responsibilities they have.
That's business software.
Final Thought
The next time someone says:
"I'm not building business software. I'm just building a SaaS app."
Think again.
That SaaS application probably has users, money, permissions, workflows, ownership, states, and rules.
That means you're already dealing with a business domain.
The sooner you recognize that, the better engineer you'll become.
Because great software isn't just software that works.
It's software that correctly represents how the world it's built for actually works.
Comments · 0
Be the first to comment.