← Blog
How-to·18 May 2026·6 min read

Milestones that recolour themselves — conditional, data-driven symbology

Every month the same chore: open the schedule, look at each status milestone, and hand-recolour the diamonds that slipped. Green to amber. Amber to red. One by one. It's error-prone, it's tedious, and it's exactly the kind of thing a chart should do for you. In Sketchedule it does — a milestone's shape, colour and fill are driven by a column value or a date, computed live in your browser as you type.

You know the ritual. The board pack is due, the P6 update has landed, and now you're going symbol by symbol down the milestone view deciding which diamonds are still on track and which have quietly gone late. You change a fill. You change another. You miss one, because there are forty of them and you're doing it by eye at 6pm. Next month you do it all again, from scratch, because the colours you set last time are frozen paint — they don't know the dates moved.

That's the wrong division of labour. A status symbol's colour is not a design choice you make forty times a month; it's a fact about the data. If the forecast has slipped past the target, the diamond is red — full stop. So let the rule say that once, and let the chart apply it everywhere, forever. That's conditional symbology.

One rule, applied live: the symbol follows the data On track Status = "On track" column "Status" = Late Late shape + colour flip, instantly
Fig 1. The transform. A milestone starts as a green circle while its Status reads "On track"; the moment that column reads "Late", the same milestone flips to a red diamond. You edited the data, not the symbol — the rule did the rest.

The symbol is bound to the data, not painted on top

In a conventional Gantt, a milestone's appearance is a static property: you pick a shape, pick a colour, and it stays that way until you change it by hand. Sketchedule lets you go one level up and bind those properties instead. A milestone's shape, its outline colour, and its fill can each be driven by:

You express the mapping once as a set of rules: if the condition holds, use this shape / this colour / this fill. Threshold rules compare a number or a date against a boundary; value rules match text. The rules live with the view, and — this is the part that matters on a laptop in a site cabin — they're evaluated locally, as you type. Change a target date and the diamonds recolour on the same keystroke. Nothing is uploaded, nothing round-trips to a server, and there isn't a macro in sight.

A rule set drives a whole row of milestones Rules (top match wins) finish ≤ target → green circle ≤ 10 days late → amber diamond > 10 days late → red diamond Status = "Hold" → grey square Milestones (rendered live) M1 M2 M3 M4 Each milestone reads the same rules and renders itself — no per-symbol editing.
Fig 2. How it hangs together. You author a small ordered rule set once; every milestone in the view is evaluated against it and renders its own shape, colour and fill. Edit a rule and the whole row updates at once.

A worked example: the slip detector

Take a milestone view with two date columns — Target (the contractual date you're committed to) and Forecast (where the P6 update currently puts it) — plus a text Status column for the odd manual override like "Hold". You want every diamond to answer one question at a glance: are we going to make this date? Here's how you set it once and never hand-paint again.

  1. Add or map the driving column. Import the P6 file and make sure Target, Forecast and Status are present — either mapped from the imported fields or added as a calculated column (e.g. days-late = Forecast − Target). This is the value the symbols will read.
  2. Open the symbology rules for the milestone type. Pick the milestone symbol, choose "drive by column / date", and start a rule set. Rules are ordered — the first one that matches wins — so you go from best case at the top to worst case at the bottom.
  3. Map each condition to a shape, colour and fill. Forecast ≤ Target → green circle. Up to 10 days late → amber diamond. More than 10 days late → red diamond. Status = "Hold" → grey square. Threshold rules handle the dates; the value rule handles the manual override.
  4. Watch it apply across the whole chart. The moment you save the rule, every milestone in the view recolours itself against its own data — computed locally, instantly. No macro run, no recalculation wait, no page reload.
  5. Edit the data, not the symbols — forever after. Next month, refresh from the updated P6. As the forecast dates move, the diamonds flip green→amber→red on their own. You never touch a fill again.
Condition (top match wins)ShapeColour / fill
Forecast ≤ TargetCircleGreen, solid
Forecast 1–10 days lateDiamondAmber, solid
Forecast > 10 days lateDiamondRed, solid
Status = "Hold"SquareGrey, hollow
Milestone complete (100%)DiamondFilled + tick
The slip detector, live in the milestone view Activity Start Finish % St Design phase Concept sign-off 03 Jan 03 Jan 100 Detailed design 06 Jan 28 Feb 72 Design freeze 02 Mar 05 Mar 40 Procurement Long-lead order 10 Mar 10 Mar 0 Fabrication 17 Mar 30 Apr 0 Vendor hold 21 Apr 21 Apr Construction Site mobilise 05 May 16 May 0 First pour 26 May 26 May 0 Practical completion 30 Jun 30 Jun 0 Jan Feb Mar Apr May Jun Data date · 05 Mar
Fig 3. The same rule set, driven live in Sketchedule. The grid on the left carries Start, Finish, a %-complete pie column and a Status stoplight; the Gantt on the right renders the task bars and milestone diamonds on a month axis. Each diamond is coloured by its own status — green on track, amber slipping, red late — and the dashed red data-date line marks where the update lands. Nothing was hand-painted: every colour is a consequence of the data.
The point: the colour is now a consequence of the dates, not a decision you make forty times a month. When a director asks "is this current?", the honest answer is yes — the symbols recolour themselves the instant the data changes, so they can't drift out of sync with the schedule they sit on.

"Can't the desktop tools already do this?" — not without pain

If you've lived in project-controls software, you'll know two half-answers to this, and why neither is the same thing.

The gap in the middle is exactly what Sketchedule fills: proper Gantt-native milestone symbology — shape, colour and fill — driven by data-bound rules, live and local, with no scripting to write and nothing uploaded. You get the desktop tool's timeline fluency and the work-OS tool's effortless conditional colour, without either one's tax.

Where the source of truth stays. This is presentation, not scheduling. P6 or MS Project stays the engine — it computes the network, the critical path, the forecast dates. Sketchedule reads those values and renders them as symbols that tell the status story at a glance. Change the plan in P6, refresh, and the symbology re-evaluates itself. The engine and the front-end each do the job they're good at.

Key takeaways

Let your milestones recolour themselves

Open Sketchedule in a browser — free, no install, nothing uploaded. Drop in a schedule, write one rule, and watch the diamonds follow the data.

← BlogAll articles

Primavera and P6 are trademarks of Oracle Corporation; Microsoft Project is a trademark of Microsoft Corporation. Sketchedule is an independent product and is not affiliated with, endorsed by or sponsored by Oracle or Microsoft. Figures are illustrative, drawn in Sketchedule.