Architecture Decision Records (ADRs): The Complete Guide

By Fernando March 8, 2025 17 min read

Table of Contents

  1. What Are Architecture Decision Records?
  2. Why ADRs Matter More Than You Think
  3. When to Write an ADR
  4. The ADR Template
  5. Real-World ADR Examples
  6. Where to Store ADRs
  7. How to Introduce ADRs to Your Team
  8. ADR Governance and Lifecycle
  9. Common Mistakes and How to Avoid Them
  10. Advanced ADR Practices

Every engineering team makes hundreds of architectural decisions over the course of a project. Which database to use. How to handle authentication. Whether to build a monolith or microservices. What message broker to adopt. These decisions shape the system for years — but in most teams, the reasoning behind them lives only in the heads of the people who made them.

When those people leave, the knowledge walks out the door. New team members inherit a system full of choices they do not understand, and they either blindly accept the status quo or, worse, reverse good decisions because they do not understand the context. Architecture Decision Records solve this problem elegantly. After implementing them in every team I have led over the past 15 years, I can confidently say they are one of the highest-ROI practices in software engineering.

What Are Architecture Decision Records?

An Architecture Decision Record (ADR) is a short document that captures a significant architectural decision along with its context and consequences. The concept was popularized by Michael Nygard in 2011, and it has since become a standard practice in mature engineering organizations.

Each ADR typically contains:

The beauty of ADRs is their simplicity. They are not 50-page design documents that nobody reads. They are short, focused, and written in plain language. A good ADR takes 15-30 minutes to write and saves hundreds of hours of future debate and confusion.

Why ADRs Matter More Than You Think

ADRs address several critical problems in software engineering:

They Preserve Institutional Knowledge

When a senior engineer who designed the event-driven architecture leaves, the team does not lose the "why." The ADR explains the constraints that existed, the alternatives considered, and the reasons the current approach was chosen. This prevents new team members from re-litigating settled decisions or making changes that reintroduce problems the original design solved.

They Improve Decision Quality

The act of writing down your reasoning forces you to think more carefully. Vague intuitions become concrete arguments. Unconsidered trade-offs surface. I have seen many decisions change during the writing process because the author realized their initial reasoning did not hold up when articulated clearly.

They Reduce Decision Fatigue

Without ADRs, the same debates recur every few months. "Why are we using PostgreSQL instead of MongoDB?" "Why did we choose gRPC over REST?" With ADRs, you can point to the documented reasoning. If the context has changed, great — write a new ADR that supersedes the old one. If not, the decision stands.

They Enable Asynchronous Decision-Making

ADRs can be reviewed as pull requests, commented on asynchronously, and approved without requiring everyone to be in the same room. This is especially valuable for distributed teams.

They Build Team Alignment

When the entire team participates in reviewing ADRs, everyone understands the technical direction. There are no "shadow architectures" or decisions made in hallway conversations that half the team never heard about.

When to Write an ADR

Not every decision needs an ADR. Writing ADRs for trivial choices creates bureaucracy without value. Here is a simple heuristic:

Write an ADR when:

Skip the ADR when:

The ADR Template

After years of refinement, here is the template I recommend. It balances completeness with brevity:

# ADR-{number}: {Title}

## Status
{Proposed | Accepted | Deprecated | Superseded by ADR-xxx}

## Date
{YYYY-MM-DD}

## Context
What is the issue that we are seeing that is motivating this decision
or change? What forces are at play (technical, business, organizational)?

## Decision
What is the change that we are proposing and/or doing?
State the decision clearly and concisely.

## Alternatives Considered
What other options were evaluated? Why were they rejected?

### Alternative 1: {Name}
- Pros: ...
- Cons: ...
- Why rejected: ...

### Alternative 2: {Name}
- Pros: ...
- Cons: ...
- Why rejected: ...

## Consequences

### Positive
- What becomes easier or possible?

### Negative
- What becomes harder?
- What are the risks?

### Neutral
- What other changes are required?

## References
- Links to relevant documents, discussions, or research

This template is intentionally simple. You can extend it with additional sections like "Compliance Considerations" or "Security Impact" if your organization requires them, but start simple and add complexity only when needed.

Real-World ADR Examples

Example 1: Database Selection

# ADR-007: Use PostgreSQL as Primary Data Store

## Status
Accepted

## Date
2024-11-15

## Context
Our application needs a primary data store for user data, transactions,
and product catalog. We expect 100K users in year one, growing to 1M
by year three. We need ACID transactions for payment processing.
Our team has strong SQL experience but limited NoSQL experience.

## Decision
We will use PostgreSQL 16 as our primary data store, hosted on
AWS RDS with read replicas.

## Alternatives Considered

### MongoDB
- Pros: Flexible schema, good for rapid prototyping
- Cons: Weaker transaction support, team lacks experience
- Why rejected: ACID requirements for payments, team skill gap

### CockroachDB
- Pros: Distributed SQL, horizontal scaling
- Cons: Higher operational complexity, smaller community
- Why rejected: Over-engineered for our current scale

## Consequences
### Positive
- Team can leverage existing SQL expertise
- Strong ACID guarantees for payment processing
- Excellent tooling and community support
### Negative
- May need sharding strategy if we exceed vertical scaling limits
- Schema migrations require more discipline than NoSQL
### Neutral
- Need to set up connection pooling (PgBouncer)
- Will use Flyway for migration management

