How to identify every change in an excel contract schedule between versions
- Step 1Save both schedule versions as files — Save the agreed/prior schedule and the returned/revised schedule as two separate Excel files — for example
schedule_agreed.xlsxandschedule_returned.xlsx. The first uploaded is the baseline; the second is the version under review. Label them precisely so the diff reads in the right direction. - Step 2Use a Pro-tier account — Range Diff is Pro-gated and requires two files. Free permits one file per run, so it can't run a comparison. Pro covers 50 MB / 100,000 rows per file — far beyond any contract schedule — and higher tiers go further if needed.
- Step 3Confirm the row structure matches — Because rows compare by position, check that the revised schedule didn't insert or delete rows in a rate table. If it did, expect rows below to flag as changed; align them or sort both by a stable key (e.g. line/SKU) before diffing for a clean amendment log.
- Step 4Upload the agreed version, then the revised — Drop file A (agreed) then file B (revised). Both read in-browser. No options appear — the comparison is deterministic, with no settings that could be challenged as 'tuned'.
- Step 5Read the change summary — The panel shows
diffCountand the first 200 changes as[Sheet] Column[row N]: "old" → "new" (changed). This is your immediate read on which terms moved before opening the full exhibit. - Step 6Export diff-report.xlsx as the amendment exhibit — Open the colour-coded workbook and review the amber/green/red cells. It serves as the evidence of exactly which schedule terms changed. Each cell shows the new term (or the old term where a value was removed).
Contract amendment types and diff classification
How common schedule edits surface in the diff.
| Amendment | Diff type | Output colour |
|---|---|---|
| Rate or fee changed (e.g. $1,000 → $1,200) | Changed | Amber |
| SLA target tightened (99.5% → 99.9%) | Changed | Amber |
| A new line / clause value filled into a blank cell | Added | Green |
| A term struck (value cleared) | Removed | Red |
| A new schedule tab (e.g. Annex C) added | Added (all cells) | Green sheet |
| A tab renamed (Draft → Execution) | Removed + Added sheet | Red + green sheet |
Cosmetic differences that flag as changes
String comparison means formatting differences count. Standardise formatting before diffing to keep the change log substantive.
| Agreed | Revised | Diff says | Substantive? |
|---|---|---|---|
| 1000 | 1,000 | changed | No — thousands separator |
| $1,000 | 1000 | changed | No — currency symbol |
| 99.5% | 0.995 | changed | No — percent vs decimal display |
| Net 30 | Net 30 | changed | No — trailing space |
| 1000 | 1200 | changed | Yes — real fee increase |
Tier limits for two-file schedule diffs
Range Diff is Pro+; contract schedules are tiny relative to these limits.
| Tier | Max file size | Max rows / file | Files per run |
|---|---|---|---|
| Free | 5 MB | 10,000 | 1 (can't run a 2-file diff) |
| Pro | 50 MB | 100,000 | 5 |
| Pro-media | 200 MB | 500,000 | 20 |
| Developer | 500 MB | Unlimited | Unlimited |
Cookbook
Amendment-review scenarios. Terms are illustrative; summary lines mirror the tool's real [Sheet] Column[row N]: "old" → "new" (type) output.
A quietly changed unit rate
The counterparty's 'minor edits' include a rate moved from 1,000 to 1,200 on the pricing tab. The diff flags it amber.
Agreed (Pricing): Revised (Pricing): Service,Rate Service,Rate Tier 1,1000 Tier 1,1200 Tier 2,1500 Tier 2,1500 Result: diffCount: 1 [Pricing] Rate[row 0]: "1000" → "1200" (changed) → amber
An added obligation in a blank cell
A 'Penalty' figure that was blank in the agreed version is filled in the revised one. Classified added (green).
Agreed: Revised: SLA,Penalty SLA,Penalty 99.9%, 99.9%,5% credit Result: diffCount: 1 [SLA] Penalty[row 0]: "" → "5% credit" (added) → green
A struck term
A discount that existed in the agreed schedule is cleared in the revised one. Classified removed (red), and the cell shows the old value.
Agreed: Revised: Item,Discount Item,Discount Bundle,10% Bundle, Result: diffCount: 1 [Pricing] Discount[row 0]: "10%" → "" (removed) → red (output cell shows "10%")
An added annex tab
The revised file adds an 'Annex C' sheet the agreed version didn't have. The whole tab is written to the diff as added.
Agreed sheets: Pricing, SLA Revised sheets: Pricing, SLA, Annex C ← new Result: Annex C written as an all-green sheet. summary: Compared 3 sheet(s). N differences found. → review Annex C carefully — it's entirely new text.
Inserted line shifts the comparison
A new line inserted into the rate table pushes rows down, so positionally-matched rows below it all flag as changed.
Agreed: Revised (row inserted):
Service,Rate Service,Rate
Setup,500 Onboarding,750 ← inserted
Support,300 Setup,500
Support,300
Result: row0 Setup→Onboarding (changed), row1 Support→Setup
(changed), row2 ""→Support (added). Align rows before diffing
or the change log overstates the edits.Edge cases and what actually happens
Only one schedule uploaded
ErrorRange Diff needs both versions. With one file it throws 'Two files are required for comparison.' Upload the agreed version first, then the revised one.
Free tier
Pro requiredThe tool throws 'Range Diff requires Pro tier.' Free is also single-file, so a two-version schedule comparison can't run there. Upgrade to Pro or higher.
Counterparty inserted a row in a rate table
Expected (positional)Rows compare by position, so an inserted line shifts every row below it and they report as changed. This is by design. Before relying on the diff as an exhibit, confirm both files have the same row count, or sort both by a stable key (line number / SKU) so rows align.
Currency or percentage formatting differs
Changed (string compare)Cells compare as strings: $1,000 vs 1000, or 99.5% vs 0.995, register as changed. There is no tolerance. Standardise number/percentage formatting across both versions so the change log shows only substantive amendments.
A schedule tab was renamed
ExpectedSheets match by name, so a renamed annex shows as one all-red removed sheet and one all-green added sheet rather than a clean diff. Rename both tabs to match before comparing.
Columns reordered in the revised file
PreservedColumns match by header, so moving the 'Rate' column doesn't create false changes. Only a renamed or newly added header counts as a new column.
Trailing whitespace in a term
ChangedNet 30 vs Net 30 differs as a string and flags as changed. There's no trim option in Range Diff. Clean trailing whitespace first with the whitespace trimmer if it's producing noise.
Merged cells in a formatted schedule
Read per cellSheetJS reads the underlying cell grid, so a value in a visually merged cell is read from its anchor cell; surrounding cells in the merge read as blank. Compare like-for-like layouts, or unmerge before diffing, to avoid confusing added/removed flags around merged ranges.
Hundreds of line items
Summary cappedThe text summary lists the first 200 changes and findings hold the first 500, but diffCount is the true total and every change is coloured in the workbook. Use diff-report.xlsx as the authoritative exhibit for a long schedule.
Annex tab name over 31 characters
TruncatedExcel limits sheet names to 31 characters, so the output worksheet name is truncated. Two long annex names matching in their first 31 characters could collide; shorten if that's a risk.
Frequently asked questions
Can I rely on this diff as evidence of what the counterparty changed?
Yes, with one prerequisite: the rows must be aligned. Range Diff compares rows by position and cells exactly (as strings), so every genuine value change is captured deterministically. But if a line was inserted or deleted into a table, rows below shift and over-report. Confirm both files have the same row count — or sort both by a stable key — and the colour-coded workbook is a defensible change log.
Why do some terms show as changed when nothing substantive moved?
Comparison is string-based, so formatting differences count: $1,000 vs 1000, 99.5% vs 0.995, or a trailing space all flag as changes. Standardise number, currency, and percentage formatting across both versions, and trim whitespace, to keep the change log to substantive amendments.
Is the contract data confidential — does it leave my device?
No. Range Diff runs entirely in your browser using ExcelJS and SheetJS. Privileged pricing, SLA, and payment terms never reach a server. Only an anonymous processed-file counter is recorded for dashboard stats, supporting your confidentiality obligations.
How do I catch a whole new annex the other side added?
A tab present only in the revised file is written to the diff as an all-green sheet — every cell flagged added — because there was no matching tab to compare against. The summary's sheet count reflects the union of both files' tabs, so a new annex always shows up.
Does it compare two files or can I review a full negotiation history?
It compares exactly two files per run: the first is the baseline, the second is under review. To track a multi-round negotiation, diff consecutive versions pairwise (round 1↔2, round 2↔3) and keep each diff-report.xlsx as the exhibit for that round.
What if the schedule has merged cells?
SheetJS reads the cell grid, so a merged value sits in its anchor cell and the rest of the merge reads blank. If both versions share the same merge layout the diff is clean; if layouts differ, unmerge both before comparing to avoid spurious added/removed flags.
Can it ignore case or minor wording differences?
No — there are no options. Comparison is exact, case-sensitive string matching, so Net 30 differs from net 30. For legal review that's usually the point (you want to see every change), but if you need case-insensitive comparison, normalise both files first with the case converter.
What does each colour mean in the exhibit?
Amber = a changed term, green = an added value (the cell was blank in the agreed version), red = a removed value (struck), and the grey bold row is the header. Cells with no fill are unchanged, so colour pinpoints exactly where the schedule was amended.
Does the output show the original or amended term?
Each cell shows the new (amended) value, except removed cells which show the old value that was struck. So amber and green cells display the revised term, and red cells preserve what was there in the agreed version.
How large can a schedule be?
Pro allows 50 MB and 100,000 rows per file — orders of magnitude beyond any contract schedule. Pro-media and Developer go higher. Free can't run a two-file diff. The full diff is always coloured in the workbook; only the text summary truncates at 200 lines.
Should I diff the agreed version against the redline?
Diff the last mutually agreed schedule against the version just returned. The first file you upload is the baseline (agreed), the second is the revision under review, so the change log reads 'agreed → returned', which is the direction you want for a redline memo.
Which related tools help in legal review?
Use the sheet joiner to combine multi-annex schedules before comparing, the error locator to find broken formula cells in a returned file, the format inspector to spot formatting drift that would otherwise look like changes, and the PII scrubber if a schedule needs personal data redacted before sharing.
Privacy first
Every JAD Excel tool runs entirely in your browser using SheetJS and ExcelJS. Your spreadsheets, formulas, and data never leave your device — verified by zero outbound network requests during processing.