Wardley maps
A Wardley map places the parts of a value chain by two things: how visible each part is to the user, and how evolved it is, from a new idea to a commodity anyone can buy. Links show which part needs which, and arrows show the moves you plan. Use it to decide what to build, what to buy, and what to outsource, to see where a part is about to become a commodity, and to explain a strategy to a team. It is for anyone who sets technical or business strategy, and for an agent that has been asked to map one.
TL;DR
| Question | Answer |
|---|---|
| What is it for? | A value chain whose parts you want to place by visibility and evolution: a product, a platform, a business. |
| How do I start one? | Write wardley "Title", an anchor for the user or need, one component line for each part, and a link such as cup -> tea for each dependency. |
| How is a part placed? | visibility= runs up, 1 at the top for what the user sees. evolution= runs across, 0 at genesis and 1 at commodity. Both run from 0 to 1. Write 0.8, not 80. |
| What else can it show? | How each part is sourced (source=build, buy, outsource, or market), inertia, planned moves with evolve, pipelines, and notes. |
| What does Mermaid convert? | wardley-beta, which is close to the OnlineWardleyMaps text, so a map from OnlineWardleyMaps converts too. See From Mermaid. |
| How big can it be? | At most 150 parts, 300 links, and 40 notes. Warnings start at 40 components and 60 links. |
Ask your agent
Use Plotwork to draw a Wardley map of our checkout. The customer is the anchor. Place the checkout page, payments, fraud checks, the order service, and the cloud it runs on by how visible and how evolved each is, and mark what we build and what we buy.Use Plotwork to draw a Wardley map of our platform team. Show the deploy pipeline as built in house with inertia, and plan its move to a bought product. Add a note about why.Example
The tea shop Simon Wardley uses to teach the method: the business and the public need a cup of tea, which needs tea, a cup, hot water, and staff. The kettle has inertia, and the plan is to move it to an electric kettle bought as a product.
wardley "Tea shop" desc="The value chain of a tea shop from the customer's cup down to power, placed by how evolved each part is. The kettle is planned to move from custom built to a bought product."anchor business "Business" visibility=0.95 evolution=0.63anchor public "Public" visibility=0.95 evolution=0.78component cup "Cup of tea" visibility=0.79 evolution=0.61component tea "Tea" visibility=0.63 evolution=0.81 source=buycomponent cupware "Cup" visibility=0.73 evolution=0.78 source=buycomponent water "Hot water" visibility=0.52 evolution=0.8component kettle "Kettle" visibility=0.43 evolution=0.35 inertia=oncomponent staff "Staff" visibility=0.65 evolution=0.4component power "Power" visibility=0.1 evolution=0.7 source=outsourcebusiness -> cuppublic -> cupcup -> teacup -> cupwarecup -> waterwater -> kettlekettle -> powercup -> staffevolve kettle 0.62 "Electric kettle"note "Standard power lets kettles evolve faster" visibility=0.3 evolution=0.72Evolution stages: Genesis, Custom built, Product (+rental), Commodity (+utility).
Value chain:
- Business needs Cup of tea.
- Cup of tea (Product (+rental)) needs Tea, Cup, Hot water, and Staff.
- Tea (Commodity (+utility), bought).
- Cup (Commodity (+utility), bought).
- Hot water (Commodity (+utility)) needs Kettle.
- Kettle (Custom built, inertia) needs Power.
- Power (Commodity (+utility), outsourced).
- Staff (Product (+rental)).
- Public needs Cup of tea.
Planned moves:
- Kettle moves from Custom built to Product (+rental), as Electric kettle.
Notes:
- Standard power lets kettles evolve faster (Commodity (+utility)).
Build or buy for a platform team
A platform team's map, with every source mark. The deploy pipeline is built in house and resists change, so the plan moves it to a bought product. Kubernetes has a pipeline: it runs in several forms at once, from a hand-run cluster to a managed one.
wardley "Platform team: build or buy" desc="What the platform team runs for product teams, and which parts it builds, buys, outsources, or takes from a market. The deploy pipeline moves to a bought product."anchor teams "Product teams" visibility=0.96 evolution=0.55component deploy "Deploy pipeline" visibility=0.82 evolution=0.38 source=build inertia=oncomponent portal "Developer portal" visibility=0.88 evolution=0.22 source=buildcomponent secrets "Secrets manager" visibility=0.62 evolution=0.68 source=buycomponent observability "Observability" visibility=0.66 evolution=0.52 source=outsourcecomponent kubernetes "Kubernetes" visibility=0.45 evolution=0.62 source=buycomponent compute "Compute" visibility=0.18 evolution=0.9 source=marketcomponent identity "Identity" visibility=0.3 evolution=0.8 source=outsourceteams -> portalteams -> deployportal -> deploy : "triggers"deploy -> kubernetesdeploy -> secretsdeploy --> observabilitykubernetes -> computekubernetes -> identityobservability ..> teams : "alerts"evolve deploy 0.66 "Bought CI/CD"pipeline kubernetes from=0.48 to=0.82note "Every team runs the same cluster" visibility=0.25 evolution=0.2Evolution stages: Genesis, Custom built, Product (+rental), Commodity (+utility).
Value chain:
- Product teams needs Developer portal and Deploy pipeline.
- Developer portal (Custom built, built in house) needs Deploy pipeline (triggers).
- Deploy pipeline (Custom built, built in house, inertia) needs Kubernetes, Secrets manager, and Observability (dashed).
- Kubernetes (Product (+rental), bought) needs Compute and Identity.
- Compute (Commodity (+utility), from a market).
- Identity (Commodity (+utility), outsourced).
- Secrets manager (Product (+rental), bought).
- Observability (Product (+rental), outsourced).
Flows of value:
- Observability to Product teams: alerts.
Planned moves:
- Deploy pipeline moves from Custom built to Product (+rental), as Bought CI/CD.
Pipelines:
- Kubernetes spans Product (+rental) to Commodity (+utility).
Notes:
- Every team runs the same cluster (Custom built).
An observability stack
How on-call engineers see their systems, with short stage names, icons on the parts they look at, and two planned moves. The SLO reports are in violet, because the team builds them and wants them noticed.
wardley "Observability stack" stages="Genesis, Custom, Product, Commodity" desc="How an engineering group sees its systems, from on-call engineers down to storage."anchor oncall "On-call engineer" visibility=0.95 evolution=0.5component dashboards "Dashboards" visibility=0.84 evolution=0.62 source=buy icon=lucide:layout-dashboardcomponent alerts "Alert routing" visibility=0.78 evolution=0.74 source=buy icon=lucide:bellcomponent slo "SLO reports" visibility=0.7 evolution=0.28 source=build tone=violetcomponent traces "Tracing" visibility=0.56 evolution=0.46component logs "Log search" visibility=0.5 evolution=0.7component metrics "Metrics store" visibility=0.42 evolution=0.62 inertia=oncomponent collector "Collector" visibility=0.3 evolution=0.56 source=marketcomponent storage "Object storage" visibility=0.08 evolution=0.94 source=outsourceoncall -> dashboardsoncall -> alertsoncall -> slodashboards -> metricsdashboards -> logsdashboards -> tracesslo -> metricsalerts -> metricstraces -> collectorlogs -> collectormetrics -> collectorcollector -> storagelogs -> storageevolve traces 0.62 "Tracing product"evolve metrics 0.8pipeline traces from=0.36 to=0.66Evolution stages: Genesis, Custom, Product, Commodity.
Value chain:
- On-call engineer needs Dashboards, Alert routing, and SLO reports.
- Dashboards (Product, bought) needs Metrics store, Log search, and Tracing.
- Metrics store (Product, inertia) needs Collector.
- Collector (Product, from a market) needs Object storage.
- Object storage (Commodity, outsourced).
- Log search (Commodity) needs Collector and Object storage.
- Tracing (Product) needs Collector.
- Alert routing (Commodity, bought) needs Metrics store.
- SLO reports (Custom, built in house) needs Metrics store.
Planned moves:
- Tracing moves further within Product, as Tracing product.
- Metrics store moves from Product to Commodity.
Pipelines:
- Tracing spans Custom to Product.
The language
The header
wardley "Title" stages="Genesis, Custom built, Product, Commodity" desc="<text>"The title and both options are optional. stages= renames the four stages of evolution, from genesis to commodity, in one quoted value with commas between the names. With no stages= the map uses Simon Wardley's own names: Genesis, Custom built, Product (+rental), and Commodity (+utility). desc= is the plain-language description that screen readers announce.
Statements
| Statement | Meaning | Example |
|---|---|---|
anchor <id> "<Label>" visibility= evolution= | The user or need the chain serves, drawn as a bold name. | anchor business "Business" visibility=0.95 evolution=0.63 |
component <id> "<Label>" visibility= evolution= source= inertia=on tone= icon= | A part of the chain. | component kettle "Kettle" visibility=0.43 evolution=0.35 inertia=on |
<id> -> <id> : "<label>" | A dependency. --> dashed, ..> a flow of value, <-> a flow both ways. | cup -> kettle : "boils" |
evolve <id> <evolution> "<New label>" | A planned move. | evolve kettle 0.62 "Electric kettle" |
pipeline <id> from= to= | A band under a component across a range of evolution. | pipeline kettle from=0.35 to=0.62 |
note "<text>" visibility= evolution= | A remark on the map. | note "Power is a utility" visibility=0.3 evolution=0.72 |
desc "<text>" | The description, the same as desc= on the header. | desc "How tea is made." |
Anchors and components
Every part has an id, which links use, and a label in quotes, which the picture shows. Leave the label out and the id is the label. Both values run from 0 to 1:
| Value | Runs | 0 is | 1 is |
|---|---|---|---|
visibility= | up the map | the bottom: parts the user never sees, such as power | the top: what the user sees and asks for |
evolution= | across the map | the left: genesis, something new | the right: commodity, a utility anyone can buy |
A value outside 0 to 1 is an error, and the hint says what it most likely meant: visibility=80 is read as a percentage, so the hint says to write visibility=0.8. Anchors usually sit near the top, at a visibility of 0.9 or more.
A component can say how it is sourced, which the map draws with the standard marks, and whether it resists change:
| Option | Means | Drawn as |
|---|---|---|
source=build | Built in house. | A dark disc behind the ring. |
source=buy | Bought as a product. | A light disc with an outline. |
source=outsource | Run by someone else. | A middle disc. |
source=market | Taken from a market of many suppliers. | Three small dots round the ring. |
inertia=on | Resists moving towards commodity, from habit, contracts, or past investment. | A thick bar on the right of the ring. |
icon= | A glyph for the part. | A larger ring that holds the glyph. |
tone= | A part to point at. | The ring in that tone's colour. |
A legend under the map explains the marks the map uses, and only those.
Evolution stages
The plate is divided into four stages by dashed lines at 0.17, 0.4, and 0.7 along the evolution axis, the boundaries OnlineWardleyMaps and Mermaid draw. A part on a boundary belongs to the later stage, so a part at 0.4 is a product. The outline says which stage each part is in.
Dependencies and flows
A link goes from the part that needs to the part it needs, which usually sits lower on the map.
| Link | Means | Drawn as |
|---|---|---|
a -> b | a needs b. | A plain line. |
a --> b | A weaker or planned dependency. | A dashed line. |
a ..> b | Value flows from a to b. | A blue line with an arrowhead. |
a <-> b | Value flows both ways. | A blue line with two arrowheads. |
Add a label after a colon: cup -> kettle : "boils". It is drawn in a pill on the line, clear of the parts.
Planned moves, pipelines and notes
evolve kettle 0.62 "Electric kettle" plans a move: a red dashed arrow from the kettle to a ghost of it at evolution 0.62, labelled with the new name. Leave the name out to keep the part's own. A part moves once.
pipeline kettle from=0.35 to=0.62 draws a band under the kettle across that range, for a part that exists in several forms at once, such as hand-built and bought kettles.
note "Standard power lets kettles evolve faster" visibility=0.3 evolution=0.72 writes a remark with its top left at that place, moved inside the plate when it would cross an edge.
Limits and warnings
| What | Warning (W200) | Refused (E140) |
|---|---|---|
| Components | more than 40 | more than 150 parts, anchors included |
| Links | more than 60 | more than 300 |
| Notes | none | more than 40 |
Lint also warns when:
| Warning | Code | Fix |
|---|---|---|
| A component no anchor reaches through the links. | W201 | Link it from the part that needs it, or take it off the map. |
| A dependency points up the chain: a part needs one more visible than itself. | W200 | Swap the two ids, or move the needed part down. |
| Two parts sit on top of each other. | W200 | Move them apart by at least 0.04, or merge them. |
| A label has no free place beside its part, so it is left out of the picture. | W200 | Move the parts apart, shorten the label, or split the map. The label stays in the text description. |
| A label, a stage name, or a note was cut with an ellipsis. | W203 | Shorten it. |
From Mermaid
convert_mermaid reads Mermaid's wardley-beta maps, and wardley for when the type leaves beta. Mermaid's text is close to the OnlineWardleyMaps format, so a map written in OnlineWardleyMaps converts when you put a wardley-beta line above it. Both write a place as [visibility, evolution]; Plotwork names each value, so they cannot be swapped.
| Mermaid | Plotwork | Code |
|---|---|---|
wardley-beta, wardley, and title | wardley "<title>" | |
component Web App [0.8, 0.6] | component web_app "Web App" visibility=0.8 evolution=0.6 | |
anchor X [v, e] | anchor | |
(build), (buy), (outsource), (market), and market X [v, e] | source= | |
(inertia) | inertia=on | |
build X, buy X, outsource X lines | source= on that part | |
A -> B, A --> B, and A -> B; text | A -> B, with : "text" | |
A -.-> B | A --> B | |
A +> B, A +< B, A +<> B, A +'text'> B | ..>, reversed for +<, <-> for +<>, labelled for +'text'> | |
evolve X 0.85 | evolve x 0.85 | |
pipeline P { component M [e] } | the members at the parent's visibility, and pipeline p from= to= over their range | |
note "t" [v, e] | note "t" visibility= evolution= | |
evolution A -> B -> C -> D | stages="A, B, C, D" | |
annotation N,[v, e] "t" | note "N. t" at its first place | M204 |
accelerator, deaccelerator | a note that says which way it pushes | M204 |
ecosystem, submap | component | M204 |
| A value outside 0 to 1 | The nearest end. | M204 |
label [dx, dy], size, annotations [x, y], and @ stage widths | Dropped: Plotwork places labels and sizes the map itself. | M202 |
style | Dropped: the theme owns every colour. | M200 |
url(<link>) | Dropped: a diagram is a static picture. | M201 |
A trend (X -.- (x, y)), or an evolution line that does not name four stages | Dropped. | M203 |
| A link, move, or pipeline to a part that is not on the map | Dropped. | M203 |
| A second part of one name, or a second move | Dropped. | M209 |
| A pipeline that is never closed | Closed at the end. | M217 |
| A map with no parts, or one past the limits | Nothing is converted. | M103, M102 |
| A line that cannot be read | Nothing is converted, or the line is skipped when the conversion is lenient. | M110, or M218 |
After converting, check the value chain in the outline from each anchor down, mark what you build, buy, or outsource with source=, and add a title.
See also
| Doc | Why |
|---|---|
| Writing diagrams | The flow, sequence and schema languages, and the rules every kind shares |
| Quadrant charts | Items on two axes with no links, for priorities |
| Migrating from Mermaid | Convert existing Mermaid diagrams, and what is dropped |
| Language reference | Every kind, node type, option and diagnostic |
| Diagram kinds | The kinds Plotwork draws and the header of each |