Baseline vs Actual: Tracking Schedule Variance on a Gantt Chart
A Gantt chart shows where your project is. A baseline shows where it was supposed to be. Without one you can report progress but not slippage, and slippage is what anyone funding the work actually wants to know.
What a baseline actually is
A baseline is a frozen copy of your schedule taken when you agreed it was right, typically at approval. It stores each task's planned start, finish and progress, then stops changing.
That last part is the point. Edit the plan in place without a baseline and the schedule silently rewrites history, so every week looks on track. Dates drift a day at a time, and a plan that absorbed thirty single-day edits looks exactly like one that never moved. The baseline makes those edits add up.
When to set it, and when not to
Set the baseline after the plan is agreed and before work starts. One captured mid-execution bakes in slippage that already happened and understates variance from then on.
Do not baseline a plan you know is wrong just to have one, a fictional schedule gives confident, precise, meaningless numbers. Fix placeholder dates first.
A worked example: one project, three status cycles
A client portal relaunch, approved 27 February 2026 and baselined Monday 2 March before work starts. Five rows, finish-to-start, all critical:
Baseline, set 2 March 2026
- Discovery, 2 Mar to 13 Mar (10 working days)
- Design, 16 Mar to 3 Apr (15 days)
- Build, 6 Apr to 15 May (30 days)
- Test, 18 May to 29 May (10 days)
- Go-live, 1 Jun (milestone)
Status cycle 1, Friday 20 March
Two stakeholder interviews slipped, so Discovery finished 18 March instead of 13 March: finish variance +3 days. Design started 19 March, start variance +3 days, and with its estimate unchanged its forecast finish moves to 8 April, also +3. Every downstream task carries the same +3; go-live reads 4 June.
Read that correctly: a start problem, not an estimating one.
Status cycle 2, Friday 10 April
Design finished 8 April as forecast: finish variance +3, duration variance 0. Build started 9 April, start variance +3. But the team lost a developer and Build is re-estimated from 30 days to 36, moving its finish from 15 May to 28 May: finish variance +9 days, 3 inherited, 6 of duration variance, the genuinely new bad news.
That split is why start and finish are tracked separately. "Build is 9 days late" invites the wrong conversation; "Build inherited 3 and grew by 6" points at a staffing decision that can still be acted on.
Status cycle 3, Friday 1 May
Build is 55% complete against 65% planned, so the 36-day estimate is itself optimistic. Rather than let go-live drift again, the team crashes Test: two extra testers cut it from 10 days to 6. Test now shows duration variance −4 days and finish variance +5 days; go-live lands 8 June.
Note what that negative duration variance does not mean. Nothing got faster, four days were bought with two people's time, and a column measuring only days cannot show that.
The honest summary: five days late at go-live, three from a Discovery overrun, six from an April staffing loss, four bought back by adding testers.
Four variances, and what each one hides
"Variance" is not one number. Four are worth tracking, each blind to something the others catch.
| Variance | What it is | What only it tells you | Where it misleads |
|---|---|---|---|
| Start variance | Actual minus baseline start. | Whether the delay was inherited, a late start means something upstream, or a resource who was not free. | Says nothing about the finish. A task can start 5 days late and still hit its baseline finish by burning people. |
| Finish variance | Actual or forecast minus baseline finish. | The impact downstream, the number that propagates. | Bundles inherited with new delay. Build's +9 days was 3 inherited and 6 new, two problems, one number. |
| Duration variance | Actual duration minus baseline duration. | Whether the estimate was wrong, finish variance with the inherited part removed. | Goes negative when a task is crashed, reading as ahead. Test's −4 days cost two extra people. |
| Work / cost variance | Effort or spend consumed versus budgeted. | What the recovery cost, the only one that catches crashing. | Requires recorded actuals. Without entered spend it is not small, it does not exist. |
Duration variance is the one most teams skip and the one that changes behaviour: the only schedule measure separating "we were late" from "we were wrong".
Variance on the critical path is the only variance that matters much
A five-day slip on a task with fifteen days of float costs nothing. A one-day slip on the critical path moves the end date.
Sort by variance, then check which of those are critical. That short list is your actual status report. Reporting slipped-task count without reference to float is how projects manage to be "80% on track" and three weeks late at once. Watch the reverse too: a task with +12 days of variance and 14 of float is fine today and critical tomorrow.
Rebaselining: approved change, or erasing the evidence
This is the most consequential decision you will make about a baseline, and almost never a technical one. Rebaselining resets the comparison: every variance goes to zero and the original promise stops being visible. Three situations make it the right call:
- An approved scope change. Someone with authority added or removed work, in writing. Measuring against a plan that no longer describes the project gives variance that is correct and useless.
- A formal replan. The numbers have stopped guiding decisions, every task reads +30 days and nobody can tell which are worsening.
- A restart after a pause. The old dates measure the gap, not the work.
Every other reason is the same one in different clothes: the variance looks bad and the report is due. Rebaselining in the week before a steering group is the tell. Resetting our example on 1 May would have made go-live read 0 days late, while still being 8 June.
The test is simple: if the rebaseline is legitimate you can name the decision, the date and the approver. If you cannot, you are deleting the evidence that anything went wrong.
When you do rebaseline, keep the old one, save the plan to a file first, since the file carries the baseline with it. The gap between baseline 1 and baseline 3 is often the most honest description of a project that exists, and exactly what overwriting destroys.
Where earned value fits, and what our S-curve honestly reports
Variance in days answers "how late". Earned value answers "how much work did we bank for the time and money spent". It depends on the baseline: without one, planned value has nothing to follow. Our S-curve is deliberate about its limits, know them before quoting it:
- Planned value follows the baseline if you have one. Without one, the plan is just your current dates, so schedule variance reads zero however far things have moved, and the dialog says so rather than letting a flattering zero stand.
- Actual cost is never inferred from progress. It comes only from spend you enter per task. The tempting shortcut, assume a task 40% done has used 40% of its budget, makes CPI exactly 1.00 for every project ever run. Without actuals, CPI, cost variance and forecast at completion report as nothing.
- No costs is the normal case. Tasks are then weighted by working-day duration, giving a pure progress S-curve, the same shape, read in percent rather than currency.
- The earned curve for past dates is reconstructed. We store progress as it is today, not a history of it, so the earlier curve assumes progress accrued evenly across elapsed working days. Exact at the status date, approximate behind it, and labelled as such.
Doing it in gantts.app
The whole loop takes about a minute. Using the portal relaunch as the example:
- Agree the plan first, dates, dependencies and durations should be what you want measured.
- Click ◳ Baseline in the toolbar. With none saved, the menu offers one action: ◳ Set baseline from current plan. You will see "Baseline set, slippage now tracked against this plan".
- Ghost bars now sit under each task bar. Reopening the menu shows the capture date and a Show baseline on chart checkbox to hide them.
- Work the plan. Each cycle, drag bars or edit dates to reflect reality, 18 March for Discovery's finish, 8 April for Design's.
- Open ◳ Baseline again and choose ▦ Show variance columns, which adds Base start, Base end, Start var and Finish var to the grid. Late reads red, early green.
- Scan Finish var, then cross-check the critical path to see which slips move the end date. Duration variance is the gap between baseline and current in the Duration column.
- For progress, run S-curve, planned vs actual progress from the command palette. It states whether planned value follows your baseline or just your current dates.
- Before any rebaseline, save a copy of the file. Then use ⟳ Re-baseline to current plan; ✕ Clear baseline removes it. Both undoable.
Templates that use this
- Project Management Gantt Chart Template
- Free Construction Gantt Chart Template
- Browse all Gantt chart templates
Keep reading
- Critical Path Method (CPM): Steps, Formula & Example
- Gantt Chart Dependencies Explained: FS, SS, FF and SF
- What Is a Gantt Chart? Definition, Examples & Uses
Frequently asked questions
What is a baseline in a Gantt chart?
A frozen copy of the approved schedule, each task's planned start, finish and progress, kept unchanged so you can measure how far the live plan has drifted.
What does schedule variance mean?
The difference in days between a task's baseline date and its current date. Positive is later than planned, negative earlier, zero on plan.
When should I set a baseline?
After the plan is approved and before work begins. Baselining mid-execution hides slippage that already occurred.
What is the difference between start, finish and duration variance?
Start variance shows whether a delay was inherited from upstream. Finish variance shows the impact downstream. Duration variance strips the inherited part out, showing whether your estimate was wrong.
Should I re-baseline when a project slips?
Only for an approved scope change, a formal replan, or a restart after a pause. If you cannot name the decision, the date and the approver, you are deleting the record of what was committed. Save a copy of the plan first either way.
How do I set a baseline in gantts.app?
Use the ◳ Baseline menu and choose "Set baseline from current plan". Ghost bars appear under each task, and "Show variance columns" adds Base start, Base end, Start var and Finish var.