Example 2: Communication Pattern

# ADR-012: Adopt Event-Driven Architecture for Order Processing

## Status
Accepted

## Date
2024-12-03

## Context
Order processing currently uses synchronous REST calls between services.
As we add more downstream consumers (notifications, analytics, inventory),
each new consumer requires changes to the order service. Latency is
increasing as the chain of synchronous calls grows.

## Decision
We will adopt an event-driven architecture using Amazon EventBridge
for order lifecycle events. The order service will publish events;
downstream services will subscribe independently.

## Alternatives Considered

### Keep synchronous REST with circuit breakers
- Pros: Simpler mental model, existing infrastructure
- Cons: Does not solve the coupling problem
- Why rejected: Coupling will continue to increase with each consumer

### Apache Kafka
- Pros: High throughput, replay capability
- Cons: Significant operational overhead for our team size
- Why rejected: Over-engineered for current message volume

## Consequences
### Positive
- New consumers can subscribe without modifying the order service
- Improved resilience (failures are isolated)
- Natural audit trail through event history
### Negative
- Eventual consistency requires careful handling in the UI
- Debugging distributed events is harder than tracing REST calls
- Team needs training on event-driven patterns
### Neutral
- Need to define event schema standards
- Will adopt CloudEvents specification for event format

Where to Store ADRs

The most effective approach I have seen is storing ADRs in the code repository alongside the code they affect. This has several advantages:

Create a docs/adr/ directory in your repository. Name files with a sequential number: 0001-use-postgresql.md, 0002-adopt-event-driven-architecture.md, etc. Include an index.md file that lists all ADRs with their status for quick reference.

For organizations with multiple repositories, consider a central ADR repository for decisions that span systems, and local ADRs for decisions specific to a single service.

How to Introduce ADRs to Your Team

Introducing any new practice requires a careful approach. Here is the playbook I have used successfully across multiple teams:

Step 1: Lead by Example

Write the first 3-5 ADRs yourself. Choose decisions that the team regularly debates or that new members always ask about. Show, do not tell.

Step 2: Show the Value

The next time a team member asks "why did we choose X?", point them to the ADR. The next time a debate resurfaces, reference the documented reasoning. Let the value demonstrate itself.

Step 3: Make It Easy

Create a template in the repository. Add a script or alias that generates a new ADR file with the template pre-filled. Remove friction wherever possible. If writing an ADR takes more than 30 minutes, the process is too heavy.

Step 4: Integrate with Existing Workflows

Make ADRs part of the PR process for significant changes. If someone proposes a new dependency, framework, or architectural change, an ADR should accompany the code. But be careful not to make this a blocker for small changes — only significant architectural decisions need ADRs.

Step 5: Celebrate and Iterate

Acknowledge team members who write good ADRs. Share particularly well-written ones in team meetings. Ask for feedback on the template and process, and refine based on what the team finds useful.

In the First Lead course, we go deeper into change management strategies for introducing engineering practices like ADRs, including how to handle resistance from team members who see documentation as "waste."

ADR Governance and Lifecycle

ADRs are living documents with a clear lifecycle:

Proposed: The ADR is drafted and open for discussion. This is the state during the PR review process. Team members can comment, suggest alternatives, or raise concerns.

Accepted: The team has agreed on the decision. The ADR is merged and becomes the authoritative reference for this decision.

Deprecated: The decision is no longer relevant — perhaps the system it applied to has been decommissioned. The ADR remains for historical context but is marked as deprecated.

Superseded: A new ADR has replaced this one. Link to the new ADR so readers can follow the evolution. Never delete old ADRs — they provide valuable historical context about how the system evolved.

Who Approves ADRs?

This depends on the scope of the decision:

Keep the approval process proportional to the decision's impact. Over-governance kills adoption.

Common Mistakes and How to Avoid Them

Advanced ADR Practices

Once your team has established a solid ADR practice, consider these advanced techniques:

ADR Radar

Maintain a quarterly review of all active ADRs. Are the contexts still valid? Have consequences materialized that were not anticipated? This proactive review catches decisions that need updating before they cause problems.

Decision Logs

Create a lightweight decision log for smaller decisions that do not warrant full ADRs — a simple table with the decision, date, and brief rationale. This fills the gap between "no documentation" and "full ADR."

Cross-Reference with Code

Reference ADR numbers in code comments where relevant architectural decisions are implemented. For example: // See ADR-012: Event-driven architecture for order processing. This creates a bidirectional link between decisions and implementation.

ADR Metrics

Track how often ADRs are referenced (through git blame, searches, or link tracking). This helps you understand which ADRs are providing value and which topics generate the most questions.

Onboarding with ADRs

Include a curated set of ADRs in your onboarding materials. New team members who read the key architectural decisions ramp up significantly faster because they understand not just what was built, but why.

"The best documentation is the documentation that gets used. ADRs succeed because they are short, focused, and answer the one question engineers ask most often: 'Why did we build it this way?'"

Build Better Engineering Practices

The First Lead course includes ready-to-use ADR templates, governance frameworks, and change management playbooks for introducing engineering best practices to your team.

Get Started with First Lead