The most common question from developers who start paying for Claude Max or Claude Pro is always the same: do I actually need Opus, or is Sonnet good enough?
It's not a simple answer. Both models are built on the same architecture. Both write real code. But they make different tradeoffs — and the difference only becomes obvious when you've used both for the same type of work.
This is that comparison, based on daily use of both models inside Claude Code across real projects.
The Quick Answer
Use Sonnet 4.6 for 80–90% of your coding work. It's faster, it costs less, and it handles the vast majority of tasks without any quality difference you'd notice.
Use Opus 4.6 when you're doing something that requires sustained multi-step reasoning: untangling a complex bug across many files, designing a system from scratch, or reviewing an architecture where the wrong call has large downstream consequences.
If you only have one takeaway: start every session in Sonnet and switch to Opus when Sonnet gets it wrong twice in a row on the same problem.
Speed and Cost — The Practical Reality
Sonnet 4.6 generates tokens roughly 2–3x faster than Opus 4.6. On a complex refactor that produces 800 lines of output, that's the difference between a 25-second response and a 60-second one. For iterative work — writing a function, getting feedback, tweaking it — that multiplies across dozens of interactions.
On cost, Opus is significantly more expensive per token. If you're on Claude Max (the subscription plan), you're not paying per token — but you still hit usage limits faster with Opus because each request consumes more capacity. In practice, heavy Opus use on Max means hitting limits before the end of your billing period.
The implication: Opus is a finite resource even on Max. Use it deliberately, not by default.
Where Sonnet 4.6 Is Genuinely Better
Boilerplate and scaffolding
Generating a REST endpoint, writing CRUD handlers, creating a new React component, scaffolding a test file — Sonnet handles all of this at the same quality as Opus. The code is correct, idiomatic, and matches your codebase style. No reason to spend Opus credits here.
// Sonnet generates this just as well as Opus
export async function createUser(data: CreateUserDto): Promise<User> {
const existing = await db.user.findUnique({ where: { email: data.email } })
if (existing) throw new ConflictException('Email already in use')
const hashed = await bcrypt.hash(data.password, 12)
return db.user.create({
data: { ...data, password: hashed },
select: { id: true, email: true, name: true, createdAt: true }
})
}Refactoring with clear requirements
"Rename this field everywhere", "extract this logic into a hook", "convert this class component to a functional one", "add error handling to these three functions" — these are well-defined transformations. Sonnet executes them correctly and fast. Using Opus here wastes capacity on a task that doesn't need it.
Writing tests
Unit tests, integration tests, mocking dependencies — Sonnet understands what needs to be tested and writes assertions that cover the real behavior. The main place Opus does better in tests is when the code under test has non-obvious edge cases that require understanding the broader system to detect. For standard coverage, Sonnet is the same.
Debugging well-isolated bugs
If you can point at a function and say "this returns the wrong value when X", Sonnet will find and fix it. The bug needs to be locatable. When it is, Sonnet's response is correct and comes back fast.
Documentation and code review
Explaining what code does, writing JSDoc comments, summarizing a PR, generating a README — these don't require deep reasoning, they require reading and writing skill. Sonnet is excellent at this.
Where Opus 4.6 Earns Its Cost
Multi-file bugs with indirect causation
The hardest bugs are the ones where the symptom is three layers away from the cause. A user sees a blank screen. The issue is a race condition between an auth token refresh and a cached API response, which causes a stale closure to capture an undefined value that gets used in a render function. Sonnet will find the symptom. Opus will work backwards from the symptom to the root cause, trace the full call chain, and fix the right thing.
This is where the reasoning difference is most visible in real work.
Architecture and system design decisions
"Should we use Redis pub/sub or a message queue for this feature?" "How should we structure the tenant isolation in this multi-tenant app?" "What's the right database schema for this access pattern?"
These questions have tradeoffs that compound. A wrong answer now means a painful migration in 6 months. Opus holds more context simultaneously and reasons through second-order consequences. It will catch the "yes but if you do that, then X breaks because Y" that Sonnet often misses on genuinely complex design questions.
Long context understanding
With a large codebase loaded into context — multiple files, complex interdependencies — Opus maintains coherence across the whole context better. Sonnet can lose track of things established early in a long context window. If you're doing a refactor that touches 20 files and requires consistency across all of them, Opus will make fewer mistakes on the distant parts.
Debugging unfamiliar code or libraries
When you're debugging code you didn't write, in a library you don't know deeply, Opus's broader training and reasoning depth helps. It's more likely to recognize an obscure library pattern, know that a particular API has a known gotcha, or correctly identify that the issue is in the library's internal state rather than your code.
Security review
Identifying SQL injection vectors, SSRF possibilities, insecure deserialization, JWT validation errors — security reasoning requires thinking adversarially and tracking subtle data flows. Opus is noticeably better at this than Sonnet. If you're doing a security pass before a release, use Opus.
The Model Selection Workflow in Claude Code
Claude Code lets you switch models mid-conversation. The practical workflow:
# Start in Sonnet (default, fastest)
claude
# You realize the bug is more complex than expected
# Switch within the conversation:
# /model claude-opus-4-6
# Or set Opus as default for a session where you know it's needed:
claude --model claude-opus-4-6The pattern that works in practice:
- Start in Sonnet for every new task
- If Sonnet gets it wrong or produces something superficial, switch to Opus for that specific problem
- Once Opus has resolved the hard part, switch back to Sonnet for the implementation work
You're using Opus as a specialist you bring in for hard problems, not as a general assistant you leave running all day.
Task-by-Task Decision Guide
| Task | Use |
|---|---|
| Writing new endpoints / components | Sonnet |
| Refactoring with clear spec | Sonnet |
| Writing tests | Sonnet |
| Documentation and comments | Sonnet |
| Well-isolated bug fix | Sonnet |
| Multi-file bug with unclear root cause | Opus |
| System architecture decisions | Opus |
| Security review | Opus |
| Debugging unfamiliar library | Opus |
| Large codebase refactor (20+ files) | Opus |
| Performance bottleneck investigation | Opus |
The Context of Claude Max vs Pro
On Claude Pro, Opus usage has a hard limit — you'll get a message when you've used your Opus quota. This makes the "use Sonnet by default" strategy more than just a cost choice: it's necessary to preserve Opus capacity for when it matters.
On Claude Max, limits are higher but Opus still consumes more capacity per request. The advice is the same. Read the full breakdown of what each plan includes in the Claude Max vs Pro comparison.
For teams, see using Claude Code across a team — model selection at the team level matters for both quality and cost predictability.
The Real Difference Is Problem Type, Not Problem Size
A common mistake is thinking "big task = Opus, small task = Sonnet". That's wrong.
The correct frame is problem type:
- Well-defined transformation → Sonnet (even if it touches 50 files)
- Open-ended reasoning with non-obvious solution → Opus (even if it's one function)
A large refactor where you've already figured out the approach is a Sonnet task. A single function that keeps returning the wrong result and you can't figure out why is an Opus task.
Sonnet 4.6 is the right default. It's not a compromise — it's a capable model that handles most coding work correctly and returns answers fast enough to keep the iteration loop tight. Opus 4.6 is a specialist tool: bring it in for the problems that genuinely require it, and you'll notice the difference immediately. Use it for everything and you'll burn through limits before you hit the work that actually needs it.
The read on Opus 4.6's extended reasoning capabilities and 1M context window is in the full Opus 4.6 review.