Core Domain vs. Supporting Domain vs. Generic Domain
- Domain-Driven Design
- Architecture
One of the biggest misconceptions about Domain-Driven Design is that every part of a software system deserves the same level of attention. It doesn't. Some parts of your system define your business. Some simply help it operate. Others have already been solved thousands of times and shouldn't consume much of your engineering effort.
One of the most valuable ideas in Domain-Driven Design is learning how to distinguish between these parts. Eric Evans classifies them into three categories:
- Core Domain
- Supporting Domain
- Generic Domain
Understanding the difference helps you answer an important question:
Where should your team spend its time and energy?
Every Business Has Different Levels of Value
Imagine you're building software for an online retailer. The system contains features like:
- Product recommendations
- Authentication
- Inventory management
- Order processing
- Email notifications
- Reporting dashboards
- Payment integration
At first glance, every feature seems important. But are they equally valuable to the business? Probably not.
Customers don't choose a platform because it has a login page. They don't switch products because the password reset email looks nicer. Instead, they choose products because of what makes that business unique. This is exactly what Domain-Driven Design wants us to recognize.
Core Domain
The Core Domain is the heart of the business. It's the part of the system that gives the company its competitive advantage. If another company copied everything except the Core Domain, they still wouldn't be able to compete effectively. The Core Domain represents the unique knowledge, expertise, and business rules that make the company different.
Example: Ride Sharing
Think about a ride-sharing platform. Its success doesn't come from user authentication or profile management. It comes from solving difficult business problems such as:
- Matching drivers with passengers
- Estimating arrival times
- Dynamic pricing
- Route optimization
- Driver allocation
These are the problems that directly affect the company's success. That's the Core Domain.
Characteristics of a Core Domain
A Core Domain usually has several characteristics:
- Complex business rules
- Frequent business changes
- High business value
- Unique knowledge
- Competitive advantage
This is where your best engineers should spend most of their time. This is also where Domain-Driven Design provides the greatest return.
Supporting Domain
A Supporting Domain helps the business operate, but it isn't what makes the company unique. Without it, the business would struggle. However, customers rarely choose the company because of it.
Example
Consider an e-commerce platform. Features like:
- Warehouse administration
- Internal reporting
- Employee management
- Vendor management
are all important. They support the business. But they don't define it. Another company could purchase similar software and operate successfully. Unlike the Core Domain, these areas don't usually provide a competitive advantage.
Characteristics of a Supporting Domain
Supporting Domains typically:
- Contain real business logic
- Are customized to fit the organization
- Support the Core Domain
- Don't significantly differentiate the business
They deserve good engineering practices, but usually not the same level of innovation as the Core Domain.
Generic Domain
A Generic Domain solves problems that almost every software system needs. These problems have already been solved repeatedly. Instead of building them yourself, it's often better to use existing solutions.
Examples include:
- Authentication
- Email delivery
- Logging
- File storage
- Monitoring
- PDF generation
- Identity management
These capabilities are important. But they are not unique.
Example
Suppose you're building an online bookstore. Should your team spend six months building a custom authentication system? Probably not. There are already mature solutions available. Your time is usually better spent solving the problems that actually make your product valuable. This is why Generic Domains are often bought instead of built.
A Practical Example
Imagine you're building an online marketplace. You might classify the system like this.
Core Domain
- Product recommendation engine
- Inventory allocation
- Pricing strategy
- Order fulfillment optimization
These directly influence customer experience and business success.
Supporting Domain
- Supplier management
- Internal reporting
- Customer support dashboard
- Warehouse administration
These help the business operate efficiently but don't define it.
Generic Domain
- User authentication
- Email notifications
- Logging
- File uploads
- Monitoring
These solve common software problems that nearly every application has.
Why This Classification Matters
Imagine your engineering team has ten developers. Should your most experienced engineers spend months improving email templates? Probably not. Should they spend months improving the recommendation engine that drives revenue? Absolutely.
Domain-Driven Design isn't just about modeling software. It's also about investing engineering effort where it creates the most business value. The Core Domain deserves your strongest architecture, your deepest modeling, and your best engineers. Supporting Domains deserve thoughtful design, but often with simpler solutions. Generic Domains should frequently leverage existing frameworks, libraries, or third-party services instead of reinventing the wheel.
Common Misconceptions
"The biggest module is the Core Domain."
Not necessarily. A recommendation engine might contain far fewer lines of code than an administration panel while contributing significantly more business value. Business importance and code size are rarely the same thing.
"Generic means easy."
Not at all. Authentication, distributed logging, and cryptography are technically challenging problems. They're called Generic because they solve common problems shared by many businesses—not because they're simple.
"Everything important is Core."
Again, no. Payroll software is essential for many companies. But customers don't choose a business because of its payroll system. Essential doesn't always mean differentiating.
A Simple Mental Model
Whenever you're evaluating a feature, ask yourself three questions.
Would customers choose our product because of this capability?
If the answer is yes, you're probably looking at the Core Domain.
Does the business need this, but it doesn't make us different?
That's likely a Supporting Domain.
Does almost every software system need this capability?
Then it's probably a Generic Domain.
Final Thoughts
One of the biggest lessons in Domain-Driven Design is that not all software deserves the same investment. Some parts of your system are where your business wins. Some simply help the business operate. Others have already been solved by countless companies before you.
Recognizing the difference helps you make better architectural decisions, allocate engineering effort wisely, and focus on building software that creates real business value. Because in the end, great software isn't just about writing better code. It's about solving the right problems.
Working on something that needs this kind of thinking?
I design and build systems that hold up in production — from domain modeling to delivery.