Salary history is stored encrypted. Enter the passphrase to decrypt it in this browser.
Incorrect passphrase.
The dataset ships as an AES-256-GCM blob; the key is derived from this
passphrase with PBKDF2-HMAC-SHA256 (250,000 iterations). Nothing is decrypted
server-side and no plaintext salary figures exist in this page's source — a wrong
passphrase fails authentication and yields nothing. The decrypted data lives in
memory only, is never written to disk, and is wiped after 15 minutes idle.
Decrypted in memory
Roster & Raise History
Entity and status are editable and saved to this browser. Status is inferred from activity — verify anyone flagged.
Raise queue
Active staff ranked by how far past their own typical review interval they are.
Name
Current base
Last change
Months since
Typical gap
Overdue by
Last raise
Individual Trajectories
Base salary is a step function — each record is a rate change effective that date, not a payment.
Up to 8 people can be plotted in colour at once.
Tenure benchmark
Every salary change in company history plotted against the person's tenure at that moment.
Grey is everyone; the focused person is highlighted — this is the "are they on the normal track?" view.
Raise ladder
Every rate change for the selected people, with the gap since their prior change.
Name
Effective
From
To
Change
%
Months since prior
Tenure at change
Bonus history
Bonuses are actual payments, shown in the calendar year paid.
Company Payroll Curve
Annualised base run-rate
Sum of every active person's annual base rate, evaluated at the first of each month.
Headcount
Active staff on the first of each month.
Base accrued by entity
Day-weighted base salary cost per calendar year, split by expense class.
Annual history
Base accrued is day-weighted from the step function; bonuses are cash paid in that year.
Year
Headcount (avg)
Ending headcount
Base accrued
Bonuses paid
Total cash comp
YoY
Avg base
Median base
Forward Plan
Your history clusters mid-January.
Applies to everyone; override per person below.
Back-solves a uniform % on annualised base, around any manual overrides.
Employer burden assumptions
Verify rates for your plan year
Per-person plan
Edit % or the new base — each updates the other. Set an end month to model a departure.
Name
Entity
Current base
%
New base
Effective
Ends
Base accrued
Bonus
Burden
Loaded cost
Planned hires
Roles not yet on payroll. Start month prorates the first-year cost.
Role / name
Entity
Base
Starts
Bonus
Base accrued
Burden
Loaded cost
Plan vs. current run-rate by entity
Current annualised base at today's rates against planned loaded cost for the plan year.
Monthly cash profile
Base paid plus bonuses landing in that month, for the plan year.
Methodology & assumptions
How records are read
A Salary row is an annual base rate effective that date, not a payment.
Base salary is therefore a step function: it holds its level until the next rate change.
A Bonus row is an actual payment on that date. Only the worksheet's
Aggregate block is used — it was verified to reconcile row-for-row against the
US Paychex and UK MRC blocks.
Base accrued
Cost for a period is day-weighted across the step function:
Σ (days at rate × rate ÷ days in year), clipped to the employment window.
That is why a mid-year raise costs less than its headline in year one.
Employment windows
Hire date is the first salary record. There are no termination dates in the worksheet, so
departure is inferred: no activity for 18 months means departed as of the last record.
Inferred-departed people are flagged; correct them on the Roster and the fix is saved to
this browser. Run-rate, headcount and accrual all respect these windows, so a wrong status
distorts the company curves.
Currency
UK staff are held in native GBP. Every historical USD figure in the worksheet uses a single
frozen rate, so historical dollar values are not re-priced at period rates — they are
shown as booked. The plan year uses the editable plan rate, and the FX effect is reported
separately from the merit effect.
Statutory rates
Every burden rate and wage base is an input with no authority behind its default. Confirm
the Social Security wage base, state UI rate and UK NI threshold for your plan year before
relying on the loaded-cost totals.
Privacy model
The dataset is AES-256-GCM ciphertext in payroll-data.js; the key is
PBKDF2-HMAC-SHA256 (250k iterations) over the passphrase. Decryption happens in the browser
and the plaintext is never persisted — only your roster corrections and plan scenario are
saved locally, and those contain no salary figures beyond what you type. Re-run
build_data.py to refresh the data or rotate the passphrase.
Workflow Guide
Tab 1 — Paychex Reconciler
Drop the Paychex Invoice PDF to extract the Total Amount and Date.
Drop the Check Stubs PDF to extract individual Gross Pay and FICA.
Review the Reconciliation Matrix to ensure all gaps are covered as Fees.
Modify any unassigned Vertical classifications.
Click Export to QuickBooks to generate the CSV.
Tab 2 — Compensation & Planning
Unlock with the passphrase — the salary history is encrypted at rest.
Roster: confirm entity and employment status; the raise queue shows who is overdue.
Trajectory: plot individual paths and compare against the tenure benchmark.
Company: run-rate, headcount and annual cost by entity.
Plan Ahead: set a merit pool (or budget), adjust per person, add planned hires,
then export or print the loaded-cost plan.
Refreshing the data
Export the master worksheet as CSV.
Run python3 build_data.py "path/to/worksheet.csv" and enter the passphrase.
That rewrites payroll-data.js. Never commit the plaintext CSV.