The tracker reads your list, counts the days each document has left and gives every row a status. These are the exact rules it uses.
Reading your list and matching columns
Paste spreadsheet rows, or open or drop a .csv, .tsv or .txt file up to 5 MB. A tab in the first non-blank line means tab-separated; otherwise semicolons win if that line has more of them than commas. Row 1 is treated as column names when none of its cells reads as a date (you can untick that).
Two hypothetical example lists, not client data, fill in with dates counted from your as-of date: vendors and contractors (certificate of insurance, contractor license, W-9 re-request date) and licensed professionals (state professional license, professional liability/E&O). The vendors list is loaded when you first open the page; “Clear list” empties it.
Columns are matched from header words such as “Vendor”, “COI” or “Expires”. Failing that, expiration is the column with the most readable dates, email the first column containing “@”, and name and document the first free columns. Fix any match from its drop-down.
How dates are read
- YYYY-MM-DD is always read. Two-digit years mean 20YY; a time after the date is ignored.
- Auto-detect counts votes: a first number over 12 votes day first, a second number over 12 votes month first. More day-first votes means DD/MM/YYYY; otherwise MM/DD/YYYY.
- If no date settles it and some could go either way (03/04/2027), they’re read month first with a warning. Mixed styles also get a warning, and you can set the format yourself.
- Impossible dates (31/02/2027), month names, spreadsheet serial numbers and text like “TBD” show as Check date.
Days left and the status windows
Days left = expiration date − as-of date (default today), in whole calendar days: round((Date.UTC(expiration) − Date.UTC(as-of)) ÷ 86,400,000). Using UTC means daylight saving never shifts a day. Blank settings revert to their defaults, decimals round, negatives become 0, anything over 9,999 days counts as 9,999 and out-of-order windows are sorted. If two windows are equal, the empty bucket shows as “Unused”.
Duplicates, the vendor rollup and the headline numbers
- Duplicates: rows with the same vendor and document type (ignoring capitals and extra spaces) keep the latest expiration. Older dated rows become Superseded: dimmed in the table and left out of counts, the rollup, emails and the calendar. Ties keep the first row; undated rows are never superseded.
- Rollup: each vendor’s earliest expiration and worst status, ranked Expired, Check date, T1, T2, T3, Current.
- Headline: expired or due within T3 days = Expired + the three window counts; vendors to follow up with = worst status isn’t Current; documents checked = rows minus superseded rows.
- Sort: Check date first, then fewest days left, superseded last.
Reminder emails and the CSV and calendar exports
- Emails cover vendors with a dated document that’s expired or inside your windows, one sentence each: “Our records show your {document} expires on {date}. Please send an updated copy by {expiration − reply-by offset}.” Expired documents say “expired on”; a reply-by date on or before the as-of date becomes “as soon as possible.” The button only starts a draft.
- CSV: every row in the current filter and search, with days left and status. Cells starting with = + - or @ get a leading apostrophe so they can’t run as formulas.
- Calendar (.ics): one all-day reminder per dated, non-superseded document on the expiration date minus the calendar lead time (default 30 days), alerting at 9:00. Some calendar apps ignore imported alerts, and past reminder dates stay in the past.
Worked example (hypothetical, not client data)
Five rows from the vendors and contractors example, as of March 1, 2027, with default settings:
Because 17 and 18 can only be days, the list is read month first, so 03/06/2027 is March 6. With just these five rows, the headline shows 3 documents expired or due within 90 days, 3 vendors to follow up with and 4 documents checked. Blue Heron’s email asks for its COI “as soon as possible” (its February 10 reply-by date has passed) and its license “by April 11, 2027”. The license’s calendar reminder lands on March 19, 2027.
Limits, and why it stays in your browser
- It tracks only the dates you give it. It doesn’t read certificates, confirm coverage or check licenses.
- “COI” and “Certificate of insurance” count as different documents.
- Long emails may be cut off by some email apps; “Copy email” always works.
- Nothing is uploaded and there’s no account. Share-link settings sit after the #, which browsers don’t send to servers, and saving on this device is off until you tick it.
