Repository navigation
Expand file tree
/
Copy pathdashboard.html
More file actions
72 lines (72 loc) · 43.6 KB
/
Copy pathdashboard.html
File metadata and controls
72 lines (72 loc) · 43.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Spend Radar Dashboard</title><style>
:root {
color-scheme: light;
--page: #f9f9f7; --surface: #fcfcfb; --ink: #0b0b0b; --ink2: #52514e; --muted: #898781;
--grid: #e1e0d9; --axis: #c3c2b7; --border: rgba(11,11,11,0.10);
--series: #2a78d6; --series-soft: #9ec5f4;
--crit: #d03b3b; --serious: #ec835a; --warn: #fab219; --neutral: #898781;
}
@media (prefers-color-scheme: dark) {
:root:where(:not([data-theme="light"])) {
color-scheme: dark;
--page: #0d0d0d; --surface: #1a1a19; --ink: #f0efec; --ink2: #c3c2b7; --muted: #898781;
--grid: #2c2c2a; --axis: #383835; --border: rgba(255,255,255,0.10);
--series: #3987e5; --series-soft: #1c5cab;
}
}
:root[data-theme="dark"] {
color-scheme: dark;
--page: #0d0d0d; --surface: #1a1a19; --ink: #f0efec; --ink2: #c3c2b7; --muted: #898781;
--grid: #2c2c2a; --axis: #383835; --border: rgba(255,255,255,0.10);
--series: #3987e5; --series-soft: #1c5cab;
}
* { box-sizing: border-box; }
body { margin: 0; background: var(--page); color: var(--ink);
font: 15px/1.5 system-ui, -apple-system, "Segoe UI", sans-serif; }
main { max-width: 1120px; margin: 0 auto; padding: 24px 16px 48px; }
h1 { font-size: 24px; margin: 0 0 4px; }
h2 { font-size: 17px; margin: 0 0 4px; }
p { margin: 0; }
.sub { color: var(--ink2); }
.banner { margin: 16px 0; padding: 10px 14px; border: 1px solid var(--border);
background: var(--surface); border-radius: 8px; color: var(--ink2); }
.reco { margin: 16px 0; padding: 16px; border: 1px solid var(--border); background: var(--surface);
border-left: 4px solid var(--crit); border-radius: 8px; font-size: 16px; }
.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px;
margin: 16px 0; }
.tile { background: var(--surface); border: 1px solid var(--border); border-radius: 8px;
padding: 14px 16px; }
.tile .v { font-size: 26px; font-weight: 600; line-height: 1.2; }
.tile .l { color: var(--ink2); font-size: 13px; }
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px;
padding: 16px; margin: 16px 0; }
.legend { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 8px 0 12px; color: var(--ink2);
font-size: 13px; }
.legend span { display: inline-flex; align-items: center; gap: 6px; }
.key { width: 12px; height: 12px; display: inline-block; }
.scroll { overflow-x: auto; }
table { border-collapse: collapse; width: 100%; font-size: 14px; }
th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--grid);
vertical-align: top; }
th { color: var(--ink2); font-weight: 600; font-size: 13px; }
.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
.tag { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.row { display: grid; grid-template-columns: 120px 1fr 190px; gap: 10px; align-items: center;
padding: 4px 0; }
.row:hover { background: var(--page); }
.row .name { color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row .val { color: var(--ink2); font-size: 13px; text-align: right; }
.track { position: relative; height: 14px; background: var(--grid); border-radius: 0 4px 4px 0; }
.seg { position: absolute; top: 0; bottom: 0; border-radius: 0 4px 4px 0; }
.thr { position: absolute; top: -4px; bottom: -4px; width: 0; border-left: 2px dashed var(--ink2); }
.thr-label { position: absolute; top: -22px; transform: translateX(-50%); font-size: 12px;
color: var(--ink2); }
details { margin-top: 12px; color: var(--ink2); }
summary { cursor: pointer; }
footer { color: var(--muted); font-size: 13px; margin-top: 24px; }
@media (max-width: 640px) {
.row { grid-template-columns: 90px 1fr; }
.row .val { grid-column: 1 / -1; text-align: left; }
}
</style></head><body><main><h1>Spend radar</h1><p class='sub'>As of 2026-10-17. Where software money leaks and what to decide next.</p><p class="banner"><strong>SAMPLE DATA.</strong> Every vendor, cost and date here is invented for demonstration.</p><div class="reco"><strong>Recommendation.</strong> Start with Taskwave. Negotiate or give notice by 2026-10-21 (4 days). Planhive is a cheaper option for these seats. Then Meetly, Boardwick.</div><div class="kpis"><div class="tile"><div class="v">3 to decide now</div><div class="l">$12,030 to $24,060 a year at stake</div></div><div class="tile"><div class="v">$619,800</div><div class="l">annual software spend across 25 vendors</div></div><div class="tile"><div class="v">$51,688 to $103,375</div><div class="l">rough recoverable range a year (estimate)</div></div><div class="tile"><div class="v">19 of 20</div><div class="l">auto-renew contracts with no approved exception</div></div></div><section class="card"><h2>Decide now and next 90 days</h2><div class="scroll"><table><thead><tr><th>Vendor</th><th>Status</th><th>Action</th><th>Decide by</th><th>Saving a year</th><th>What to do</th></tr></thead><tbody><tr><td><strong>Taskwave</strong><br><span class='sub'>Engineering</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><circle cx="7.0" cy="7.0" r="4.5" fill="var(--crit)" stroke="var(--surface)" stroke-width="2"/></svg>Act now</span></td><td>Negotiate now</td><td class='num'>2026-10-21</td><td class='num'>$6,150 to $12,300</td><td>Negotiate or give notice by 2026-10-21 (4 days). Planhive is a cheaper option for these seats.</td></tr><tr><td><strong>Meetly</strong><br><span class='sub'>IT</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><circle cx="7.0" cy="7.0" r="4.5" fill="var(--crit)" stroke="var(--surface)" stroke-width="2"/></svg>Act now</span></td><td>Negotiate now</td><td class='num'>2026-10-31</td><td class='num'>$3,180 to $6,360</td><td>Negotiate or give notice by 2026-10-31 (14 days). 53 seats are unused.</td></tr><tr><td><strong>Boardwick</strong><br><span class='sub'>Operations</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,7.0 7.0,12.5 1.5,7.0" fill="var(--serious)" stroke="var(--surface)" stroke-width="2"/></svg>Window closed</span></td><td>Escalate the rollover</td><td class='num'>2026-11-12</td><td class='num'>$2,700 to $5,400</td><td>Ask in writing to be released from the rollover on 2026-11-12. The notice deadline passed 19 days ago.</td></tr><tr><td><strong>Cloudpebble</strong><br><span class='sub'>IT</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span></td><td>Cut unused seats</td><td class='num'>2026-12-12</td><td class='num'>$13,320 to $26,640</td><td>Cut 148 unused seats at renewal. Only 46% of seats are in use. Decide by 2026-12-12.</td></tr><tr><td><strong>Hirestack</strong><br><span class='sub'>People</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span></td><td>Cut unused seats</td><td class='num'>2027-01-08</td><td class='num'>$4,200 to $8,400</td><td>Cut 16 unused seats at renewal. Only 52% of seats are in use. Decide by 2027-01-08.</td></tr><tr><td><strong>Designmint</strong><br><span class='sub'>Marketing</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span></td><td>Cut unused seats</td><td class='num'>2027-01-06</td><td class='num'>$3,795 to $7,590</td><td>Cut 23 unused seats at renewal. Only 55% of seats are in use. Decide by 2027-01-06.</td></tr><tr><td><strong>Chatharbor</strong><br><span class='sub'>IT</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span></td><td>Cap the uplift</td><td class='num'>2026-12-06</td><td class='num'>$1,140 to $2,280</td><td>Cap the uplift. The last one was 9.5%. Decide by 2026-12-06.</td></tr><tr><td><strong>Signalforge</strong><br><span class='sub'>Support</span></td><td><span class="tag"><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span></td><td>Remove auto-renew</td><td class='num'>2026-12-07</td><td class='num'>$600 to $1,200</td><td>Ask to remove auto-renew. Decide by 2026-12-07.</td></tr></tbody></table></div></section><section class="card"><h2>When decisions fall due</h2><p class="sub">Each row is a contract. The closer the marker is to Today, the sooner you must act.</p><div class="legend"><span><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg"><circle cx="7.0" cy="7.0" r="4.5" fill="var(--crit)" stroke="var(--surface)" stroke-width="2"/></svg>Act now</span><span><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg"><polygon points="7.0,1.5 12.5,11.5 1.5,11.5" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></svg>Upcoming</span><span><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg"><polygon points="7.0,1.5 12.5,7.0 7.0,12.5 1.5,7.0" fill="var(--serious)" stroke="var(--surface)" stroke-width="2"/></svg>Window closed</span><span><svg width="14" height="14" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg"><rect x="2.5" y="2.5" width="9" height="9" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></svg>Fine</span></div><div class="scroll"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 612" width="860" height="612" role="img" aria-label="Renewal timeline. One row per vendor, ordered by decision date."><line x1="208.4" x2="208.4" y1="28" y2="590" stroke="var(--ink2)" stroke-width="1"/><text x="208.4" y="22" text-anchor="middle" font-size="12" fill="var(--ink2)">Today</text><line x1="286.9" x2="286.9" y1="28" y2="590" stroke="var(--axis)" stroke-width="1" stroke-dasharray="3 4"/><text x="286.9" y="22" text-anchor="middle" font-size="12" fill="var(--ink2)">+30 days</text><line x1="443.8" x2="443.8" y1="28" y2="590" stroke="var(--axis)" stroke-width="1" stroke-dasharray="3 4"/><text x="443.8" y="22" text-anchor="middle" font-size="12" fill="var(--ink2)">+90 days</text><line x1="679.1" x2="679.1" y1="28" y2="590" stroke="var(--axis)" stroke-width="1" stroke-dasharray="3 4"/><text x="679.1" y="22" text-anchor="middle" font-size="12" fill="var(--ink2)">+180 days</text><g><title>Boardwick: Window closed. Notice deadline passed 19 days ago. Renews 2026-11-12. Auto-renew on.</title><rect x="126" y="34.0" width="714" height="22" fill="transparent"/><text x="120" y="49.0" text-anchor="end" font-size="13" fill="var(--ink)">Boardwick</text><line x1="158.8" x2="276.4" y1="45.0" y2="45.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="276.4" x2="276.4" y1="41.0" y2="49.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="158.8,39.0 164.8,45.0 158.8,51.0 152.8,45.0" fill="var(--serious)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Taskwave: Act now. notice deadline in 4 days. Renews 2026-12-20. Auto-renew on.</title><rect x="126" y="56.0" width="714" height="22" fill="transparent"/><text x="120" y="71.0" text-anchor="end" font-size="13" fill="var(--ink)">Taskwave</text><line x1="218.9" x2="375.8" y1="67.0" y2="67.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="375.8" x2="375.8" y1="63.0" y2="71.0" stroke="var(--ink2)" stroke-width="2"/><circle cx="218.9" cy="67.0" r="5.0" fill="var(--crit)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Meetly: Act now. notice deadline in 14 days. Renews 2026-11-30. Auto-renew on.</title><rect x="126" y="78.0" width="714" height="22" fill="transparent"/><text x="120" y="93.0" text-anchor="end" font-size="13" fill="var(--ink)">Meetly</text><line x1="245.1" x2="323.5" y1="89.0" y2="89.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="323.5" x2="323.5" y1="85.0" y2="93.0" stroke="var(--ink2)" stroke-width="2"/><circle cx="245.1" cy="89.0" r="5.0" fill="var(--crit)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Ledgerleaf: Upcoming. notice deadline in 46 days. Renews 2027-01-31. Auto-renew on.</title><rect x="126" y="100.0" width="714" height="22" fill="transparent"/><text x="120" y="115.0" text-anchor="end" font-size="13" fill="var(--ink)">Ledgerleaf</text><line x1="328.7" x2="485.6" y1="111.0" y2="111.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="485.6" x2="485.6" y1="107.0" y2="115.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="328.7,105.0 334.7,116.0 322.7,116.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Chatharbor: Upcoming. notice deadline in 50 days. Renews 2027-01-20. Auto-renew on.</title><rect x="126" y="122.0" width="714" height="22" fill="transparent"/><text x="120" y="137.0" text-anchor="end" font-size="13" fill="var(--ink)">Chatharbor</text><line x1="339.2" x2="456.9" y1="133.0" y2="133.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="456.9" x2="456.9" y1="129.0" y2="137.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="339.2,127.0 345.2,138.0 333.2,138.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Signalforge: Upcoming. notice deadline in 51 days. Renews 2027-02-05. Auto-renew on.</title><rect x="126" y="144.0" width="714" height="22" fill="transparent"/><text x="120" y="159.0" text-anchor="end" font-size="13" fill="var(--ink)">Signalforge</text><line x1="341.8" x2="498.7" y1="155.0" y2="155.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="498.7" x2="498.7" y1="151.0" y2="159.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="341.8,149.0 347.8,160.0 335.8,160.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Cloudpebble: Upcoming. notice deadline in 56 days. Renews 2027-02-10. Auto-renew on.</title><rect x="126" y="166.0" width="714" height="22" fill="transparent"/><text x="120" y="181.0" text-anchor="end" font-size="13" fill="var(--ink)">Cloudpebble</text><line x1="354.9" x2="511.8" y1="177.0" y2="177.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="511.8" x2="511.8" y1="173.0" y2="181.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="354.9,171.0 360.9,182.0 348.9,182.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Designmint: Upcoming. notice deadline in 81 days. Renews 2027-02-20. Auto-renew on.</title><rect x="126" y="188.0" width="714" height="22" fill="transparent"/><text x="120" y="203.0" text-anchor="end" font-size="13" fill="var(--ink)">Designmint</text><line x1="420.2" x2="537.9" y1="199.0" y2="199.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="537.9" x2="537.9" y1="195.0" y2="203.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="420.2,193.0 426.2,204.0 414.2,204.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Hirestack: Upcoming. renewal date in 83 days. Renews 2027-01-08. Auto-renew off.</title><rect x="126" y="210.0" width="714" height="22" fill="transparent"/><text x="120" y="225.0" text-anchor="end" font-size="13" fill="var(--ink)">Hirestack</text><line x1="425.5" x2="425.5" y1="221.0" y2="221.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="425.5" x2="425.5" y1="217.0" y2="225.0" stroke="var(--ink2)" stroke-width="2"/><polygon points="425.5,215.0 431.5,226.0 419.5,226.0" fill="var(--warn)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Planhive: Fine. notice deadline in 104 days. Renews 2027-03-15. Auto-renew on.</title><rect x="126" y="232.0" width="714" height="22" fill="transparent"/><text x="120" y="247.0" text-anchor="end" font-size="13" fill="var(--ink)">Planhive</text><line x1="480.4" x2="598.1" y1="243.0" y2="243.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="598.1" x2="598.1" y1="239.0" y2="247.0" stroke="var(--ink2)" stroke-width="2"/><rect x="475.4" y="238.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Docuvane: Fine. notice deadline in 105 days. Renews 2027-03-01. Auto-renew on.</title><rect x="126" y="254.0" width="714" height="22" fill="transparent"/><text x="120" y="269.0" text-anchor="end" font-size="13" fill="var(--ink)">Docuvane</text><line x1="483.0" x2="561.4" y1="265.0" y2="265.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="561.4" x2="561.4" y1="261.0" y2="269.0" stroke="var(--ink2)" stroke-width="2"/><rect x="478.0" y="260.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Mailorbit: Fine. renewal date in 107 days. Renews 2027-02-01. Auto-renew off.</title><rect x="126" y="276.0" width="714" height="22" fill="transparent"/><text x="120" y="291.0" text-anchor="end" font-size="13" fill="var(--ink)">Mailorbit</text><line x1="488.2" x2="488.2" y1="287.0" y2="287.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="488.2" x2="488.2" y1="283.0" y2="291.0" stroke="var(--ink2)" stroke-width="2"/><rect x="483.2" y="282.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Quillboard: Fine. notice deadline in 109 days. Renews 2027-03-20. Auto-renew on.</title><rect x="126" y="298.0" width="714" height="22" fill="transparent"/><text x="120" y="313.0" text-anchor="end" font-size="13" fill="var(--ink)">Quillboard</text><line x1="493.5" x2="611.1" y1="309.0" y2="309.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="611.1" x2="611.1" y1="305.0" y2="313.0" stroke="var(--ink2)" stroke-width="2"/><rect x="488.5" y="304.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Securenook: Fine. notice deadline in 109 days. Renews 2027-03-05. Auto-renew on.</title><rect x="126" y="320.0" width="714" height="22" fill="transparent"/><text x="120" y="335.0" text-anchor="end" font-size="13" fill="var(--ink)">Securenook</text><line x1="493.5" x2="571.9" y1="331.0" y2="331.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="571.9" x2="571.9" y1="327.0" y2="335.0" stroke="var(--ink2)" stroke-width="2"/><rect x="488.5" y="326.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Formkiln: Fine. notice deadline in 135 days. Renews 2027-03-31. Auto-renew on.</title><rect x="126" y="342.0" width="714" height="22" fill="transparent"/><text x="120" y="357.0" text-anchor="end" font-size="13" fill="var(--ink)">Formkiln</text><line x1="561.4" x2="639.9" y1="353.0" y2="353.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="639.9" x2="639.9" y1="349.0" y2="357.0" stroke="var(--ink2)" stroke-width="2"/><rect x="556.4" y="348.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Payloom: Fine. notice deadline in 135 days. Renews 2027-04-30. Auto-renew on.</title><rect x="126" y="364.0" width="714" height="22" fill="transparent"/><text x="120" y="379.0" text-anchor="end" font-size="13" fill="var(--ink)">Payloom</text><line x1="561.4" x2="718.3" y1="375.0" y2="375.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="718.3" x2="718.3" y1="371.0" y2="379.0" stroke="var(--ink2)" stroke-width="2"/><rect x="556.4" y="370.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Codepillar: Fine. notice deadline in 145 days. Renews 2027-04-10. Auto-renew on.</title><rect x="126" y="386.0" width="714" height="22" fill="transparent"/><text x="120" y="401.0" text-anchor="end" font-size="13" fill="var(--ink)">Codepillar</text><line x1="587.6" x2="666.0" y1="397.0" y2="397.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="666.0" x2="666.0" y1="393.0" y2="401.0" stroke="var(--ink2)" stroke-width="2"/><rect x="582.6" y="392.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Voxdesk: Fine. notice deadline in 145 days. Renews 2027-05-10. Auto-renew on.</title><rect x="126" y="408.0" width="714" height="22" fill="transparent"/><text x="120" y="423.0" text-anchor="end" font-size="13" fill="var(--ink)">Voxdesk</text><line x1="587.6" x2="744.5" y1="419.0" y2="419.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="744.5" x2="744.5" y1="415.0" y2="423.0" stroke="var(--ink2)" stroke-width="2"/><rect x="582.6" y="414.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Calendrift: Fine. notice deadline in 157 days. Renews 2027-04-22. Auto-renew on.</title><rect x="126" y="430.0" width="714" height="22" fill="transparent"/><text x="120" y="445.0" text-anchor="end" font-size="13" fill="var(--ink)">Calendrift</text><line x1="619.0" x2="697.4" y1="441.0" y2="441.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="697.4" x2="697.4" y1="437.0" y2="445.0" stroke="var(--ink2)" stroke-width="2"/><rect x="614.0" y="436.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Datanest: Fine. notice deadline in 166 days. Renews 2027-06-30. Auto-renew on.</title><rect x="126" y="452.0" width="714" height="22" fill="transparent"/><text x="120" y="467.0" text-anchor="end" font-size="13" fill="var(--ink)">Datanest</text><line x1="642.5" x2="836.0" y1="463.0" y2="463.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="836.0" x2="836.0" y1="459.0" y2="467.0" stroke="var(--ink2)" stroke-width="2"/><rect x="637.5" y="458.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Insightpine: Fine. notice deadline in 181 days. Renews 2027-06-15. Auto-renew on.</title><rect x="126" y="474.0" width="714" height="22" fill="transparent"/><text x="120" y="489.0" text-anchor="end" font-size="13" fill="var(--ink)">Insightpine</text><line x1="681.7" x2="836.0" y1="485.0" y2="485.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="836.0" x2="836.0" y1="481.0" y2="489.0" stroke="var(--ink2)" stroke-width="2"/><rect x="676.7" y="480.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Huddlefox: Fine. renewal date in 196 days. Renews 2027-05-01. Auto-renew off.</title><rect x="126" y="496.0" width="714" height="22" fill="transparent"/><text x="120" y="511.0" text-anchor="end" font-size="13" fill="var(--ink)">Huddlefox</text><line x1="720.9" x2="720.9" y1="507.0" y2="507.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="720.9" x2="720.9" y1="503.0" y2="511.0" stroke="var(--ink2)" stroke-width="2"/><rect x="715.9" y="502.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Pingmoss: Fine. notice deadline in 197 days. Renews 2027-06-01. Auto-renew on.</title><rect x="126" y="518.0" width="714" height="22" fill="transparent"/><text x="120" y="533.0" text-anchor="end" font-size="13" fill="var(--ink)">Pingmoss</text><line x1="723.6" x2="802.0" y1="529.0" y2="529.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="802.0" x2="802.0" y1="525.0" y2="533.0" stroke="var(--ink2)" stroke-width="2"/><rect x="718.6" y="524.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Learnbarn: Fine. renewal date in 210 days. Renews 2027-05-15. Auto-renew off.</title><rect x="126" y="540.0" width="714" height="22" fill="transparent"/><text x="120" y="555.0" text-anchor="end" font-size="13" fill="var(--ink)">Learnbarn</text><line x1="757.6" x2="757.6" y1="551.0" y2="551.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="757.6" x2="757.6" y1="547.0" y2="555.0" stroke="var(--ink2)" stroke-width="2"/><rect x="752.6" y="546.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><g><title>Roomkite: Fine. renewal date in 257 days. Renews 2027-07-01. Auto-renew off.</title><rect x="126" y="562.0" width="714" height="22" fill="transparent"/><text x="120" y="577.0" text-anchor="end" font-size="13" fill="var(--ink)">Roomkite</text><line x1="836.0" x2="836.0" y1="573.0" y2="573.0" stroke="var(--axis)" stroke-width="2" stroke-linecap="round"/><line x1="836.0" x2="836.0" y1="569.0" y2="577.0" stroke="var(--ink2)" stroke-width="2"/><rect x="831.0" y="568.0" width="10" height="10" fill="var(--neutral)" stroke="var(--surface)" stroke-width="2"/></g><text x="130" y="606" font-size="12" fill="var(--ink2)">Marker: notice deadline (renewal date if no auto-renew). Line: time until renewal. Tick: renewal date.</text></svg></div><details><summary>Table view</summary><div class='scroll'><table><thead><tr><th>Vendor</th><th>Notice deadline</th><th>Days</th><th>Renewal</th><th>Status</th><th>Auto-renew</th></tr></thead><tbody><tr><td>Boardwick</td><td class='num'>2026-09-28</td><td class='num'>-19</td><td class='num'>2026-11-12</td><td>Window closed</td><td>on</td></tr><tr><td>Taskwave</td><td class='num'>2026-10-21</td><td class='num'>4</td><td class='num'>2026-12-20</td><td>Act now</td><td>on</td></tr><tr><td>Meetly</td><td class='num'>2026-10-31</td><td class='num'>14</td><td class='num'>2026-11-30</td><td>Act now</td><td>on</td></tr><tr><td>Ledgerleaf</td><td class='num'>2026-12-02</td><td class='num'>46</td><td class='num'>2027-01-31</td><td>Upcoming</td><td>on</td></tr><tr><td>Chatharbor</td><td class='num'>2026-12-06</td><td class='num'>50</td><td class='num'>2027-01-20</td><td>Upcoming</td><td>on</td></tr><tr><td>Signalforge</td><td class='num'>2026-12-07</td><td class='num'>51</td><td class='num'>2027-02-05</td><td>Upcoming</td><td>on</td></tr><tr><td>Cloudpebble</td><td class='num'>2026-12-12</td><td class='num'>56</td><td class='num'>2027-02-10</td><td>Upcoming</td><td>on</td></tr><tr><td>Designmint</td><td class='num'>2027-01-06</td><td class='num'>81</td><td class='num'>2027-02-20</td><td>Upcoming</td><td>on</td></tr><tr><td>Hirestack</td><td class='num'>2026-12-09</td><td class='num'>53</td><td class='num'>2027-01-08</td><td>Upcoming</td><td>off</td></tr><tr><td>Planhive</td><td class='num'>2027-01-29</td><td class='num'>104</td><td class='num'>2027-03-15</td><td>Fine</td><td>on</td></tr><tr><td>Docuvane</td><td class='num'>2027-01-30</td><td class='num'>105</td><td class='num'>2027-03-01</td><td>Fine</td><td>on</td></tr><tr><td>Mailorbit</td><td class='num'>2027-01-02</td><td class='num'>77</td><td class='num'>2027-02-01</td><td>Fine</td><td>off</td></tr><tr><td>Quillboard</td><td class='num'>2027-02-03</td><td class='num'>109</td><td class='num'>2027-03-20</td><td>Fine</td><td>on</td></tr><tr><td>Securenook</td><td class='num'>2027-02-03</td><td class='num'>109</td><td class='num'>2027-03-05</td><td>Fine</td><td>on</td></tr><tr><td>Formkiln</td><td class='num'>2027-03-01</td><td class='num'>135</td><td class='num'>2027-03-31</td><td>Fine</td><td>on</td></tr><tr><td>Payloom</td><td class='num'>2027-03-01</td><td class='num'>135</td><td class='num'>2027-04-30</td><td>Fine</td><td>on</td></tr><tr><td>Codepillar</td><td class='num'>2027-03-11</td><td class='num'>145</td><td class='num'>2027-04-10</td><td>Fine</td><td>on</td></tr><tr><td>Voxdesk</td><td class='num'>2027-03-11</td><td class='num'>145</td><td class='num'>2027-05-10</td><td>Fine</td><td>on</td></tr><tr><td>Calendrift</td><td class='num'>2027-03-23</td><td class='num'>157</td><td class='num'>2027-04-22</td><td>Fine</td><td>on</td></tr><tr><td>Datanest</td><td class='num'>2027-04-01</td><td class='num'>166</td><td class='num'>2027-06-30</td><td>Fine</td><td>on</td></tr><tr><td>Insightpine</td><td class='num'>2027-04-16</td><td class='num'>181</td><td class='num'>2027-06-15</td><td>Fine</td><td>on</td></tr><tr><td>Huddlefox</td><td class='num'>2027-04-01</td><td class='num'>166</td><td class='num'>2027-05-01</td><td>Fine</td><td>off</td></tr><tr><td>Pingmoss</td><td class='num'>2027-05-02</td><td class='num'>197</td><td class='num'>2027-06-01</td><td>Fine</td><td>on</td></tr><tr><td>Learnbarn</td><td class='num'>2027-04-15</td><td class='num'>180</td><td class='num'>2027-05-15</td><td>Fine</td><td>off</td></tr><tr><td>Roomkite</td><td class='num'>2027-06-01</td><td class='num'>227</td><td class='num'>2027-07-01</td><td>Fine</td><td>off</td></tr></tbody></table></div></details></section><section class="card"><h2>Where the money is</h2><p class="sub">Top 10 by priority score. Each bar is a range, never one number.</p><div class="legend"><span><i class="key" style="background:var(--series)"></i>Low case</span><span><i class="key" style="background:var(--series-soft)"></i>Added in the high case</span></div><div class="row" title="Cloudpebble: $13,320 to $26,640 a year. notice deadline in 56 days; auto-renew with no approved exception; 46% of seats in use"><div class="name">Cloudpebble</div><div class="track"><div class="seg" style="left:0;width:100.0%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(50.0% - 2px);background:var(--series)"></div></div><div class="val">$13,320 to $26,640</div></div><div class="row" title="Taskwave: $6,150 to $12,300 a year. notice deadline in 4 days; auto-renew with no approved exception; overlaps with a cheaper tool"><div class="name">Taskwave</div><div class="track"><div class="seg" style="left:0;width:46.2%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(23.1% - 2px);background:var(--series)"></div></div><div class="val">$6,150 to $12,300</div></div><div class="row" title="Meetly: $3,180 to $6,360 a year. notice deadline in 14 days; auto-renew with no approved exception; 65% of seats in use"><div class="name">Meetly</div><div class="track"><div class="seg" style="left:0;width:23.9%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(11.9% - 2px);background:var(--series)"></div></div><div class="val">$3,180 to $6,360</div></div><div class="row" title="Boardwick: $2,700 to $5,400 a year. notice deadline passed 19 days ago, rolls over on 2026-11-12; auto-renew with no approved exception; overlaps with a cheaper tool"><div class="name">Boardwick</div><div class="track"><div class="seg" style="left:0;width:20.3%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(10.1% - 2px);background:var(--series)"></div></div><div class="val">$2,700 to $5,400</div></div><div class="row" title="Designmint: $3,795 to $7,590 a year. notice deadline in 81 days; auto-renew with no approved exception; 55% of seats in use"><div class="name">Designmint</div><div class="track"><div class="seg" style="left:0;width:28.5%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(14.2% - 2px);background:var(--series)"></div></div><div class="val">$3,795 to $7,590</div></div><div class="row" title="Hirestack: $4,200 to $8,400 a year. renews in 83 days, no auto-renew; 52% of seats in use"><div class="name">Hirestack</div><div class="track"><div class="seg" style="left:0;width:31.5%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(15.8% - 2px);background:var(--series)"></div></div><div class="val">$4,200 to $8,400</div></div><div class="row" title="Planhive: $5,985 to $11,970 a year. notice deadline in 104 days; auto-renew with no approved exception; 56% of seats in use"><div class="name">Planhive</div><div class="track"><div class="seg" style="left:0;width:44.9%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(22.5% - 2px);background:var(--series)"></div></div><div class="val">$5,985 to $11,970</div></div><div class="row" title="Insightpine: $4,400 to $8,800 a year. notice deadline in 181 days; auto-renew with no approved exception; 69% of seats in use"><div class="name">Insightpine</div><div class="track"><div class="seg" style="left:0;width:33.0%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(16.5% - 2px);background:var(--series)"></div></div><div class="val">$4,400 to $8,800</div></div><div class="row" title="Chatharbor: $1,140 to $2,280 a year. notice deadline in 50 days; auto-renew with no approved exception; 85% of seats in use"><div class="name">Chatharbor</div><div class="track"><div class="seg" style="left:0;width:8.6%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(4.3% - 2px);background:var(--series)"></div></div><div class="val">$1,140 to $2,280</div></div><div class="row" title="Voxdesk: $1,980 to $3,960 a year. notice deadline in 145 days; auto-renew with no approved exception; 80% of seats in use"><div class="name">Voxdesk</div><div class="track"><div class="seg" style="left:0;width:14.9%;background:var(--series-soft)"></div><div class="seg" style="left:0;width:calc(7.4% - 2px);background:var(--series)"></div></div><div class="val">$1,980 to $3,960</div></div></section><section class="card"><h2>Seats we pay for but do not use</h2><p class="sub">Share of purchased seats that were active in the last 90 days, lowest first.</p><div class="legend"><span><i class="key" style="background:var(--series)"></i>Seats in use</span><span><i class="key" style="background:var(--serious)"></i>Under the 60% line</span><span>Dashed line: 60% use</span></div><div class="row" title="Cloudpebble: 138 of 300 seats active, 46%."><div class="name">Cloudpebble</div><div class="track"><div class="seg" style="left:0;width:46.0%;background:var(--serious)"></div><div class="thr" style="left:60%"></div></div><div class="val">46% · 138 of 300 (below 60%)</div></div><div class="row" title="Hirestack: 21 of 40 seats active, 52%."><div class="name">Hirestack</div><div class="track"><div class="seg" style="left:0;width:52.5%;background:var(--serious)"></div><div class="thr" style="left:60%"></div></div><div class="val">52% · 21 of 40 (below 60%)</div></div><div class="row" title="Designmint: 33 of 60 seats active, 55%."><div class="name">Designmint</div><div class="track"><div class="seg" style="left:0;width:55.0%;background:var(--serious)"></div><div class="thr" style="left:60%"></div></div><div class="val">55% · 33 of 60 (below 60%)</div></div><div class="row" title="Planhive: 84 of 150 seats active, 56%."><div class="name">Planhive</div><div class="track"><div class="seg" style="left:0;width:56.0%;background:var(--serious)"></div><div class="thr" style="left:60%"></div></div><div class="val">56% · 84 of 150 (below 60%)</div></div><div class="row" title="Meetly: 124 of 190 seats active, 65%."><div class="name">Meetly</div><div class="track"><div class="seg" style="left:0;width:65.3%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">65% · 124 of 190</div></div><div class="row" title="Learnbarn: 330 of 500 seats active, 66%."><div class="name">Learnbarn</div><div class="track"><div class="seg" style="left:0;width:66.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">66% · 330 of 500</div></div><div class="row" title="Insightpine: 66 of 95 seats active, 69%."><div class="name">Insightpine</div><div class="track"><div class="seg" style="left:0;width:69.5%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">69% · 66 of 95</div></div><div class="row" title="Calendrift: 45 of 60 seats active, 75%."><div class="name">Calendrift</div><div class="track"><div class="seg" style="left:0;width:75.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">75% · 45 of 60</div></div><div class="row" title="Formkiln: 9 of 12 seats active, 75%."><div class="name">Formkiln</div><div class="track"><div class="seg" style="left:0;width:75.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">75% · 9 of 12</div></div><div class="row" title="Docuvane: 19 of 25 seats active, 76%."><div class="name">Docuvane</div><div class="track"><div class="seg" style="left:0;width:76.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">76% · 19 of 25</div></div><div class="row" title="Datanest: 31 of 40 seats active, 78%."><div class="name">Datanest</div><div class="track"><div class="seg" style="left:0;width:77.5%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">78% · 31 of 40</div></div><div class="row" title="Huddlefox: 78 of 100 seats active, 78%."><div class="name">Huddlefox</div><div class="track"><div class="seg" style="left:0;width:78.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">78% · 78 of 100</div></div><div class="row" title="Ledgerleaf: 12 of 15 seats active, 80%."><div class="name">Ledgerleaf</div><div class="track"><div class="seg" style="left:0;width:80.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">80% · 12 of 15</div></div><div class="row" title="Mailorbit: 8 of 10 seats active, 80%."><div class="name">Mailorbit</div><div class="track"><div class="seg" style="left:0;width:80.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">80% · 8 of 10</div></div><div class="row" title="Voxdesk: 120 of 150 seats active, 80%."><div class="name">Voxdesk</div><div class="track"><div class="seg" style="left:0;width:80.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">80% · 120 of 150</div></div><div class="row" title="Boardwick: 100 of 120 seats active, 83%."><div class="name">Boardwick</div><div class="track"><div class="seg" style="left:0;width:83.3%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">83% · 100 of 120</div></div><div class="row" title="Quillboard: 150 of 180 seats active, 83%."><div class="name">Quillboard</div><div class="track"><div class="seg" style="left:0;width:83.3%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">83% · 150 of 180</div></div><div class="row" title="Roomkite: 42 of 50 seats active, 84%."><div class="name">Roomkite</div><div class="track"><div class="seg" style="left:0;width:84.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">84% · 42 of 50</div></div><div class="row" title="Chatharbor: 255 of 300 seats active, 85%."><div class="name">Chatharbor</div><div class="track"><div class="seg" style="left:0;width:85.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">85% · 255 of 300</div></div><div class="row" title="Taskwave: 170 of 200 seats active, 85%."><div class="name">Taskwave</div><div class="track"><div class="seg" style="left:0;width:85.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">85% · 170 of 200</div></div><div class="row" title="Payloom: 112 of 130 seats active, 86%."><div class="name">Payloom</div><div class="track"><div class="seg" style="left:0;width:86.2%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">86% · 112 of 130</div></div><div class="row" title="Signalforge: 61 of 70 seats active, 87%."><div class="name">Signalforge</div><div class="track"><div class="seg" style="left:0;width:87.1%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">87% · 61 of 70</div></div><div class="row" title="Pingmoss: 7 of 8 seats active, 88%."><div class="name">Pingmoss</div><div class="track"><div class="seg" style="left:0;width:87.5%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">88% · 7 of 8</div></div><div class="row" title="Securenook: 250 of 280 seats active, 89%."><div class="name">Securenook</div><div class="track"><div class="seg" style="left:0;width:89.3%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">89% · 250 of 280</div></div><div class="row" title="Codepillar: 81 of 90 seats active, 90%."><div class="name">Codepillar</div><div class="track"><div class="seg" style="left:0;width:90.0%;background:var(--series)"></div><div class="thr" style="left:60%"></div></div><div class="val">90% · 81 of 90</div></div></section><section class="card"><h2>Spend by owner team</h2><p class="sub">Annual cost by the team that owns the contract. Also how many decisions fall due in the next 90 days.</p><div class="row" title="Data: $134,000 a year."><div class="name">Data</div><div class="track"><div class="seg" style="left:0;width:100.0%;background:var(--series)"></div></div><div class="val">$134,000</div></div><div class="row" title="IT: $121,200 a year · 3 decisions due."><div class="name">IT</div><div class="track"><div class="seg" style="left:0;width:90.4%;background:var(--series)"></div></div><div class="val">$121,200 · 3 decisions due</div></div><div class="row" title="Engineering: $82,200 a year · 1 decision due."><div class="name">Engineering</div><div class="track"><div class="seg" style="left:0;width:61.3%;background:var(--series)"></div></div><div class="val">$82,200 · 1 decision due</div></div><div class="row" title="Operations: $72,900 a year · 1 decision due."><div class="name">Operations</div><div class="track"><div class="seg" style="left:0;width:54.4%;background:var(--series)"></div></div><div class="val">$72,900 · 1 decision due</div></div><div class="row" title="Support: $42,000 a year · 1 decision due."><div class="name">Support</div><div class="track"><div class="seg" style="left:0;width:31.3%;background:var(--series)"></div></div><div class="val">$42,000 · 1 decision due</div></div><div class="row" title="Marketing: $36,600 a year · 1 decision due."><div class="name">Marketing</div><div class="track"><div class="seg" style="left:0;width:27.3%;background:var(--series)"></div></div><div class="val">$36,600 · 1 decision due</div></div><div class="row" title="Finance: $34,200 a year."><div class="name">Finance</div><div class="track"><div class="seg" style="left:0;width:25.5%;background:var(--series)"></div></div><div class="val">$34,200</div></div><div class="row" title="People: $32,000 a year · 1 decision due."><div class="name">People</div><div class="track"><div class="seg" style="left:0;width:23.9%;background:var(--series)"></div></div><div class="val">$32,000 · 1 decision due</div></div><div class="row" title="Product: $31,500 a year."><div class="name">Product</div><div class="track"><div class="seg" style="left:0;width:23.5%;background:var(--series)"></div></div><div class="val">$31,500</div></div><div class="row" title="Sales: $17,600 a year."><div class="name">Sales</div><div class="track"><div class="seg" style="left:0;width:13.1%;background:var(--series)"></div></div><div class="val">$17,600</div></div><div class="row" title="Legal: $9,600 a year."><div class="name">Legal</div><div class="track"><div class="seg" style="left:0;width:7.2%;background:var(--series)"></div></div><div class="val">$9,600</div></div><div class="row" title="Facilities: $6,000 a year."><div class="name">Facilities</div><div class="track"><div class="seg" style="left:0;width:4.5%;background:var(--series)"></div></div><div class="val">$6,000</div></div></section><footer>Estimates, not quotes. Not legal or financial advice. Check every figure against the contract. Generated by spend-radar.</footer></main></body></html>