Team Topologies: Organizing for Fast Flow
Team Topologies, introduced by Matthew Skelton and Manuel Pais, is a framework for designing organizational structures that optimize for fast flow of value. Rather than treating team organization as an HR concern, Team Topologies treats it as an engineering problem—one where Conway's Law is not a hazard to avoid, but a force to harness deliberately.
At its core, the framework defines four fundamental team types and three interaction modes. When combined thoughtfully, these elements create an organization that can evolve software rapidly, safely, and sustainably. This tutorial walks through the model, explains why it matters, and shows how to apply it with practical examples.
Why Team Topologies Matters
Most organizational charts are drawn top-down based on reporting lines, budget, and historical accident. The result is often a mismatch between how teams are organized and how software actually needs to be built. Dependencies pile up, handoffs multiply, and cycle time balloons. Team Topologies flips the question: instead of asking "who reports to whom," it asks "what kind of work does this team do, and how does it interact with others?"
The framework matters because it directly addresses the root causes of slow delivery:
- Unclear team responsibilities lead to duplicated work and gaps.
- Excessive handoffs between teams create queues and waiting.
- Misaligned cognitive load overwhelms teams with too many domains.
- Ad-hoc collaboration patterns produce unpredictable outcomes.
By making team types and interaction modes explicit, organizations can reason about their structure the same way they reason about their architecture.
The Four Team Types
Team Topologies defines four team types. Every team in the organization should map cleanly to exactly one of these at any given time. The types are not permanent—a team may change type as the organization evolves—but at any moment, clarity of type is essential.
1. Stream-Aligned Teams
A stream-aligned team is the primary value-delivery unit. It is organized around a continuous flow of work in a single business domain or capability—for example, "checkout experience," "user authentication," or "inventory forecasting." Stream-aligned teams own a product or service end-to-end and are expected to produce customer-facing value independently, minimizing dependencies on other teams.
Characteristics of a healthy stream-aligned team:
- It has a clear, measurable outcome tied to business value.
- It can release changes to production with minimal coordination.
- It owns its code, its tests, its deployment pipeline, and its on-call rotation.
- It has all the skills needed to deliver its stream of work (frontend, backend, QA, design, product).
Most of the organization should be stream-aligned teams. The other three types exist to support them.
2. Platform Teams
A platform team provides internal products that reduce cognitive load for stream-aligned teams. The platform is treated as a product with its own roadmap, its own user research (the stream-aligned teams are the users), and its own SLAs. The goal is to enable stream-aligned teams to self-serve capabilities without needing deep expertise in infrastructure, CI/CD, observability, or security.
A good platform reduces the number of things a stream-aligned team must think about. Instead of every team managing its own Kubernetes cluster, a platform team provides a golden path: a template, a CLI, and documentation that gets a new service into production in minutes.
3. Enabling Teams
An enabling team helps a stream-aligned team acquire new capabilities. Where a platform team provides a product, an enabling team provides knowledge and coaching. Enabling teams are temporary by nature—they exist to close a gap, then move on. Examples include a security enabling team that helps a product team adopt threat modeling, or a data engineering enabling team that helps a team build their first streaming pipeline.
The key discipline with enabling teams is avoiding the trap of becoming a permanent dependency. The enabling team's success metric should be the stream-aligned team's growing autonomy.
4. Complicated-Subsystem Teams
A complicated-subsystem team owns a system that requires deep, specialized expertise—something that would impose unreasonable cognitive load on a stream-aligned team. Examples include a video transcoding engine, a fraud detection model, or a pricing calculation service. These teams exist because the domain is genuinely complex enough that spreading that knowledge across multiple teams would be inefficient and risky.
Complicated-subsystem teams should be rare. If most of your teams are this type, you likely have an architecture problem, not an organization problem.
The Three Interaction Modes
Team types describe what a team is. Interaction modes describe how teams relate to each other. There are exactly three, and every inter-team relationship should be explicitly classified as one of them.
X-as-a-Service Interaction
In this mode, one team consumes another team's output as a self-service product. A stream-aligned team uses the platform team's CI/CD pipeline. Another stream-aligned team calls a complicated-subsystem team's API. The consumer team does not need to coordinate with the provider team to use the product; the contract is the API or the documentation.
This is the lowest-friction interaction mode and should be the goal for most relationships. It enables fast flow because there are no meetings, no tickets, no waiting.
Collaboration Interaction
Collaboration mode involves close, high-bandwidth working between two teams for a limited period. This is appropriate when something new is being built, when a platform is being shaped by early consumers, or when an enabling team is actively coaching. Collaboration is expensive—it consumes attention and creates coupling—so it should be time-boxed and transitioned to X-as-a-Service once the work stabilizes.
Facilitating Interaction
Facilitating mode is used by enabling teams to guide and coach a stream-aligned team. It is not about doing the work for them; it is about building their capability. This interaction is inherently temporary and should have a clear exit criterion.
Applying Team Topologies: A Practical Example
Let's walk through a concrete scenario. Imagine a fintech company that has grown to 40 engineers organized into eight teams. Delivery is slow, incidents are frequent, and every new feature requires coordination across four or five teams. Here is how Team Topologies can be applied.
Step 1: Map the Current State
Before redesigning, understand what exists today. Interview each team, map their dependencies, and identify what kind of work they actually do versus what their title says. The output is a current-state map showing team names, their stated purpose, their actual work, and their dependency graph.
You can represent this mapping as structured data to make it analyzable. Here is a simple JSON representation of a current-state assessment:
{
"teams": [
{
"name": "Frontend Squad",
"statedPurpose": "Build web UI",
"actualWork": "Builds UI for 3 different product areas",
"dependencies": ["Backend Squad A", "Backend Squad B", "Design Team"],
"issues": ["Context switching across domains", "Blocked waiting on backend APIs"]
},
{
"name": "Backend Squad A",
"statedPurpose": "Payments API",
"actualWork": "Payments API + infrastructure management + on-call for all services",
"dependencies": ["DevOps Team", "Database Team"],
"issues": ["High cognitive load", "Bottleneck for all product teams"]
},
{
"name": "DevOps Team",
"statedPurpose": "Manage infrastructure",
"actualWork": "Ticket-driven provisioning, manual deployments",
"dependencies": [],
"issues": ["No self-service", "Queue of 60+ tickets"]
}
]
}
Step 2: Identify Stream-Aligned Teams
Look at the value streams from the customer's perspective. In our fintech example, the streams might be: "consumer payments," "merchant onboarding," "fraud prevention," and "reporting and analytics." Each of these becomes a stream-aligned team. The Frontend Squad and Backend Squad A are dissolved and their members redistributed into these cross-functional teams.
Step 3: Build the Platform
The DevOps Team transforms into a platform team. Instead of taking tickets, it builds self-service tooling. Here is a simplified example of what a platform team might ship—a golden-path service template that a stream-aligned team can use to scaffold a new service:
#!/usr/bin/env bash
# golden-path-scaffold.sh — provided by the Platform Team
# Usage: ./golden-path-scaffold.sh my-new-service
set -euo pipefail
SERVICE_NAME="${1:?Service name required}"
TEMPLATE_REPO="git@internal.dev:platform/service-template.git"
echo "Scaffolding service: $SERVICE_NAME"
# Clone the approved template
git clone "$TEMPLATE_REPO" "$SERVICE_NAME"
cd "$SERVICE_NAME"
# Configure service identity
sed -i "s/SERVICE_NAME_PLACEHOLDER/$SERVICE_NAME/g" \
package.json \
Dockerfile \
.github/workflows/ci.yml \
helm/values.yaml \
observability/alerts.yml
# Initialize git history
rm -rf .git
git init
git add .
git commit -m "chore: scaffold $SERVICE_NAME from golden path template"
# Register with service catalog
curl -s -X POST https://catalog.internal.dev/api/services \
-H "Authorization: Bearer $PLATFORM_TOKEN" \
-d "{\"name\": \"$SERVICE_NAME\", \"owner\": \"$(git config user.email)\"}"
echo ""
echo "✓ Service scaffolded successfully"
echo "✓ CI/CD pipeline configured (builds, scans, deploys on merge to main)"
echo "✓ Helm chart with standard resource limits and health checks"
echo "✓ Observability dashboards pre-wired (metrics, logs, traces)"
echo "✓ Registered in service catalog"
echo ""
echo "Next steps:"
echo " cd $SERVICE_NAME"
echo " make run # start locally with hot reload"
echo " make deploy # deploy to staging"
With this in place, a stream-aligned team can create a production-ready service in minutes without filing a ticket or talking to anyone on the platform team. That is X-as-a-Service interaction in action.
Step 4: Deploy Enabling Teams Where Needed
Suppose the fraud prevention team needs to adopt machine learning for transaction scoring, but no one on the team has ML experience. Rather than hiring an ML engineer into the team permanently (which may not be justified long-term), an enabling team is formed. Here is how you might track the enabling engagement:
{
"enablingEngagement": {
"streamAlignedTeam": "Fraud Prevention",
"enablingTeam": "ML Foundations",
"objective": "Team can independently train, evaluate, and deploy a transaction scoring model",
"startDate": "2025-01-15",
"targetEndDate": "2025-04-15",
"exitCriteria": [
"Team has shipped at least one model to production without enabling team assistance",
"Team has written runbook for model retraining and monitoring",
"Team has conducted a peer review of another team's ML approach"
],
"interactionMode": "facilitating",
"weeklyCadence": "2 pairing sessions + 1 review session"
}
}
The exit criteria are the most important part. Without them, enabling engagements drift and become permanent dependencies.
Step 5: Identify Complicated-Subsystem Teams
In our example, the core payment routing engine involves deep expertise in card network protocols, settlement rules, and regulatory compliance. This is a genuine complicated subsystem. A dedicated team owns it and exposes a clean API to the consumer payments and merchant onboarding stream-aligned teams.
Visualizing Team Interactions
A Team Topologies map shows each team as a box labeled with its type and the interaction modes between teams as different line styles. While a full visual diagram is beyond the scope of a text tutorial, you can represent the topology as a graph structure for tooling and analysis:
{
"topology": {
"streamAlignedTeams": [
{ "name": "Consumer Payments", "domain": "end-user payment experience" },
{ "name": "Merchant Onboarding", "domain": "merchant signup and verification" },
{ "name": "Fraud Prevention", "domain": "transaction risk scoring" },
{ "name": "Reporting", "domain": "analytics and financial reports" }
],
"platformTeams": [
{ "name": "Platform", "product": "service golden path, CI/CD, observability" }
],
"enablingTeams": [
{ "name": "ML Foundations", "activeEngagements": ["Fraud Prevention"] }
],
"complicatedSubsystemTeams": [
{ "name": "Payment Routing Engine", "expertise": "card networks, settlement" }
],
"interactions": [
{ "from": "Consumer Payments", "to": "Platform", "mode": "x-as-a-service" },
{ "from": "Merchant Onboarding", "to": "Platform", "mode": "x-as-a-service" },
{ "from": "Fraud Prevention", "to": "Platform", "mode": "x-as-a-service" },
{ "from": "Reporting", "to": "Platform", "mode": "x-as-a-service" },
{ "from": "Consumer Payments", "to": "Payment Routing Engine", "mode": "x-as-a-service" },
{ "from": "Merchant Onboarding", "to": "Payment Routing Engine", "mode": "x-as-a-service" },
{ "from": "ML Foundations", "to": "Fraud Prevention", "mode": "facilitating" },
{ "from": "Platform", "to": "Consumer Payments", "mode": "collaboration", "note": "early platform adoption, time-boxed to Q1" }
]
}
}
This machine-readable representation can be fed into dashboards, wikis, or custom tooling to keep the topology visible and up to date.
Best Practices
Optimize for Cognitive Load, Not Headcount
The single most important principle in Team Topologies is managing cognitive load. A team that owns too many domains, too many services, or too many technologies cannot move fast. When designing teams, ask: "Can a new hire on this team understand what we own within two weeks?" If the answer is no, the team's scope is too broad.
Keep Team Size Stable
Research consistently shows that teams of 5 to 9 people perform best. Resist the urge to grow teams indefinitely. If a stream-aligned team's workload grows, split the stream into two streams rather than growing the team to 15 people.
Make Interaction Modes Explicit
Ambiguity about how teams should interact is a major source of friction. Document the interaction mode for every inter-team relationship. When a stream-aligned team needs something from the platform team, is that X-as-a-Service (just use the tooling) or collaboration (we need to build something new together)? Making this explicit prevents mismatched expectations.
Evolve the Topology Deliberately
Team Topologies is not a one-time reorg. It is a living model. As the business changes, streams shift, platforms mature, and enabling engagements complete. Schedule regular topology reviews—quarterly is a good cadence—to assess whether the current structure still serves fast flow. Here is a simple review checklist encoded as a script:
#!/usr/bin/env python3
"""Quarterly Team Topology review checklist."""
from dataclasses import dataclass
from typing import List
@dataclass
class TeamReview:
team_name: str
team_type: str
cognitive_load_score: int # 1-10, 10 = overwhelmed
dependency_count: int
can_deploy_independently: bool
has_clear_outcome: bool
notes: str
def assess_team(team: TeamReview) -> List[str]:
issues = []
if team.cognitive_load_score >= 8:
issues.append("Cognitive load too high — consider splitting scope or adding platform support")
if team.dependency_count > 3:
issues.append("Too many cross-team dependencies — investigate reducing coupling")
if team.team_type == "stream-aligned" and not team.can_deploy_independently:
issues.append("Stream-aligned team cannot deploy independently — this blocks fast flow")
if not team.has_clear_outcome:
issues.append("No clear business outcome defined — team purpose is ambiguous")
if team.team_type == "enabling" and "no exit criteria" in team.notes.lower():
issues.append("Enabling team has no exit criteria — risk of permanent dependency")
return issues
# Example quarterly review
reviews = [
TeamReview(
team_name="Consumer Payments",
team_type="stream-aligned",
cognitive_load_score=6,
dependency_count=2,
can_deploy_independently=True,
has_clear_outcome=True,
notes="Healthy. Considering splitting mobile and web into separate streams next quarter."
),
TeamReview(
team_name="Fraud Prevention",
team_type="stream-aligned",
cognitive_load_score=9,
dependency_count=4,
can_deploy_independently=False,
has_clear_outcome=True,
notes="Overloaded. ML enabling engagement ongoing. Needs platform support for feature stores."
),
TeamReview(
team_name="ML Foundations",
team_type="enabling",
cognitive_load_score=5,
dependency_count=1,
can_deploy_independently=True,
has_clear_outcome=True,
notes="Engagement with Fraud Prevention has no exit criteria yet."
),
]
for review in reviews:
issues = assess_team(review)
status = "✓ OK" if not issues else "⚠ NEEDS ATTENTION"
print(f"\n{review.team_name} ({review.team_type}): {status}")
for issue in issues:
print(f" - {issue}")
Running this kind of structured review each quarter keeps the topology honest and surfaces problems before they become structural debt.
Use Inverse Conway Maneuver
The inverse Conway maneuver means designing your team structure to produce the architecture you want, rather than letting your current architecture dictate your team structure. If you want a certain set of services and APIs, organize teams around those boundaries first. Conway's Law ensures the architecture will follow. This is why Team Topologies is as much an architecture practice as an organizational one.
Avoid Anti-Patterns
Watch for these common mistakes:
- Platform team as a help desk: If your platform team takes tickets instead of building self-service products, it is not a platform team—it is a shared services team, and it will be a bottleneck.
- Permanent enabling teams: If an enabling team has existed for two years with the same stream-aligned team, it has become a crutch. Either fold the capability into the stream-aligned team or recognize it as a complicated-subsystem team.
- Too many complicated-subsystem teams: If every team is "special," none are. Most complexity should be hidden behind platform abstractions, not walled off in specialized teams.
- Ignoring interaction modes: Teams left to figure out collaboration ad hoc will default to the most expensive mode (collaboration) and never transition to the cheapest (X-as-a-Service).
Measuring Success
How do you know if your Team Topologies implementation is working? The ultimate measure is flow. Track these metrics across stream-aligned teams:
- Deployment frequency: How often does the team release to production?
- Lead time for changes: How long from commit to production?
- Change failure rate: What percentage of deployments cause incidents?
- Mean time to recovery: How quickly does the team recover from incidents?
- Cross-team dependency wait time: How much time is spent waiting on other teams?
These are the DORA metrics plus a dependency-specific measure. If Team Topologies is working, you should see deployment frequency rise, lead time fall, and dependency wait time shrink. If those numbers are not improving, the topology needs adjustment.
Here is a simple metrics dashboard query you might run against your deployment and incident data:
-- Quarterly flow metrics per stream-aligned team
WITH deployments AS (
SELECT
team_name,
DATE_TRUNC('quarter', deployed_at) AS quarter,
COUNT(*) AS deployment_count,
AVG(EXTRACT(EPOCH FROM (deployed_at - committed_at)) / 3600) AS avg_lead_time_hours
FROM deployments
WHERE deployed_at >= NOW() - INTERVAL '4 quarters'
GROUP BY team_name, quarter
),
incidents AS (
SELECT
team_name,
DATE_TRUNC('quarter', created_at) AS quarter,
COUNT(*) AS incident_count,
AVG(EXTRACT(EPOCH FROM (resolved_at - created_at)) / 60) AS avg_mttr_minutes
FROM incidents
WHERE created_at >= NOW() - INTERVAL '4 quarters'
GROUP BY team_name, quarter
)
SELECT
d.team_name,
d.quarter,
d.deployment_count,
ROUND(d.avg_lead_time_hours, 1) AS lead_time_hours,
COALESCE(i.incident_count, 0) AS incidents,
ROUND(COALESCE(i.incident_count, 0)::numeric / NULLIF(d.deployment_count, 0) * 100, 1) AS change_failure_pct,
ROUND(COALESCE(i.avg_mttr_minutes, 0), 0) AS mttr_minutes
FROM deployments d
LEFT JOIN incidents i ON d.team_name = i.team_name AND d.quarter = i.quarter
ORDER BY d.team_name, d.quarter;
Reviewing these metrics quarterly, alongside the topology review, creates a feedback loop that keeps the organization tuned for fast flow.
Conclusion
Team Topologies is a pragmatic framework that treats organizational design as an engineering discipline. By classifying every team as stream-aligned, platform, enabling, or complicated-subsystem, and by making every inter-team interaction explicitly X-as-a-Service, collaboration, or facilitating, you create a structure that is legible, intentional, and optimizable. The framework is not a one-time reorg but a continuous practice of mapping, measuring, and evolving. When applied with discipline—managing cognitive load, keeping teams small, enforcing exit criteria for enabling engagements, and using the inverse Conway maneuver to steer architecture—Team Topologies produces organizations where fast flow is not an aspiration but a natural consequence of the structure. Start by mapping your current state, identify your first stream-aligned teams, invest in a real platform, and iterate from there. The goal is never a perfect org chart; it is a living topology that adapts as your products, technology, and business evolve.