The Hub
{{ mcDashLabel }}
Internal access

Sign in to The Hub

{{ mcStaffOnlyLine }}

{{ loginNoticeText }}
{{ authErr }}
{{ loginModeNote }}
{{ demoToastMeta }}
{{ demoToastTitle }}
No matches.
↵ to selectEsc to close
The Hub
{{ mcDashLabel }}
{{ mcStampLine }}
{{ hubBuild }}
{{ ow.icon }}
{{ ow.short }}
{{ ow.tempLabel }} {{ ow.condition }}
Acting as
{{ actingName }}
{{ actingRole }}
Market center
Switching, and reloading so nothing from the last office is left on screen…
{{ mcErr }}
{{ chatHeadTitle }}
{{ chatHeadSub }}
{{ chatErr }}
{{ chatHereCount }}
Your groups
On the record
These are attached to a file, not to a person. Everyone with access to that file can read them.
A group is only listed for the people in it. Presence comes from live sessions. There is no way to appear offline.
{{ chatEmptyNote }}
{{ cm.text }}
{{ cf.alt }} {{ cf.secsFmt }} 📄 Open
{{ cf.name }} {{ cf.meta }}
{{ cm.refIcon }} {{ cm.refKindLabel }}
{{ cm.refLabel }}
{{ cm.text }}
{{ cm.meta }} {{ cm.toLine }} {{ cm.seenTxt }} ☼ sent to their bell ✓ Task created · {{ cm.taskWho }}
Ask directly
{{ chatFileErr }}
Going with this message
{{ cq.alt }}
▶
📄
{{ cq.name }}
{{ chatUploadNote }}
{{ chatSendNote }}
🔒
Read only. You are not a member of this conversation, so there is nothing to type into.
Needs attention
{{ nt.title }}
{{ nt.meta }}
{{ nt.when }}
{{ jumpNoneNote }}
↑↓ move↵ openesc close
{{ leadKicker }}

{{ leadTitle }}

{{ leadDateLine }}

{{ leadBlurb }}

{{ leadReadOnlyNote }}
{{ leadSyncHead }}
{{ leadSyncBody }}
Technical detail: {{ leadSyncErr }}
{{ teamStamp }}
Desk notes
🌀
{{ d.text }}
NWS live {{ d.expandIcon }}
{{ d.fullAddress }} · Source: National Weather Service, live at page load
{{ d.kind }}
NEW
{{ d.text }}
{{ d.meta }}

Customize Home

Show or hide widgets, and reorder them top to bottom.
{{ cw.label }}
{{ calMismatchNote }}
{{ sidesMeta }}
{{ vitalsNote }}
How this number is made
{{ figTitle }} · {{ figValue }}
{{ figSource }}
{{ fs.label }} {{ fs.value }}
{{ fr.text }}
Reading the rows behind it…
{{ figErr }}
{{ figRowsHead }}
{{ fx.no }} {{ fx.name }} {{ fx.value }} {{ fx.note }}
Search
No matches.
Today's schedule
Nothing due today.
Team activity
Nothing logged yet.
{{ hf.title }} — {{ hf.text }}
{{ hf.meta }}
Recently viewed
Nothing opened yet this session.
Roster health
{{ hlTotal }}
agents on the roster
{{ hlTotalMom }} {{ hlTotalYoy }}
Click any box to open the roster filtered to those agents. Month-over-month and year-over-year are placeholders until a second dated roster import is loaded under Data imports.
How they work
Production
The mighty middle
{{ hlMiddle }}
{{ hlMiddlePct }}
{{ hlMidMom }} {{ hlMidYoy }}
{{ hlMiddleNote }}
Company dollar
{{ coThisMonth }}
{{ coDelta }}
{{ coMonthNote }}
Year to date
{{ coYtd }}
{{ coYtdNote }}
Monthly average
{{ coAvg }}
{{ coAvgNote }}
Best month
{{ coBest }}
{{ coBestNote }}
From the Coaching Program
{{ coCoach }}
{{ coCoachPct }}
{{ coCoachNote }}
{{ cm2.value }}
{{ cm2.share }}
{{ cm2.label }}
{{ coStripNote }}
Our GPS & 411
{{ gpsMonth }}
{{ gpsOneThing }}
{{ gpsPct }}
{{ gpsMeta }}
VA team, Philippines
⚠ Alert active
{{ vaAlertText }}
{{ vaAlertMeta }}
{{ vw.icon }}
{{ vw.short }} · {{ vw.tempLabel }} {{ vw.condition }}
The team
Drop a headshot on anyone
{{ p.photoAlt }}
👑 🥔 {{ p.pctLabel }}
{{ p.name }}
{{ p.role }}
{{ p.progNote }}
Still working?

{{ idleWho }}, are you still there?

No activity for {{ idleWindowLabel }}. Protected areas, legal, cap, property management, imports, staff admin, will close in {{ idleGraceLabel }} and you will be moved back to Home.

{{ idleCountdown }}
Open tabs stay available either way. Only protected areas close.
{{ idleNoticeText }}

{{ navGateTitle }}

{{ navGateBody }}

{{ navGateWriteNote }}
🔒

{{ leadLockTitle }}

{{ leadLockNote }}

{{ leadIdleNote }}
No password will open this
{{ leadDeniedNote }}
The one thing · {{ gpsYear }}
{{ leadOneThing }}
The one thing that, by doing it, makes everything else easier or unnecessary.
411 progress
{{ leadGpsPct }}
{{ leadGpsMeta }}
{{ gpsPaceNote }}
{{ gpsSplit }}
{{ gpsMsg }}
Add a priority
{{ gg.label }}

{{ p.name }}

{{ p.owner }}
Objective. {{ p.objective }}
Strategy. {{ p.strategy }}
Objective, strategy, owner
No tasks drafted from this yet, so it counts for nothing on the bar above.
{{ t.title }}
{{ t.statusLine }}
{{ t.measureLine }}
{{ d.tier }}

{{ d.name }}

Lead · {{ d.lead }}
{{ m.name }}
{{ m.role }}
Reports to {{ d.reportsTo }} · {{ d.scope }}
{{ loadingTitle }}
{{ loadingLine }}
{{ loadingHint }}
Where this comes from

{{ noteTitle }}

{{ nr.k }}
{{ nr.v }}
{{ capSharedNote }}
⚠
NOT SAVING TO THE DATABASE
{{ capCloudErr }}
Checked against the books
{{ btHead }}
{{ btDetail }}
{{ bt.label }}
{{ bt.value }}
The climb · how we sort agents
{{ clNote }}
{{ cl.name }} {{ cl.pct }}
{{ cl.oneLiner }}
{{ cl.kw }}
{{ cl.count }}
Winterizing · where cap years start

{{ wzHead }}

{{ wzNote }}
Anniversary month Agents Tier mix (KW) Co$ last 12 mo Per agent Reading
{{ wz.label }} {{ wz.agents }} {{ wz.mix }} {{ wz.ttm }} {{ wz.per }} {{ wz.reading }}
What is still coming

{{ ppHead }}

{{ ppNote }}
{{ pt.big }}
{{ pt.note }}
{{ ppOverNote }}
What each team brings in

{{ ktHead }}

{{ ktNote }}
Team Cap Leader, 12 mo Members, 12 mo Team total All months on file
{{ kt.team }}
{{ kt.sub }}
{{ kt.cap }} {{ kt.leader }}
{{ kt.members }}
{{ kt.membersNote }}
{{ kt.total }}
{{ kt.allTime }}
{{ kt.allSplit }}
Needs your confirmation

{{ tcHead }}

{{ tcNote }}
Team Recorded as Caps on the board Actually paid us, last 12 mo What contradicts it
{{ tc.team }}
{{ tc.sub }}
{{ tc.mode }} {{ tc.caps }}
{{ tc.paid }}
{{ tc.split }}
{{ tc.concern }}
Contributing agents — {{ caMonthLabel }}

Who put company dollar on the board in {{ caMonthLabel }}

{{ caLead }}
Reading…
What the database said
{{ caErr }}
Banked, and where the cap year is heading — {{ caCapPeriodLabel }}
No comparison
{{ caNote }}
{{ caListTitle }}{{ caListSub }}
{{ cr.tail }} {{ cr.co }} {{ cr.was }} {{ cr.change }}
{{ caListMore }}
Producing less than last year

{{ slHead }}

{{ slNote }}
{{ sv.big }}
{{ sv.note }}
Agent {{ slPriorLabel }} {{ slThisLabel }} Change Reading Row you set
{{ sr.sub }}
{{ sr.prior }} {{ sr.now }}
{{ sr.change }}
{{ sr.pct }}
{{ sr.reading }} {{ sr.bucket }}
The hole departures left

{{ dgHead }}

{{ dgNote }}
{{ dm.label }}
{{ dm.gone }}
{{ dm.pct }}
Cap report {{ cvCapPeriod }}

Where every agent stands on their own cap

{{ cvLead }}
What each window is built from
{{ cc.measure }} · {{ cc.count }}
{{ cc.window }}
{{ cc.note }}
What the database said
{{ cvErr }}
Variance to resolve
{{ cvUnsettledNote }}
{{ cvShowing }}
What the colors meanRed: a figure is missing, or the two reports disagree. Data to chase.Amber: the data is fine. This one is worth your attention.Green: capped, or the two reports agree.Gray: not applicable, or nothing to say.
build {{ cvBuild }}
{{ cvRosterNote }}
Agent Cap year Cap Banked Per cap report Per monthly reports Difference KW tier Prior cap yr YTD 2026 Last 12 mo CY 2025 Resets Last close Reading
{{ cw.sub }}
{{ cw.capYear }}
{{ cw.monthsLine }}
{{ cw.cap }}
{{ cw.banked }}
{{ cw.bankedWhy }}
{{ cw.fromCapReport }} {{ cw.fromMonthlies }} {{ cw.gap }}
{{ cw.kwTier }}
{{ cw.kwCapped }}
{{ cw.priorCo }}
{{ cw.priorWindow }}
{{ cw.ytdCo }}
{{ cw.ytdVol }}
{{ cw.ttmCo }}
{{ cw.ttmSub }}
{{ cw.cy25Co }}
{{ cw.cy25Sub }}
{{ cw.resetsOn }}
{{ cw.resetIn }}
{{ cw.lastClose }}
{{ cw.lastCloseSub }}
{{ cw.likelihood }}
{{ cw.bankedSource }}
Where each column comes from
{{ pv.label }}
{{ pv.origin }}
{{ pv.how }}
{{ cvMore }}
{{ t.k }}
{{ t.v }}
{{ t.n }}
Banked, carried and at risk vs capper goal
{{ cbConfirmedEquiv }}
banked of {{ cbGoal }} capper goal
Floor
{{ cbFloor }}
Likely
{{ cbLikely }}
Stretch
{{ cbStretch }}
{{ cbBasisLine }}
Four quarter cappers make one capper: full 1, half 0.5, quarter 0.25. Contributors pay company dollar without reaching a cap, so they count 0 toward this goal. The goal itself comes {{ cbGoalBasis }} — set the annual number and the cap amount in Tweaks.
Residual company dollar
{{ cbResidualCo }}
{{ cbResidualCount }} departed, still closing
{{ cbResidualLine }}
{{ cbResidualMore }}
Where this board is inferring, not knowing
{{ cbPeriodNote }}
{{ cbQualityNote }}
{{ cbQualityMore }}
Cap status, ours, and KWRI’s for reference

The cap report, as loaded

{{ clvSummary }}
Sorted by company dollar. Caps run from $2,250 to $60,000, so a percentage is not comparable between two agents. The dollars rank, the badge celebrates.
Reading…
What the database said
{{ clvErr }}
{{ clvEmptyNote }}
Nobody on this period’s report matches that.
Associate
Anniversary
Cap
Company dollar
Progress
Our status
KWRI (reference)
{{ cr.name }}
{{ cr.idLine }}
{{ fl.label }}
{{ cr.anniv }}
{{ cr.cap }}
{{ cr.co }}
{{ cr.pctLabel }}{{ cr.climb }}
—
Saving… {{ cr.setLine }}
{{ cr.archiveNote }} Archiving… Recording… {{ cr.err }}
{{ cr.kwri }}
{{ clvFiltered }}
{{ clvDepartMsg }} totals updating…
A row marked with a gray edge is one where our status and KWRI’s do not agree, information, not an error. KWRI’s label is their method, computed their way; it is never copied into ours.
The status you set here decides the row an agent is counted in and the badge in their anniversary month. It does not change any money: company dollar stays exactly as the reports state it, and every total still adds to it.
{{ clvSource }}
build {{ clvBuild }}

The year at a glance

Banked On pace Carried At risk Goal
{{ ch.abbr }}
{{ ch.equiv }}/{{ ch.goal }}
{{ ch.gapLabel }}
{{ ch.co }}
{{ cc.band }} {{ cc.structure }}
{{ cc.row }} {{ cc.money }}
{{ cc.flag }}

Company dollar by anniversary month

{{ cbYearIn }} in this cap year · {{ cbYearToCome }} still to come at the rows counted · {{ cbRollNote }}
Earned = full 1.0 · half 0.5 · quarter 0.25
{{ m.abbr }}
{{ m.equivLabel }}
earned / goal
{{ m.splitLabel }}
{{ m.coIn }}
in · {{ m.coToCome }} to come
{{ m.coDelta }}
{{ tier.label }} {{ tier.note }}
{{ tier.coTotal }} {{ tier.count }}
Goal
{{ m.goal }}
{{ m.needLabel }}
{{ m.mix }}
Weakest months
{{ w.abbr }}
{{ w.flag }}
{{ w.mix }}
{{ w.gap }}
Monthly production import
Drop the month's production and cap-anniversary export here and the board recalculates. Company dollar, tiers, and every month's gap.
{{ cbImportName }}
{{ cbImportMeta }}
{{ dataLockLabel }}
{{ dataUnlockMsg }}
Uploading a report overwrites production figures for every agent, so it is limited to people with upload rights. There is no separate passcode. Your sign-in decides this.
{{ cbImportNote }}
What an import overwrites
{{ r.mark }} {{ r.text }}
{{ cbSourceLine }} Anniversary months are placeholders except where a leader has set them on the agent record.
{{ cbLedgerNote }}
The hand sheet, checked against the report
{{ cbSheetLine }}
{{ cbSheetCaveat }}
{{ sr.line }}
Not counted on this board
{{ cbNoCapDataNote }}
Off the cap board, still on the roster. A welfare check or a coaching call, not a cap question.
Does this board account for the office’s company dollar?
{{ cbReconFilterNote }}
Agents on this board
{{ cbReconAgents }}
Transmittal, this year
{{ cbReconOffice }}
Difference
{{ cbReconDiff }}
{{ cbReconNote }}
{{ cbReconBasis }}
MREA leads and company dollar past cap
{{ cbMreaNote }}
Team members and tiers
{{ cbTeamTierNote }}
Cap report. The source of record
Reading… {{ capRepDone }} {{ capRepError }}
{{ capRepSkippedLine }}
Reports → Associate → type “Cap Management” into the Associate search box. It is a hidden report — it does not appear in the Associate menu list, so search for it rather than concluding it is missing. Export as CSV. One row per associate: negotiated CO$ cap, company dollar anniversary, and company dollar paid this cap year and last. Cap amounts, anniversaries and cap-year figures all come from here. Nothing on this board estimates them.
{{ capStandLine }}
{{ cs.k }}
{{ cs.v }}
{{ cs.n }}
{{ ck.label }} · {{ ck.count }}
{{ capRosterOnly }}
{{ capUnmatched }}
Does every dollar land?
{{ ft.k }}
{{ ft.v }}
{{ ft.n }}
{{ capFootLine }}
Report rows to place · {{ capUnclaimedCount }}
If it is one of ours under a different spelling, match them in “Names to resolve” above, that keeps their figures. Otherwise say why the board should not carry them; the money stays on the record either way.
{{ uc.label }} {{ uc.detail }}
{{ capUnclaimedMore }}
{{ capUnclaimedOnBoard }}
Held back · {{ capResolvedCount }}
{{ capResolvedWarn }}
{{ rr.label }} {{ rr.line }}
{{ capResolvedMore }}
Names to resolve · {{ capQueueCount }}
{{ capUnclaimedCount }} report rows unclaimed
Suggestions are surname matches only and are never applied on their own. Surname matching would hand Stephanie Adamany Jerry’s cap. Confirm one and that agent matches by KWUID from then on, whatever Command calls them.
{{ capPinnedLine }}
{{ q.name }}
No surname match on the report at all. Staff on the roster, or genuinely absent:
{{ nq }}
Rainmakers to mark · {{ capRainCount }}
A half cap is half the rainmaker’s cap, so until a team’s rainmaker is designated on their own agent record, these caps cannot be computed and nothing here can be checked. This is a roster edit, not a cap approval. Approving it would hide the gap instead of closing it.
Findings · {{ capFindCount }}
{{ capFindLine }}
Facts the report carries that are worth knowing. Nothing here is asking for a decision.
{{ fv.label }} {{ fv.detail }}
Explained on the record
{{ nt.name }} {{ nt.label }} {{ nt.detail }}
Caps to confirm · {{ capVarOpenCount }}
{{ capVarDoneCount }} already decided
The system computes what each cap should be. A team member at half their rainmaker’s cap, everyone else at the office standard, and shows you every case where the report disagrees. Your decision is kept apart from the import, so a re-import can never quietly undo it.
{{ v.name }} {{ v.label }} {{ v.capNow }}
{{ v.detail }}
{{ v.staleLine }}
{{ d.name }} {{ d.decidedLine }} ALSO FIX IN COMMAND
Agent trend reports loaded: {{ trendAgentCount }}
Select as many CSVs as you like, one file per agent is all Command gives. {{ trendUploadNote }} {{ trendUploadDone }} {{ trendUploadError }}
Command → Multi-Year Trends → Download, with Format: CSV and Data: Multi-Year Trends Actuals. Per agent, monthly after franchise transmittal. Sharpens the pace estimate below using each agent’s own seasonal history instead of a straight-line guess. Every figure is checked against the report’s own Total column before anything is saved. The PDF of the same report loses the table structure and will be refused.
Not saved
{{ trendQuotaWarn }}
This batch
Reading {{ trendBatchProgress }}…
{{ trendBatchHeadline }}
{{ br.fileName }} {{ br.line }}
With company dollar
{{ trendCovered }}
Still to import
{{ trendMissingCount }}
{{ trendMissingNote }}
{{ mn }}
{{ trendMissingMore }}
{{ trendStoreLine }}
Production history on file
{{ tl.detail }}
Start the multi-year import from scratch
Remove {{ trendWipeSummary }}?
This clears the imported multi-year production history so you can load it again from clean CSV exports. It does not touch the roster, cap standing, anniversary months, team roles, MREA flags, tags, 1:1 conversations or retention records. Those are people’s own records, not import data.
A line goes in the audit log naming every agent whose figures were removed.
Recent updates
{{ al.when }} · {{ al.by }} — {{ al.text }}
Missing production data, address before relying on this board
— {{ md.month }} · cap {{ md.cap }} · no amount paid reported on the sheet

Closing the gap

{{ cbClosersLine }}
{{ cl.abbr }}
{{ cl.gap }}
{{ cl.mix }}
{{ cn.line }}
{{ cl.empty }}
{{ cl.blockedNote }}

Duplicates collapsed

{{ cbDupesLine }}
{{ du.note }}

The cap rules, tested

{{ cbChecksLine }}
{{ cbChecksCount }}
{{ cbLadderLine }}
{{ cbFloorLine }}
{{ ck.mark }}
{{ ck.rule }}
{{ ck.kase }}
expects {{ ck.want }} · got {{ ck.got }}

Caps below the loyalty floor

{{ cbBasisLine }}
{{ bs.name }} {{ bs.badge }}
{{ bs.line }}
{{ bs.why }}
{{ bs.meta }}
Why is {{ capBasisName }}'s cap that size?

Offices

{{ cbOfficeNote }}
{{ cbOfficeAssignNote }}
{{ oa.name }}
{{ cbOfficeAssignMore }}

Teams & caps

How this market center accounts for each team. A team cap is one cap for everyone on it; the rainmaker model gives the leader their own cap and puts members on a fraction of it.
A new merge
One cap for all of them: everyone added pays no company dollar of their own, their $0.00 reads as the arrangement working, and they stand as a single entity on the board. A group on their own caps: they stay on the board as individuals, the amount above is each member's own cap, and a $0.00 against one of them is a gap. You can untick anyone later without re-uploading their profile.
Coming off {{ capOutTeam }}
What is {{ capOutName }}'s cap and terms now?
{{ capOutHint }}
{{ ta.name }}
{{ ta.equiv }}
{{ ta.memberCap }}
{{ ta.sharedLine }}
{{ ta.ownNote }}
Add someone to this team
On this cap arrangement, untick to take someone off
Taken off this arrangement, on the board as individuals

Set a row by hand

The board places every agent from cap-equivalent dollars. When you know something the report cannot show, a cap management deal, an MREA carve-out, business booked elsewhere, put them in the right row yourself and say why. The Hub keeps watching the dollars underneath: it flags a call that stops looking likely, and if the cap year ends short it returns them to the row their figures earn.
{{ capRowDraftSays }}
{{ cbRowCallsCount }}
{{ rc.name }} — {{ rc.row }}
{{ rc.state }}
{{ rc.why }}
{{ rc.dollars }}
{{ rc.meta }}
Why should {{ capAppealName }} stay in this row?

Possible shared caps

Two associates who each land short of a cap, whose figures add up to one. Usually a household or partnership capped as a single entity while Command books the payments separately, but only you can say.
{{ pr.names }}
{{ pr.line }}

Caps above the office standard

{{ cbBigCapsLine }}
{{ bc.name }}
{{ bc.line }}

Team caps, one cap for the whole team

{{ tc.name }}
Team cap {{ tc.cap }} {{ tc.equiv }} · {{ tc.paid }} · {{ tc.pct }} · {{ tc.month }}
{{ tc.warn }}
{{ tc.note }}
{{ tm.name }}

Gone quiet, shown, not counted

{{ cbLapsedCount }} agents · {{ cbLapsedEquiv }} equivalents lost
{{ cbLapsedLine }}
{{ lp.name }}
{{ lp.was }} ({{ lp.wasEquiv }}) → {{ lp.now }} · {{ lp.cap }} cap · {{ lp.month }}
Departed, grayed out on the board above
— {{ dp2.note }}
Mark an agent departed
{{ capMarkDepartedMsg }}
For departures with no open new-construction file on record. Those (like escrows or NC contracts still open) are detected automatically from Offboarding.
Gaps in the cap ledger
{{ lgg }}
♛
TMTeam member
MREA
{{ lg.chip }}{{ lg.note }}

{{ rBoardTitle }}

{{ rBoardMeta }}
#
Agent
Production YTD
Cap progress
Cap year
Forecast
{{ a.rank }}
♛ {{ a.monogram }} MREA NOT IN LAST IMPORT
{{ a.sub }}
{{ tg.label }}
{{ a.volume }}
{{ a.unitsLine }}
{{ a.capPct }}
{{ a.capLine }}
{{ a.anniv }}
{{ a.annivMeta }}
{{ a.toCap }}
{{ a.likelihood }} {{ a.moveLabel }}
No agents match this view.
{{ rEmptyNote }}
Cap progress is not estimated. Company dollar, each agent's own cap and their anniversary all come from the Command cap report; units, volume and the last closing come from the Multi-Year Trends CSVs. A figure that has not been imported reads as not loaded rather than as a zero. Nothing here is derived from volume, and no office-standard cap is ever borrowed for an agent who has not been given one. Where the real cap ledger is loaded. Courted potential-to-move comes straight from the export. Load the cap ledger under Data imports to make these exact.

Teams

{{ teamsFoldMeta }}
Add a team, name the rainmaker, give it a logo, then add the people
Add a team
{{ teamMsg }}
The teams could not be read from the database, so this may not be empty.
No teams yet. Type a name above and create one, then name the rainmaker and add the people.
{{ t.logoAlt }}
{{ t.rainmakerLine }}
{{ t.countLine }} · {{ t.teamNo }}
{{ pp.name }} {{ pp.role }}
Nobody on this team yet. Search a name below and add them.
{{ tCountLine }}
Acting as 🔒 {{ actingName }} {{ actingRole }}
{{ permNote }}
{{ tSelCount }} selected Multi-step handoff tasks can't be bulk-selected, open them individually.
Cycle time, created → done, by task type
Grouped by category so quick tasks and inherently long ones aren't averaged together.
Not enough completed history yet.
{{ cr.name }}
{{ cr.avg }} days avg · {{ cr.n }} tasks
Team activity. Everything, most recent first
{{ fi.title }} — {{ fi.text }}
{{ fi.meta }}
Inbox is clear. Nothing waiting on you to triage.
{{ md.title }}
{{ md.project }} · {{ md.due }}
📌 On deck right now
{{ deckNote }}
{{ attnMeta }} {{ attnCollapsedNote }}
{{ attnTitle }}
{{ attnMeta }}
{{ w.rank }}
{{ w.title }}
{{ w.sub }}
{{ w.flag }} →
{{ attnNote }}
Adding opens the task so you can assign several people or build a handoff chain. Click any task title to reopen it.
{{ col.label }}
{{ col.dateLabel }}

{{ leadBoardTitle }}

{{ leadBoardMeta }}
{{ r.tag }} PM High 🕓 Stale {{ r.staleDays }}d
{{ r.meta }}
{{ r.blockersNote }}
{{ r.ccLine }}
{{ av.avText }} 🥔
{{ r.onDeckIni }} 📌 {{ r.onDeckName }} {{ r.onDeckStep }}
{{ r.whoLine }}
{{ r.releasedNote }}
Due
{{ r.due }}
{{ tEmptyNote }}
{{ col.label }}
{{ col.count }}
Positive Potato
{{ potatoWindow }}
{{ potatoIni }}
👑
{{ potatoName }}
{{ potatoSince }}
{{ potatoRightNote }}
Previous weeks
{{ h }}
🚨 Send a bulletin
Above a note. Not a fire.
A bulletin pings everyone's bell, pins itself to the top of the desk in red, and greets anyone who logs in with it until it is cleared.
Active until {{ bullUntilNote }}
Live now: {{ bulletinLine }}
Post a note
Posting as {{ actingName }}
How long does it live?
Comes down after
Comes back every
{{ lifeSummary }}

The desk

{{ noteBoardMeta }}
{{ nd.kind }} Pinned Expired
{{ nd.text }}
{{ nd.byIni }} 🥔
{{ nd.byLine }}
{{ nd.life }}
☑ {{ nd.ackCount }}

Import a report

{{ impRightNote }}
{{ impResultNote }}
📄
{{ impFileName }}
{{ impFileMeta }}
{{ impPdfDocType }} Unsupported {{ impKind }}
{{ impUnsupportedNote }}
Reading the document and pulling out what it can…
{{ impPdfError }}
What it found
{{ pf.label }}
{{ pf.value }}
Read from the document itself. This files the document for the record and changes no figures. New construction contracts are the exception. Those apply on the New Construction tab.
{{ impSummary }}
Columns it found
{{ ic.label }}
What it will change
{{ ie.mark }}
{{ ie.title }}
{{ ie.note }}
Which month is this
{{ impPeriodNote }}
Every column, and what it became
{{ mp.mark }} {{ mp.label }} {{ mp.col }}
{{ impMapUnused }}
{{ impResultNote }}
The report feeds, who sends what, and how
Monthly feeds are all due the 12th — the books close by the 5th and trailing reports sometimes follow, so the 12th is the close plus a week. Every report the Hub runs on, with the exact export settings. Wrong settings produce a file that parses into the wrong answer rather than failing, so the steps are part of the record. Making one a task assigns it, sets the cadence, and carries these steps into the task notes.
{{ feedCount }}
{{ fr.cad }} {{ fr.code }} {{ fr.what }} {{ fr.dueText }} {{ fr.owner }} VARIES BY MARKET CENTER
Report: {{ fr.exact }}
{{ fr.where }}
{{ fr.settings }}
The exact menu label is still missing. Add it so nobody has to guess which report this is.
{{ fr.how }}
Feeds: {{ fr.feeds }}
{{ fr.flag }}
On the task list · {{ fr.taskId }}
{{ it3.name }}
{{ it3.note }}
{{ it3.cols }}

Import history

{{ impHistMeta }}
{{ ih.file }}
{{ ih.meta }}
{{ ih.kind }}
{{ ih.when }}
Nothing imported yet this session.

Manual, no report carries this

These have to be entered by hand. Assign one and it lands on the task board.
{{ impManualMeta }}
{{ im.title }}
{{ im.note }}
{{ im.cadence }}
{{ cs.k }}
{{ cs.v }}
{{ cs.n }}
Company dollar from the Coaching Program
Month by month, as a share of everything the office earned that month. Next Level Program is counted apart.
Share this year
{{ coShareYtd }}
{{ coShareYtdNote }}
{{ cc2.share }}
{{ cc2.value }}
{{ cc2.label }}
{{ coChartNote }}
{{ oc.program }}
{{ oc.closingLabel }}
{{ oc.firstClosing }}
{{ oc.firstClosingNote }}
To graduate
{{ oc.toGraduate }}
{{ oc.toGraduateNote }}
Average time in
{{ oc.avgIn }}
{{ oc.inNote }}
{{ oc.mix }}
Graduated, met the closings they were set
Celebrate them, then ask about Next Level
🎉
{{ gd.meta }}
Add to the program
{{ bk.label }}
{{ coMsg }}
This is our own coaching, run by Shanna and Mark. MAPS is the KW platform and follows the monthly import, so it is not on this list.
The coaching roster could not be read from the database, so this may not be empty. Reload before relying on it.
No production report covers {{ coNewSinceReport }} yet. They joined the office after {{ coLatestLoaded }}, the last month loaded. Their figures start when that month comes in.
Nobody is in coaching yet. Search a name above, pick the program and the coach, and add them. Everyone added is recorded against your name and shows on their agent record.
{{ ch.avText }}

{{ ch.name }}

{{ ch.role }}
Coaching
{{ ch.count }}
Units in program
{{ ch.units }}
Company dollar
{{ ch.co }}
Agent
Progress to graduation
Volume · {{ coWindowLabel }}
Company dollar · {{ coWindowLabel }}
Status
{{ ca.sub }}
{{ ca.progress }}
{{ ca.volume }}
{{ ca.co }}
{{ ca.status }}
{{ ca.since }}
{{ ca.firstLine }}
{{ ca.gradNote }}
Next Level Coaching

At will, no closing target

Established agents, coached by {{ coNextCoaches }}. Counted apart from the Coaching Program so neither number stands in for the other.
Agents
{{ coNextCount }}
Closings this year
{{ coNextUnits }}
Next Level co$
{{ coNextCo }}
{{ coNextCoNote }}
Since they joined
{{ coNextSince }}
{{ coNextSinceNote }}
Agent
Activity
Volume
Company dollar
{{ nx.sub }}
{{ nx.since }}
{{ nx.units }}
{{ nx.lastLine }}
{{ nx.volume }}
{{ nx.co }}
{{ formsKindLabel }} forms ✎ HubSign or DocuSign / Authentisign
Upload the blank packet forms once (ICA, KWRI forms, HBR forms). The Hub reads the fillable fields and maps them to agent data, then each uploaded form gets two buttons: ✎ Sign with HubSign (agent signs on this device, signature stamped in with a signing certificate page) or Download for DocuSign / Authentisign (filled PDF, signature lines left blank for the signing platform). Uploading a file with the same name replaces the old version; everything generates from the latest.
Reading the form fields…
{{ formsError }}
One or more forms are too large to keep in browser storage. They work now but need a re-upload after a page reload. Solved for good once Supabase is live.
Agent data, what fills the blanks
Quick-fill from onboarding:
No forms in the {{ formsKindLower }} library yet. Upload a blank fillable PDF above and its ✎ Sign with HubSign and Download for DocuSign / Authentisign buttons appear right here. The form stays on file for every {{ formsKindLower }} after this.
{{ fm.name }} {{ fm.meta }}
Re-upload after reload
Flat PDF, no fillable fields detected. It needs a one-time coordinate mapping pass: tell Claude in chat and we’ll map where each blank sits.
Field mapping, which Hub data lands in each PDF field
{{ mr.field }}
HubSign audit log
{{ hl2.t }}
HubSign, in-office signing

{{ hsFormName }}

Signing as {{ hsAgentName }}. The signature lands on every field mapped “Agent signature” and a signing certificate page is added to the end of the packet.
{{ hsError }}
{{ obFilterNote }}

{{ tk.label }}

{{ tk.count }}
{{ tk.note }}
Focus
{{ tk.focus }}
Owned by {{ tk.owner }}
Incoming production
{{ tk.volume }}
{{ tk.units }}
{{ pp.capTag }} 🎯 {{ pp.coachTag }}
{{ pp.stage }}
{{ pp.note }}
{{ sg3.title }} {{ sg3.avText }}
{{ pp.stepLabel }}
{{ pp.volume }}
{{ pp.units }}
{{ pp.status }}
Nobody in this track right now.
Edit payee

{{ pdTitle }}

{{ pdDoors }}
This cycle
{{ pdCycle }}
Ownership
{{ pdLedgerCount }}
{{ pdCurrentYear }}
{{ pdCurTotal }}
{{ mo.label }}
{{ mo.total }}
{{ mo.feeF }} fees · {{ mo.otherF }} other
{{ pl.desc }}
{{ pl.amtF }}
Paid {{ pl.dayF }} {{ pl.forLabel }}
Previous years
{{ py2.year }}
{{ py2.count }}
{{ py2.total }}
{{ py2.feeF }} fees · {{ py2.otherF }} reimbursements and settlements
{{ pmFormKicker }}

{{ pmFormTitle }}

This creates the record here in the prototype. On go-live it writes to Supabase and the checklist becomes the audit trail.
Every door OPM manages

Doors

Occupancy, rent roll and what came in this month. The fee shown is what each door’s own terms produce, rates run from 0% to 10% and are never averaged.
Occupied
{{ pmOccLabel }}
{{ pmVacantLabel }}
Rent roll
{{ pmRentRoll }}
{{ pmInMonth }} in this month
Fee earned
{{ pmFeeMonth }}
before the split
{{ pmNotLoadedNote }}
{{ dr3.addr }}
Owner {{ dr3.owner }} · {{ dr3.pmLabel }}
Tenant
{{ dr3.tenant }}
Rent
{{ dr3.rentLabel }}
{{ dr3.receivedLabel }}
Fee
{{ dr3.feeLabel }}
{{ dr3.feeAmtLabel }}
{{ dr3.roundLabel }}
Dump the documents, tick what applies

Intake packets

Same shape as agent onboarding. Upload everything at once, tick the documents this owner or tenant actually needs, and the fields already on the file fill them in. Nothing sends on its own. You press send.
{{ pmPacketNoCaseNote }}
Fields the packet fills
{{ pf2.label }}
{{ pf2.value }}
{{ du.name }}
{{ pmDocsWarn }}
{{ pd.label }} {{ pd.signLabel }}
{{ pd.note }}
{{ pd.missingLabel }}
{{ pmPacketBlockedLabel }}
{{ pmPacketSentLabel }}
What HubSign will fill
{{ fr.label }} {{ fr.filled }} · {{ fr.asks }} {{ fr.blanks }}: {{ fr.blankList }}
{{ pmFillNote }}
Complete what we cannot pull
{{ pmAskCount }}
{{ aq.on }}
Marked NA this time
{{ pmAskNote }}
Print or download now, or leave it and send with HubSign below. Same filled document either way.
{{ pmFillResult }} {{ pmFillErr }}
Tenant file, identity
{{ pmPiiNote }}
{{ pm2.label }} {{ pm2.shown }}
Who has opened it {{ pll.t }}
Full social security number Not held in this browser at all. Ask for it, say why, and the server hands back that one number and records that it did.
The reason travels with the request. Anyone can ask; everyone can see who asked and what for.
{{ ssr.t }} {{ pmSsnPending }}
Screening, the calls that were actually made {{ pmScreenLabel }}
Not a score fetched from an API, who you rang, when, and what they said. Record it here and it stays with the tenant instead of in someone’s notebook. A packet cannot go out until each line is either done or set aside with a reason.
{{ sc.label }} {{ sc.hint }}
{{ pmScreenAdverse }}
Signing link Open the signer’s view {{ pmSentCode }} {{ pmSentHow }}
How they get in
{{ sigCodeNote }}
{{ pmNoTplNote }}
HubSign sends the documents that need a signature; the rest are collected as uploads. Nothing leaves the Hub until you press this.
Move-in → six months → move-out

Lifecycle

Driven by what happens at the door, not a fixed list. The condition form escalates on its own; photo rounds come back every six months for the life of the tenancy; a move-out set is read against every round before it.
Move-in condition forms
No move-ins in flight. Start a tenant in onboarding and the ten-day clock appears here the day keys go out.
{{ lp.title }}
{{ lp.sub }} · {{ lp.whenLabel }}
{{ lp.statusLabel }}
{{ lp.detail }}
{{ rg.label }}
Photo rounds. Every six months
{{ pmLcPhotoDue }} door(s) need a round
{{ ph.addr }}
{{ ph.tenant }} · {{ ph.pm }} · last {{ ph.lastLabel }} · next {{ ph.dueLabel }}
{{ ph.statusLabel }}
Move-out comparison
No move-outs in flight. When notice comes in, every photo set on that door lines up here in date order. Move-in, each six-month round, then move-out.
{{ lo.title }}
{{ lo.sub }} · {{ lo.whenLabel }}
{{ lo.setLabel }}
{{ ls.date }} · {{ ls.inspector }}
On upload

Condition form scan

Tick what the form raises. These are prompts to read, not judgments. The Hub never decides a deposit question.
{{ pc2.label }}
{{ pc2.hint }}
{{ pmPcfRaisedLabel }}
{{ pmPcfCopyLabel }}
Lead → signed owner

Owner prospects

People we’re courting who haven’t signed a management agreement yet. Every lead keeps who referred them, if that owner ever sells, the referral follows the property.
{{ pmProspectActiveCount }}
No owner prospects on file. Add one when a lead comes in, a referral, a sign call, an HOA introduction, and it carries who gets credit if that owner ever sells.
{{ pr3.name }} — {{ pr3.addr }}
Canceled — {{ pr3.lostReason }}
{{ pr3.sourceLine }}
{{ pr3.name }}
{{ pr3.addr }}
{{ pr3.sourceLine }} · {{ pr3.rentLine }}
{{ pr3.referralLine }}
{{ pr3.note }}
{{ pr3.followLine }}
Mark as terminated / canceled
{{ pmCasesEmptyNote }}
{{ pmCaseKicker }}

{{ pmCaseTitle }}

{{ pmCaseNote }}
{{ pmCaseCount }}
{{ cs.title }}
{{ cs.sub }}
{{ cs.pmLine }} · {{ cs.rentLine }} · {{ cs.dateLabel }}
{{ cs.referralLine }}
{{ cs.noteVal }}
{{ cs.countLabel }}
{{ cs.pctLabel }}
Next
{{ cs.nextLabel }}
Owner: {{ cs.nextOwner }}
Assigning a step puts it on that person’s task list under Property management, tagged with which flow it came from. Checking it off here closes it there.
{{ ci.label }}
{{ ci.linkLabel }}
{{ ci.suggested }}
Intake → vendor → paid

Maintenance requests

{{ pmMaintChannels }}
{{ pmMaintRule }}
{{ pmMaintOpenCount }}
{{ mr.urgency }} {{ mr.id }} · {{ mr.cat }} · {{ mr.via }} · {{ mr.at }}
{{ mr.issue }}
{{ mr.addr }}
Owner {{ mr.ownerName }} · Tenant {{ mr.tenantName }} · {{ mr.pmLine }}
Cost & vendor
{{ mr.estF }}
{{ mr.vendorLabel }}
{{ mr.gateLabel }}
Owner approval: {{ mr.approvalLabel }}
{{ mr.dedLabel }}
{{ mr.linkLabel }}
{{ mr.sheetStatus }}
{{ ss.label }}
{{ mr.linkLabel }} — it counts in their open tasks and closes when this reaches Closed.
{{ mr.licWarn }}
Check DCCA ↗
Owner approval
{{ mr.gateLabel }}. Over {{ pmThresholdF }} a verbal yes does not count. It has to be in writing before anyone is scheduled.
{{ mr.approvalLabel }}
Owner proceeds
{{ mr.sheetLine }}
{{ mr.dedLabel }}
{{ mr.sheetStatus }}
The reconciliation tab checks this against the deductions column on the door and flags anything that does not tie.
Once it reaches Invoice to ledger the amount belongs in the deductions column on the month’s worksheet, against this door.
Trade · insurance · W-9

Vendors

These are the vendors the ledger already pays. Contacts and rates were never written down anywhere. Fill them in here and a work order can name a vendor instead of a memory.
{{ pmVendorCount }}
{{ pmLicNote }}
{{ vd.name }}
{{ vd.trade }}
Do not use
{{ vd.yelpLabel }} {{ vd.googleLabel }} {{ vd.ratingLabel }} {{ vd.oursLabel }}
Our rating
{{ vd.w9Label }} {{ vd.insLabel }}
Correct the record
State license
{{ vd.licLabel }}
{{ vd.licTypeLabel }} {{ vd.licExpLabel }}
Contact
{{ vd.contact }}
Phone
{{ vd.phoneF }}
Rate
{{ vd.rate }}
Doors
{{ vd.jobsLabel }}
{{ vd.note }}
{{ vd.flagLine }} — {{ vd.note }}
Every door, twice a year

6-month check inspections

Pick the door and confirm the bed/bath count once. It builds the walkthrough for you. Works on a phone: photo per section, video optional, a note, and a condition. Saves to the door’s file when you’re done.
{{ pmInspectBeds }}
{{ pmInspectBaths }}
Inspection history
Nothing on file yet. The first saved walkthrough will show up here.
{{ ih.addr }}
{{ ih.date }} · {{ ih.inspector }} · {{ ih.beds }} bd / {{ ih.baths }} ba
{{ ih.flagLabel }}
{{ pmInspectDoorLabel }}
{{ pmInspectProgress }}

{{ pmInspectSecLabel }}

Review · {{ pmInspectDoorLabel }}
{{ pmInspectOwnerLine }}
Nothing flagged, all sections came back Good or Fair.
{{ pmInspectFlaggedCount }} section(s) need attention. Flagged below.
{{ rr.label }}
{{ rr.condition }}
{{ rr.checkedLabel }}
{{ rr.notes }}
🎥 {{ rr.videoName }}
The work that comes back every month

Recurring tasks

Dates here are the cadence, not a live calendar. Once these run out of the Hub they should generate a task on the right day and close against the person who did it.
{{ rc.name }}
{{ rc.note }}
Cadence
{{ rc.cadence }}
Next
{{ rc.next }}
Owner
{{ rc.owner }}
Scope
{{ rc.scope }}
{{ pmMoMsg }}
Trust account should hold
{{ pmTrustHold }}
{{ pmTrustSub }}
{{ pmTrustPend }}
The rule
The trust account holds exactly the sum of deposits held for current tenancies. Repairs are paid from operating, so a forfeited amount moves trust to operating. The other direction leaves brokerage money in a client trust account, which HAR 16-99-4 prohibits. The Hub works out the amount and the direction; neither is typed.
{{ pmXferCount }}
Write the cheque, print the slip for the register, then record the number here so the trust balance stops showing it as pending.
{{ xf.amount }}
{{ xf.dir }}
{{ xf.where }}
{{ xf.who }}
{{ xf.reason }}
Move-outs
Move-outs have not been read yet.
{{ mo.tenant }}
{{ mo.door }} · terminated {{ mo.terminated }} · due {{ mo.due }}
{{ mo.clock }}
held {{ mo.held }} · withheld {{ mo.withheld }}
{{ mo.status }}
{{ pmMoDetTitle }}
{{ pmMoDetDue }}
{{ pmMoDetClock }}
{{ pmMoDetLaw }}
Held
{{ pmMoHeld }}
Withheld
{{ pmMoWithheld }}
Refund to tenant
{{ pmMoRefund }}
Trust after
{{ pmMoTrustAfter }}
{{ pmMoTrustAfterNote }}
{{ pmMoDueFromNote }}
{{ pmMoEstWarn }}
Deposits held for this tenancy
{{ dp.kind }}
received {{ dp.on }}
{{ dp.amount }}
Withheld, with the particulars
{{ it.label }}
{{ it.detail }}
{{ it.vendor }} · {{ it.invoice }} · {{ it.paidFrom }}
{{ it.basis }}
{{ it.amount }}
{{ pmMoTransferSentence }}
Finalizing releases the deposits, freezes these figures, and raises the transfer with its direction already decided. Do it once the particulars are right.
Deposits held
The deposit register has not been read yet.
{{ dl.addr }}
{{ dl.tenant }} · {{ dl.tenancy }} · since {{ dl.since }}
security {{ dl.security }} · pet {{ dl.pet }}
{{ dl.total }}
{{ dl.flag }}
{{ pmCloseMsg }}
You are looking at
{{ pmPeriodMonthLong }}
{{ pmPeriodState }}
{{ pmPeriodLine }}
{{ pmPeriodReopened }}
Still open this month
{{ lo.text }}
{{ pmLooseNote }}
{{ pmCloseWhat }}
A correction can still be made, but reopening closed books is recorded against the month with your initials and your reason.
{{ pmJumpHeadline }}
{{ pmJumpDoor }}
{{ pmJumpOwner }}
{{ pmJumpLabel }}
Worksheet note: {{ pmJumpNoteVal }}
Amount you clicked
{{ pmJumpAmtF }}
Deductions on this door
{{ pmJumpDedF }}
Net to owner
{{ pmJumpNetF }}

Before you pay anyone

{{ pmPeriod }} worksheet · {{ pmFindingCount }}
{{ fd.ownerName }}
{{ fd.addrLine }}
Tenant · {{ fd.tenantName }}
{{ fd.title }}
{{ fd.tagText }}
{{ fd.body }}
{{ gp2.pm }}
{{ gp2.count }}
{{ gp2.rentF }}
{{ dr2.addr }}
{{ dr2.owner }}
{{ dr2.rentF }}
{{ fd.noteVal }}
What to do
{{ fd.action }}
{{ fd.resolvedBy }}
The door
{{ fd.door.addr }}
Owner {{ fd.door.owner }} · Tenant {{ fd.door.tenant }}
Managed by {{ fd.door.mgr }}
{{ dl.k }}
{{ dl.v }}
Everything is cleared for {{ pmPeriod }}.
Nothing is holding the payout. Resolved items stay on the record until the next worksheet is imported.
Resolved items drop out of the list but stay on the record for this cycle.

Maintenance against the worksheet

Every logged request is checked against the deductions column on its door: whether the owner approved it in writing, and whether the money actually came out of their proceeds.
{{ pmXrefCount }}
Every maintenance charge has written approval and ties to a deduction.
Nothing here is holding the payout.
{{ xr.kind }} {{ xr.amtF }}
{{ xr.title }}
{{ xr.sub }}
{{ xr.body }}
What to do
{{ xr.action }}
{{ xr.matchNote }}
{{ ps.k }}
{{ ps.v }}
{{ ps.n }}
{{ pmRecTitle }}
{{ pmRecNote }}
Worksheet
{{ pmSheetTotal }}
DoorLoop payout
Variance
{{ pmVariance }}
DoorLoop connection · {{ pmPeriodMonthLong }}
{{ dlStateLine }}
{{ dlMsg }}
Link DoorLoop doors to the worksheet
{{ dlLinkNote }}
{{ sg.dlAddr }}
Worksheet: {{ sg.hubAddr }} ({{ sg.door }})
{{ sg.basis }}
{{ dlPullNote }}
{{ pmJumpLabel }}
Tenant & property
Rent
Received
Mgmt fee
Deductions
Credit
Net to owner
Manager
{{ pr2.tenant }} Likely cause
{{ pr2.addr }}
Owner: {{ pr2.owner }}
{{ pr2.notes }}
{{ pr2.rent }}
{{ pr2.mgmt }}{{ pr2.feePct }}
{{ pr2.credit }}
{{ pr2.net }}
{{ pr2.coName }}
{{ pr2.payLabel }}
{{ pr2.splits }}
Totals · {{ pmCount }}
Rent billed
{{ pmTotRent }}
Rent received
{{ pmTotReceived }}
Mgmt fees
{{ pmTotMgmt }}
Deductions
{{ pmTotVendor }}
Owner credits
{{ pmTotCredit }}
Due to owners
{{ pmTotNet }}

Management fee splits

Where the fee lands
{{ pmSourceNote }}
{{ pmPeriodLabel }} paid out
{{ pmHistTotal }}
{{ hr2.sub }}
{{ hr2.fee }}
Plus {{ hr2.other }} in reimbursements and settlements, not management fees
JV since inception
Total incoming
{{ pmJvIn }}
Total outgoing
{{ pmJvOut }}
Net
{{ pmJvNet }}
Incoming is not loaded, so there is no net to state. Outgoing is summed from the check ledger; incoming waits on hub.pm_jv_income. A dash, not a zero, and not a net computed from a figure nobody has verified.
Straight from the Profit Summary header. Incoming only counts the deposits recorded there, so treat the net as the ledger’s view rather than the JV’s true P&L.
Payment lag
{{ pmLagNote }}
Date
Check
Payee & purpose
Amount
Type
The check ledger is loaded in Supabase, hub.pm_ledger_rows, 68 rows. Real disbursements against real owners belong behind the permission rules, so they are no longer in this page, and this tab is not bound to the table yet. Not loaded, not $0.00.
{{ lr.dF }}
{{ lr.ck }}
{{ lr.payee }}
{{ lr.desc }}
{{ lr.amtF }}
{{ lr.kindLabel }}
{{ sp3.k }}
{{ sp3.v }}
{{ sp3.pct }}
{{ oneNote }}
more than one of these
{{ op.where }}
Known from {{ op.knownLine }}
{{ op.settledWhy }}
{{ rr.name }}
{{ rr.stage }}
Onboarding checklist started
{{ rr.initials }}
{{ rr.name }}
{{ rr.brokerageOnly }}
{{ rr.eventsAttendedLine }}
{{ rr.tierLabel }} {{ rr.involvedLine }}
Do not contact — {{ rr.blacklistBadge }}
Pipeline
Stage
Assigned to
Meeting
Contact info
Recruit info
{{ ir.k }} {{ ir.v }}
Log a touch
Which one did they come to?
{{ rr.touchEventNote }}
The meeting date has passed. How did it go?
What was it, mostly? Helps spot patterns over time.
On the do-not-contact list — {{ rr.blacklistNote }}. Needs PB or TL approval.
Touch history
{{ rr.touchCount }} logged · last {{ rr.lastTouchShown }}
{{ tl.head }}
{{ tl.text }}
{{ tl.when }} · {{ tl.by }}
No touches logged yet. Pick a method above to record the first one.
Record changes
{{ lg2.when }} · {{ lg2.text }} ({{ lg2.by }})
{{ mc.k }}
{{ mc.v }}
{{ mc.n }}
Against our cap
{{ rr.mCapPct }} · {{ rr.mCapNote }}
Worked out from the volume and units on this record, at our own commission rate and company dollar split. It is an estimate from self-reported production, not a verified figure.
Reported production
YTD volume
YTD units
Team name
{{ mem2.stageLabel }}
{{ mem2.dupeNote }}
Add to the file
{{ recTrailLine }}
Stamped with your name and the time. Entries cannot be edited afterwards, so a correction goes on as its own entry.
{{ recNoteMsg }}
Hand something to the team
{{ recTaskCountLine }}
Who
It lands on the Tasks board carrying this recruit and the last thing written on their file.
{{ recTaskMsg }}
{{ tr2.title }}
{{ tr2.who }} · {{ tr2.dueLine }}
{{ tr2.status }}
The file
Nothing on the file yet. The first call, text or note you save appears here with your name and the time against it.
{{ te.kind }}
{{ te.body }}
{{ te.author }} · {{ te.when }}
How this record started
{{ rr.notes }}
Also talking with this contact
Linked tasks
Back to the pond
They come off the board and stop counting, but everything on their file is kept. If you pick them up again it is this same record, with what was said last time still on it.
{{ pondMsg }}
{{ cr.name }}
{{ cr.standingLabel }} Blacklisted
In the pipeline
{{ cr.sourceLine }}
Do not recruit
{{ cr.blReason }}
{{ cr.blNote }}
Their numbers are shown in full below. Hiding a record is how somebody works the name for a week before finding out.
{{ cr.oursNote }}
Where they are
{{ cr.office }}
{{ cr.city }}
{{ cr.departedLine }}
In the business
{{ cr.tenure }}
At this office
{{ cr.atOffice }}
Rank in office
{{ cr.rank }}
{{ cr.rankNote }}
{{ cr.email }}
{{ cr.phone }}
{{ cr.mls }} · ID {{ cr.mlsId }} · License {{ cr.license }}
Last twelve months
{{ cr.vol }}
{{ cr.change }}
{{ cr.units }} units · {{ cr.avg }} average sale
{{ cy.k }} {{ cy.v }}
{{ cy.u }}
Estimated income
{{ cr.gci }}
{{ cr.gciNote }}
How they work
Listing side {{ cr.listPct }}
{{ cr.listVol }}
{{ cr.listUnits }}
Buyer side {{ cr.buyPct }}
{{ cr.buyVol }}
{{ cr.buyUnits }}
On the market right now
{{ cr.active }}
Active
{{ cr.pending }}
Pending
{{ cr.liveTotal }}
Total live
Works mostly in
{{ cr.cityWorked }}
What Courted expects next
{{ cr.fcast }}
{{ cr.fcastLow }}{{ cr.fcastHigh }}
{{ cr.fcastNote }}
Likelihood to move
{{ cr.move }}
Growth outlook
{{ cr.growth }}
Signals
Courted raises no signals on this person. That is not the same as nothing happening.
{{ cg.t }}
On your lists
{{ cr.onLists }}
{{ courtedMsg }}
{{ recRefreshNote }}
{{ recDrillTitle }}
Nobody is in this group right now.
{{ dr.name }}
{{ dr.line }}
Who is who · {{ idnCount }}
Questions no import can settle. Until one is answered the Hub leaves the record alone rather than guessing, so nothing here is wrong; it is only undecided.
{{ idnMsg }}
{{ iq.question }}
{{ iq.about }} · {{ iq.weThink }}
{{ iq.extra }}
{{ ir.name }}
{{ ir.line }}
{{ ic.name }}
{{ ic.line }}
{{ ic.agrees }}
Waiting on you · {{ pendCount }}
You emailed these people and the Hub cannot tell what they are. They are not on your roster, they are not escrow or title, and they are on neither market list. About a quarter of Hawaii agents use a personal address, so a gmail with no Courted record looks exactly like a friend or a client. Rather than guess, it asks. Each answer is remembered for good, so nobody is raised twice.
{{ pendMsg }}
{{ pd.who }}
{{ pd.email }}
{{ pd.line }}
{{ pd.subject }}
Due to circle back
{{ cd.name }}
{{ cd.brokerage }} · {{ cd.touchLine }}
Said: “{{ cd.replyWords }}”
{{ cd.repeatNoLine }}
Said yes, move them over
{{ cy.name }}
{{ cy.brokerage }} · {{ cy.touchLine }}
Said: “{{ cy.replyWords }}”
Meetings today & tomorrow
Stalled in stage 2+ weeks
Worth a check-in
Coverage this week
How we are doing
The same effort and outcome figures that used to sit on their own tab. They are at the bottom because they are worth reading weekly, not hourly.
{{ actHeadline }}
{{ actHeadNote }}
{{ actLagNote }}
{{ actDrillTitle }}
Nothing logged in this window.
{{ adr.line }}
How long each stage takes
{{ actStageNote }}
The whole job. This quarter
{{ wj.v }} {{ wj.k }} {{ wj.n }}
{{ actPersistence }}
What the number is made of
{{ actStreamNote }}
Who the effort was aimed at. This quarter
{{ actAimedNote }}
Win / loss patterns
{{ recSignedCount }} signed
Six months of effort
{{ tr2.val }}
{{ tr2.label }}
{{ actTrendNote }}
Where people actually sit
{{ af.v }}
{{ af.k }}
{{ af.n }}
{{ actEmptyNote }}
Log a batch
A blast through Reach or Courted is one action here, not fifty. Paste the names. Anyone already on our roster is filed as an agent conversation, everyone else as a recruiting touch. Same week, same person, counted once.
Channel
Date
{{ actLogMsg }}
{{ coopDrillTitle }}
Nobody is in this group right now.
{{ cdr.name }}
{{ cdr.line }}
{{ cdr.detail }}
Already in the pipeline
The market, ranked by production
{{ coopMarketNote }}
{{ coopPondLabel }}
{{ coopAge }}
{{ coopAge }}
{{ coopCalibHead }}
{{ coopCalibLine }}
{{ cb.line }}
{{ coopCalibCaveat }}
Nothing was deleted
{{ coopJunkRefusedNote }}
{{ coopJunkNote }}
{{ coopJunkSample }}
{{ coopJunkSpared }}
This deletes those rows from the database. Anyone already on your list or in the pipeline is untouched.
{{ coopSearchNote }}
Rank by
{{ coopSortNote }}
{{ coopFirmsCount }}
{{ fm.name }} {{ fm.share }}
{{ fm.line }}
{{ ss.label }} — {{ ss.line }}
★ Ours On our roster, now elsewhere
{{ mk.brokerage }} · {{ mk.sides }}
{{ mk.statusLabel }}
“{{ mk.statusNote }}”
{{ mk.split }}
{{ mk.loyalty }} {{ mk.mix }}
{{ mk.why }}
{{ mk.leftUsNote }}
{{ mk.trendLine }}
{{ dt.line }}
{{ mk.vol }} On my list
Worked opposite, not yet asked
{{ cw.brokerage }} · {{ cw.touchLine }}
{{ cw.props }}
Filed, not recruiting targets
{{ coopFiledNote }}
Do not contact
{{ coopDncNote }}
· {{ dn.brokerage }} — “{{ dn.replyWords }}”
Said no, scheduled to circle back
· {{ cl.brokerage }} · {{ cl.circleLine }} · {{ cl.repeatNoLine }}
Nothing here yet. Once Gmail is connected this fills on its own from the deals you're already working, or paste a few above to see how it reads.
Showing {{ courtedListName }}
{{ courtedListLine }}
Agents Courted has enriched
The same market as the list above, seen through Courted rather than Retr: live listings, year on year, and the signals Courted raises. Only the agents that have been pulled so far appear here.
{{ courtedCountLine }}
No agents have come across yet. Switch a list on above and it will pull straight away.
Nobody here matches that. Everything pulled is still held; only this view is narrowed.
{{ ca.name }} Blacklisted Former agent Ours
{{ ca.office }} · {{ ca.rank }} in office
{{ ca.blLine }}
{{ ca.formerLine }}
{{ ca.listPct }} listing side
{{ cf.t }}
On: {{ ca.onLists }}
{{ ca.sourceLine }}
Volume
{{ ca.vol }}
{{ ca.change }}
Units
{{ ca.units }}
{{ ca.avg }} average
Live now
{{ ca.live }}
{{ ca.liveNote }}
Tenure
{{ ca.tenure }}
{{ ca.atOffice }} here
Where this list comes from
Four ways in, in one place, at the bottom where they belong. Nothing here is part of the day; it is how the pond gets filled.
Market agents, from Retr
Select the rows in Retr and paste them here, header row included. Production, brokerage and loan mix come across. Buyer and seller volume are added together, so the figures compare directly with our own roster. Production only arrives this way: Retr has no way to send a market list, so this paste is the monthly refresh. The webhook fills in phone numbers and emails as agents are revealed in Retr. Nothing else.
Name this search {{ retrSegHint }} {{ retrPasteHelp }}
{{ retrMsg }}
How this fills itself
{{ coopHowNote }}
Until Gmail is connected, paste sent mail, one per line
{{ coopMsg }}
New contact
Reading {{ recExtractFileName }}…
{{ recExtractError }}
Pulled from {{ recExtractFileName }} — review before applying
{{ recDraftBlacklistHit.note }}
{{ recDraftDupe.note }}
{{ dmem.dupeNote }} — consider adding them as a separate contact and linking afterward.
Also talking with this contact
Courted searches
{{ courtedListsLine }}
Nothing has been read from Courted yet on this page. This is not a count of zero, it is the absence of an answer.
No saved searches or watchlists of yours have been found yet. Press Refresh from Courted and the Hub will ask. Lists belonging to the other KW Hawaii market centers are deliberately left out: they cover a different set of agents on a different MLS.
{{ cl.name }}
{{ cl.kind }}
{{ cl.shortNote }}
{{ cl.agoLine }}
{{ cl.sourceLine }}
{{ cl.enabledLine }}
People we do not contact
The do-not-contact list, and the blacklist the Courted pull checks against.
{{ blSaveNote }}
{{ bl.name }}
{{ bl.reason }} · {{ bl.meta }}
Reading the cap years…
What the database said
{{ cyErr }}
Against the capper goal
{{ cyBanked }} banked of {{ cyGoal }} capper equivalents
Banked {{ cyBanked }} On pace, {{ cyPaceEquiv }} more Unclaimed {{ cyUnclaimed }}
Cappers · people
{{ cyCappersNow }} → {{ cyCappersThen }} if the {{ cyOnPace }} on pace land
People who reached a full cap this calendar year. Counted from the monthly production files, so an agent who capped and then had an anniversary is still counted.
Capper equivalent · money
{{ cyEquivNow }} → {{ cyEquivThen }} if they land
{{ cyMoneyBanked }} already collected in the cap years running now, against the {{ cyStandard }} standard. The twelve would add {{ cyMoneyToCome }}.
Why the two numbers do not match
{{ cyPaceWhy }}
The ladder, as the roster stands
Our name leads, KWRI’s sits beside it. The bar shows how much of each rung has banked a full cap, and how much is on pace to.
{{ lr.name }}
{{ lr.kw }}
{{ lr.head }}
{{ lr.det }}
{{ cyLadderNote }}
When those caps actually landed
Each block is one agent crossing their own cap.
{{ mo.c }}
{{ mo.k }}
A month with nothing loaded is dashed, not empty. Production is loaded through {{ cyLoadedThrough }}, so any cap crossed since then is not countable yet. A blank month and a zero month are not the same thing.
Waiting on you · annual status review
When an agent’s cap year closes short of what their status asks, the Hub raises one question and moves nobody on its own: keep them where they are, or move them.
{{ cyQueueFilterLabel }}
Agent Status Year closed Asked Earned Short by Your answer
{{ qr.agent }}{{ qr.flag }} {{ qr.status }} {{ qr.closed }} {{ qr.asked }} {{ qr.earned }} {{ qr.short }}
{{ qr.done }}
Not saved. {{ cyAnsErr }}
An answer is written the moment you click it, with your initials and the time against it. Moving someone changes their status straight away and is written to the override log. Answered rows drop off this list on the next reload.
Where these numbers come from
{{ cyHow }}
The {{ cyStandard }} standard is a decision, not a guess. {{ cyStandardWhy }} {{ cyAbove }} of the {{ cyMeasurable }} agents with a cap year running still carry a cap above it, so a full payer on one of those counts as more than one. The equivalent runs ahead of the headcount by design.
Cap report {{ cyReportPeriod }} · monthly production through {{ cyLoadedThrough }}.
Track only agents you are actively engaging, not Courted's full candidate database. Marking a contact "Met", or setting a meeting date, auto-creates a task on the Tasks board.
Waiting on you · possible duplicate records
{{ mqCount }} pairs look like one person under two records. The Hub will not join them on its own, because joining the wrong two is far harder to undo than leaving two apart. Answer once and the same pair is never raised again.
Not saved. {{ mqErrText }}
Every pair on this list has an answer. Reload to clear it.
{{ mqi.why }} Touches the blacklist
The record we keep
{{ mqi.keepName }}
{{ mqi.keepSide }}
The record that arrived
{{ mqi.otherName }}
{{ mqi.otherSide }}
{{ mqi.done }}
Asked, waiting on an answer
{{ ca2.name }}
{{ ca2.brokerage }} · {{ ca2.touchLine }} · {{ ca2.pitchedLine }}
No one in the pipeline yet. Add the first agent you're in real conversation with. This stays a short, working list, not Courted's full database.
{{ r.brokerageLine }}
⛔ {{ r.blacklistBadge }}
{{ r.tierLabel }}
{{ r.involvedLine }}
{{ r.productionLine }} {{ r.ownerIni }}
{{ r.touchLine }}
{{ tg2.head }}
{{ tg2.text }}
{{ tb.avText }} {{ tb.name }} — {{ tb.line }}
⚠ On the do-not-contact list — {{ r.blacklistNote }}. Needs PB/TL approval.
Meeting {{ r.meetingLine }}
How did it go?
What was it, mostly? Helps spot patterns over time.
{{ leadsErr }}
{{ leadsUnreadNote }}
{{ ls.k }}
{{ ls.v }}
{{ ls.n }}

By lead aggregator

Oahu · {{ leadsYear }}
Aggregator
Closings
Volume
GCI
Company dollar
Agents
{{ lsrc.name }}
{{ lsrc.sub }}
{{ lsrc.closings }}
{{ lsrc.volume }}
{{ lsrc.gci }}
{{ lsrc.co }}
{{ lsrc.agents }}
Total
{{ leadsTotalUnits }}
{{ leadsTotalVol }}
{{ leadsTotal }}
{{ leadsTotalNote }}
{{ leadsPipeline }}

{{ mreaTrackLabel }}

{{ mreaTrackCadence }}
{{ mreaTrackLast }}
{{ mreaTrackNoneNote }}
{{ mreaTrackMsg }}
{{ mreaTrackGuard }}

The MREA leads team

{{ leadsEmptyNote }}
{{ leadsSyncLine }}
The roster below could not be checked against the tracker just now, so it shows the tags as they stand. Anyone added to the tracker since the last check would be missing.
{{ lt.badge }}
{{ lt.when }}
{{ lt.platforms }}
{{ lt.sharedNote }}
{{ lt.closings }}
{{ lt.co }}
{{ lt.disputedNote }}
{{ leadsSharedNote }}
{{ retCountLine }}
Nobody is flagged for outreach right now. That changes as classes are logged, production moves, and 1:1s age.
{{ rt.office }} · {{ rt.team }}
{{ rt.band }}
{{ rt.why }}
{{ rt.production }} · {{ rt.units }} {{ rt.classes }} Last 1:1 — {{ rt.lastTouchLabel }}
Who's calling On the board · {{ rt.taskStatus }} · {{ rt.ownerName }}
Values: {{ rt.values }}
Goals: {{ rt.goals }}
Being recruited by {{ rt.recruitedBy }}
From the retention sheet, not matched to a roster agent
{{ retUnmatchedNote }}
{{ ru.line }}
{{ ru.intel }}
{{ ru.notes }}
{{ ceBulkAskLine }}
Bulk upload
Every licensed agent on the roster already lives below. Upload the pulled reports to update them in bulk. Monthly is fine most of the year, more often as a deadline approaches. Manual edits still work any time.
{{ ceImpBusyNote }}
{{ ceImpErrorNote }}
{{ ceImpTitle }}
{{ ir.line }} {{ ir.matchNote }}
✓ {{ ceImpMsg }}
No agent records yet.
Continuing education, DCCA
{{ ceCycleNote }}
{{ ceRenewNote }}
{{ ceCountLine }}
mypvl.dcca.hawaii.gov ↗
⚠ {{ ceAlertLine }}
{{ ce.agentName }} Not in last import Offboarding {{ ce.offNote }} Unlicensed Admin No DCCA license, CE and renewal n/a Electives / 14 {{ ce.totalLine }} {{ ce.ceStatus }}
Renewals, Honolulu Board of Realtors
{{ hbrCountLine }}
members.hicentral.com ↗
HBR membership
Due Dec 31 annually · {{ hbrMemNote }}
HBR MLS
Due Jun 30 annually · {{ hbrMlsNote }}
{{ rn.agentName }} Offboarding {{ rn.offNote }} Unlicensed Admin
Owes HBR
{{ fn.line }}
Fines are logged from Data imports and live on the agent's file, shown here only so you know money is outstanding.
Send a renewal reminder
{{ ceRemindName }}
{{ ceRemindContact }} · {{ ceRemindCountNote }}
Reminder history, by year
{{ rh.line }}
Fully current. Nothing outstanding this cycle.
{{ rl.text }}
Open email draft
Both actions log to the agent's record. The count feeds the professionalism tracker in their agent file. Twilio texting sends automatically once the Supabase backend holds the API key; until then texts are queued and included in the bulk CSV.
HubSign {{ mcName }} One record, every department
Whatever sent it, a property management intake packet, an agent onboarding form, a one-off upload. It is the same record here, with the same audit trail. Nothing auto-sends; a person presses send, and that press is what appears below.
{{ ss.k }} {{ ss.v }} {{ ss.n }}
{{ sigModeNote }}
{{ sigDraftLabel }}
Out for signature Signing link: open the signer’s view The record is on the list and the audit trail has its first line. Open the link to see exactly what the signer sees. Access code, texted separately: {{ sigPrepSentCodes }} The link goes by email, the code by text. A compromised inbox on its own opens nothing. Five wrong tries locks the link and raises a task rather than letting anyone keep guessing.
What the signer sees
{{ sigPrepErr }}
1 · The document Reading the document… {{ sigPrepFileName }}
How this send is listed and searched later, not the email subject. The email is written at the moment it goes out, so it can change.
{{ sigSpecNote }}
Two fields on purpose. The name is what the form is called; the revision is which printing of it this blank is. The publisher's, exactly as it appears on the page (HAR 5/26), or ours (V 2.3). It files as {{ sigTplFullName }}.
{{ sigTplReplacingNote }} Say what moved. Without it nobody can tell an edited sentence of ours from a reissued form, and the box placement has to be checked either way.
Tie it to a packet item and ticking that item on an intake packet finds this layout on its own.
2 · Who signs
Roles, not people. The person is attached when the packet goes out.
{{ tr.count }}
{{ rc.orderLabel }} · {{ rc.count }}
Check the address {{ ew.t }}
3 · Send {{ sigSendSummary }} {{ sigFromLine }} {{ sigFromWarn }}
How they get in
{{ sigCodeNote }}
{{ sigSendBlock }} Nothing goes out on a timer. The record, the placed boxes and the audit line are written the moment you press this.
3 · Save it {{ sigTplSaveBlock }} {{ sigTplSaved }} Replacing the document bumps the version. Everything already executed keeps the version it was signed under. The old paper does not change because the blank did. This browser is out of local room for documents. The layout is held for this session; templates keep their PDFs for good once Supabase storage is wired.
The blanks on this form {{ sigSpecProgress }}
{{ sigSpecNeedsDoc }} {{ sigPendingLabel }}
Pick a blank, click where it goes on the page below, and the list moves to the next one. Click an item you have already placed to pick it back up and place it again. That also deletes the box. If a line is not on the paper in front of you, press Not on the form and it drops out of the count; press it again to put it back. Positions have to come from you, only a person can see where the line actually sits.
4 · Place the boxes
{{ sigPrepPageLabel }}
{{ sigDocTitle }} {{ sigDocMeta }}
{{ sigProgressPct }} · {{ sigProgressCaption }}
{{ sigPrepPageLabel }}
{{ sigPlacedLabel }}
{{ sigPendingLabel }}
{{ pfd.label }}
{{ sigPrepToolNote }}
{{ lgd.text }}
No box selected Pick a box type above, then click the page where it goes. Click any box you have placed to say what fills it.
Selected box {{ sigSelKindLabel }}
{{ sigSelProvenance }} Tie it to a field we already hold and it fills itself on every send. What DoorLoop cannot supply is asked once, saved onto the tenancy record, and filled from there afterwards.
Asked once when the packet goes out, then filled everywhere it appears.
Still need a field
My signature · {{ sigMarkWho }}
Your signature
{{ sigMarkErr }} Kept against your initials and reused wherever you are the signer. A PNG with a transparent background sits best on the line. Anyone without one still draws or types theirs.
Template library {{ sigDrawerCount }}
Supabase holds the blank forms. Put a document in the drawer once and every send from then on reads that same file, so a tilted scan, a shaded copy or a logo nudged half an inch can never move the boxes. Only the data changes.
{{ sigDrawerMsg }} {{ sigDrawerErr }} Loading replaces this library with what the drawer holds. That is what makes Supabase the record instead of one more copy. You fill the drawer; nothing uploads on its own.
Nothing saved yet. The first time a document is used, someone places its boxes and maps its fields; every send after that reuses this and fills itself.
{{ tpl.name }} {{ tpl.vLabel }} {{ tpl.linked }} {{ tpl.where }}
{{ tpl.meta }} {{ tpl.fills }}
{{ tpl.delWarn }}
Only the name changes. The blank, every box and the version stay exactly as they are. Nothing to re-place.
Deleting a template retires the blank. Every packet already executed keeps its own copy and the version it was signed under, so nothing already on file changes.
{{ sigSendersNote }}
{{ snd.name }} {{ snd.stateLabel }}
{{ snd.viaNote }}
Setup card — {{ sigSetupCard.who }} {{ sts }}
Script properties
{{ spr.k }} {{ spr.v }}
Step four is the only part that cannot be done for them. Google asks the account owner for mail permission, and nobody else can accept it. Everything above it can be set up in advance.
{{ sigEmptyCopy }}
{{ sigVoidNote }}
{{ sr.ref }} {{ sr.statusLabel }} {{ sr.deptLabel }}
{{ sr.subject }}
{{ sr.packet }} · {{ sr.docLabel }} · {{ sr.progress }} · {{ sr.methodLabel }} · sent by {{ sr.byLabel }}
{{ sr.markNote }}
{{ sr.ageLabel }}
{{ sr.viewLabel }}
{{ sr.chaseLabel }}
Why is this closing? The reason goes on the audit trail.
Closing never claims a signature HubSign did not capture. If they signed on paper, the record says exactly that, and the document, its history and every event stay on file under Voided.
Documents
{{ sd.label }} {{ sd.tag }}
Signers
{{ sn.name }} · {{ sn.role }} {{ sn.state }}
No signer named on the record. Add the person before this can be chased.
Audit trail {{ se.t }}
{{ opCountdown }}
{{ opReadinessLabel }}
✓ {{ opRemindersMsg }}
✓ Posted to Desk Notes at {{ opDigestPosted }}: {{ opDigestText }}
Pending, survives even after the itinerary archives
{{ opBackupLabel }}
{{ opArchiveNotice }}
Past visits
{{ tp.span }} {{ tp.meta }} {{ tp.how }} {{ tp.looseLabel }}
{{ tpe.t }}
A visit is only archived when someone presses the button. The Hub will suggest it once the dates have passed, but never clears the board on its own. Anything left unchecked becomes a follow-up task rather than disappearing with the trip, and a trip can be put back on the working list at any time.
{{ opArchiveSuggestLabel }}
Colette's itinerary
Open the live doc ↗
The link is a shortcut to Jaime’s doc, not a feed from it. Google will not let a page read a private doc, so nothing here updates on its own. When she changes the schedule, open the doc, copy the text, and paste it below. Entries are read out of it and anything already on the list is skipped. Team items are highlighted red; her personal agenda stays gray.
{{ opAsideCount }}
{{ ai.t }}
{{ opAsideNote }}
No itinerary entries yet.
{{ it2.dateLabel }} · {{ it2.time }} — {{ it2.location }} (different brokerage)
{{ it2.address }}
{{ it2.desc }}
{{ it2.involvedLine }}
Loop in team members
{{ leg.location }} different brokerage
{{ leg.count }} entries · {{ leg.teamCount }} team · {{ leg.pctLabel }}
{{ leg.naNote }}
{{ leg.lastGapNote }}
Reading the itinerary and pulling out dates, locations, and times… {{ opExtractPass }}
{{ opExtractError }}
{{ opExtractDone }}
Not read
The manual is in the database and has not been read into this page
The editions, the section text, the KWRI national companion and the recorded defects are stored in hub.pg_versions, hub.pg_sections and hub.pg_issues. Nothing is missing and nothing is zero. This panel is the read failing or not yet finished, not the manual being empty.
{{ pgTextNote }}

{{ pgSelVer }}

{{ pgSelStatus }}
{{ pgFormat }} · {{ pgSrc }}
{{ pgVerNote }}
Updated
{{ pgReleased }}
{{ pgDateNote }}
Effective date
{{ pgEffective }}
Approved by
{{ pgApproved }}
What is in this release
{{ ch }}
Companion document
{{ pgCompTitle }}
{{ pgCompVer }}
{{ pgCompNote }}
Open the KWRI manual ↗
Out for signature
{{ pgAckCount }} of {{ pgAckTotal }} · {{ pgAckPct }} · {{ pgTrackedVersion }}
{{ pgAckRoundLine }}
{{ pgAckBasis }}
Nothing out for signature
{{ pgAckIdleNote }}
{{ pgAckBasis }}
{{ pgAckCaret }}
{{ pgTrackedVersion }}
The edition is set by whichever release is out for signature, not typed here, so a signature on file always names the manual it was given for. Open or close a round on its own row in the release history below. Sent via DocuSign and archived to Drive; log it here once the signed copy is filed. The roster follows onboarding and offboarding on its own.
{{ pgAckMsg }}
Reading… {{ pgVersionUploadDone }} {{ pgVersionUploadError }}
Read on this machine only, and not yet saved to the database, so it cannot collect signatures until it is added as a release. Signatures are never carried over from the previous edition: each release collects its own.
{{ sg.name }} {{ sg.whenFmt }} Open ↗
{{ pgNotSignedCount }} not yet on file
Gaps in the record
{{ gp.text }}
Duplicated sections in the 2025 manual
{{ dp.text }}
{{ pgSearchNote }}
Not the version in force
{{ pgArchiveNote }}
{{ pgTextNote }}
Nothing in the section titles or available text matches that. Try a shorter word.
{{ sec.n }}

{{ tc.t }}

{{ sec.tagLabel }} {{ sec.hitLabel }}

{{ cc.t }}

{{ sec.subCount }}
{{ sc2.t }}
Legal matters citing this section:
End of index. Questions about interpretation go to the Broker in Charge, not to another associate.
Table of contents
{{ tv.n }}
{{ tv.t }}
{{ tv.hitN }}

Release history

Every manual located on file. When a matter turns on what the policy said at the time, this is the record, and right now it is thinner than it should be.
Search Drive for policy files ↗
Version
Dates
What is in it
Read
{{ vr.v }}
{{ vr.status }} Signing
{{ vr.format }}
{{ vr.roundNote }}
Updated
{{ vr.releasedFmt }}
Effective
{{ vr.effectiveFmt }}
{{ vr.changeCount }}
{{ sm }}
{{ vr.note }}
Approved by {{ vr.approvedBy }}
New idea
{{ ideaCount }}
{{ ir.title }}
{{ ir.byLine }}
{{ ir.desc }}
{{ ir.kind }} {{ ir.category }}
Capital needed
{{ ir.capital }}
Who is involved
{{ ir.involvedLine }}
Shelf life
{{ ir.shelfLife }}
Launch
{{ ir.launchLine }}
Create the task

{{ oe.name }}

{{ oe.dba }}
{{ oe.type }} · FED ID {{ oe.fed }}
{{ oe.agreement }}
{{ oe.amended }}
Allocated
{{ oe.totalPct }}
{{ oe.totalNote }}
Initial capital
{{ oe.capTotal }}
{{ oe.capNote }}
{{ oe.ownerCount }} · share of the whole company
{{ oe.name }}
{{ oe.totalPct }} allocated
{{ ow.ini }}
{{ ow.name }}
{{ ow.sinceLabel }}
{{ ow.pctLabel }} {{ ow.capF }}
{{ ow.kindLabel }}
{{ ow.note }}
{{ ow.ghostName }}
{{ ow.ghostSpan }} · removed
{{ ow.stub }}
{{ oe.formerLabel }}
{{ fm.name }}
{{ fm.span }}
{{ fm.pctLabel }}
Governing documents
E&O renewal
{{ lgGlanceRenewTxt }}
Cyber renewal
{{ lgGlanceCyberTxt }}
Overdue agent balances
{{ lgGlanceOverdueAgent }}

{{ lgBoardTitle }}

{{ lgCount }}
Nothing is listed below because the legal matters could not be read \u2014 not because there are none.
{{ lgLoadMsg }}
{{ mt.cat }} {{ mt.refLabel }} Needs a look
{{ mt.title }}
{{ mt.partyFmt }}
{{ mt.notePreview }}
Agent {{ mt.agentFmt }}
{{ mt.agentBadgeLabel }}
File {{ mt.fileFmt }}
{{ mt.stShort }}
{{ mt.stRest }}
{{ mt.openedFmt }}
{{ mt.closedOnFmt }}
Next date
{{ mt.nextFmt }} · {{ mt.nextIn }}
{{ mt.nextLabel }}
Status from uploaded documents
{{ mt.autoSummary }}
Re-synthesized automatically each time a new file is processed, not editable directly.
Where it stands
{{ mt.note }}
Counsel
{{ mt.counsel }}
Opposing counsel
{{ mt.opposingCounsel }}
Policy section
Exposure
{{ mt.exposure }}
Risk level
{{ mt.riskLevel }}
Mail
{{ mt.mailNote }}
{{ mt.reviewedFmt }}
Total legal expense & cost split, for renewal tracking
Saved to this browser only, moves to Supabase once that's wired up.
Payment
{{ py.k }}
{{ py.v }}
Deductible remaining
{{ mt.remainingDedFmt }}
Paid vs. claimed
{{ mt.claimBalanceFmt }}
Invoices outstanding
{{ mt.outstandingInvFmt }}
Total legal expense
{{ mt.legalExpenseFmt }}
Counts toward next year's renewal, regardless of who paid
Agent split at time of incident
{{ mt.agentSplitLabel }}
{{ tb.k }}
{{ tb.v }}
{{ mt.unaccountedFmt }} — the three shares don't add up to the total legal expense yet.
Agent owes
{{ mt.agentBalanceFmt }}
{{ mt.agentPaidFmt }} paid of {{ mt.agentOwedFmt }} billed
Payment plan
Next installment due
Date
Amount
Method
{{ ap2.date }}
{{ ap2.amountFmt }}
{{ ap2.method }}
Timeline
Open Drive folder ↗
Drop in documents, letters, invoices, or attorney emails (.pdf, .docx, .eml) — select multiple at once. Claude reads each one, adds it to the timeline with a short summary, and fills in blank fields (opposing counsel, next deadline, amounts) without overwriting what's already there.
{{ ul2.text }}
{{ tl.dateFmt }} {{ tl.kindLabel }}
{{ tl.label }}
Source: {{ tl.sourceFile }}
Date
Atty file #
Firm / payee
Invoice #
Due
Paid
Status
{{ iv.date }}
{{ iv.attorneyFileNo }}
{{ iv.payee }}
{{ iv.invoiceNo }}
{{ iv.amountDueFmt }}
{{ iv.amountPaidFmt }}
{{ iv.stLabel }}
Invoiced total {{ mt.invoicedTotalFmt }}
Log an invoice manually
Hub tasks
On the record
{{ mt.discussCount }}
Could not open this conversation. Nothing here is missing, it just did not load.
{{ mt.discussErr }}
Opening the conversation on this file.
Ask directly You are the only person with legal access, so nobody else can see this yet.
{{ mt.discussAskLine }}
{{ mt.discussWaitingLine }}
Nothing said yet. Ask the first question and it stays attached to this file.
{{ dm.avText }}
{{ dm.who }} {{ dm.when }} {{ dm.toLine }} ✓ Sent
{{ dm.body }}
{{ df.alt }} {{ df.secsFmt }} 📄 Open
{{ df.name }} {{ df.meta }}
{{ mt.discussFileErr }}
Going with this note
{{ dp.alt }}
▶
📄
{{ dp.name }}
{{ mt.discussUploadNote }}
Everyone with legal access to this matter can read this. Nothing sent here can be edited or deleted.

Upcoming deadlines

Every open matter with a date on the calendar, soonest first.
{{ lgDeadlinesCaret }}
No next dates are being tracked yet. Dates live inside the notes on each matter, not in a date field, so this list stays empty until one is set. Treat it as nothing recorded, not nothing due.
{{ ls.k }}
{{ ls.v }}
{{ ls.n }}
Errors & omissions coverage

{{ lgCarrier }}

{{ lgUnderwriter }}
{{ lgInsured }} · {{ lgInsuredAddr }}
{{ lgProgram }}
Broker of record: {{ lgProducer }}
Policy no.
{{ lgPolicyNo }}
{{ lgPriorPolicy }}
Premium
{{ lgPremium }}
Plus {{ lgSlTax }} surplus lines tax
Policy term
{{ lgTerm }}
{{ lgRenewNote }}
{{ lgRetro }}
{{ lgEoCaret }}
{{ fg.k }}
{{ fg.v }}
{{ fg.n }}
Sub-limits inside the aggregate
{{ sl.k }}
{{ sl.vF }}
{{ sl.n }}
Ways the $10,000 deductible comes down
{{ dr3 }}
Endorsements attached
{{ en2 }}
Property management is covered by endorsement
{{ lgPmNote }}
Where notice goes
{{ lgNotice }}
{{ lgSurplus }}

Cyber liability

{{ cyCarrier }}
{{ cyIns }} · {{ cyInsAddr }}
Broker: {{ cyBroker }} · CC {{ cyCc }}
Policy no.
{{ cyPolicyNo }}
Status
{{ cyStatus }}
{{ cyDaysLeft }}
Policy period
{{ cyEffective }} – {{ cyExpires }}
{{ lgCyberCaret }}
{{ cf.k }}
{{ cf.v }}
{{ cf.n }}
Insuring agreements & limits
{{ cv.k }}
{{ cv.v }}
{{ cv.r }}
{{ cv.n }}
{{ cyExtendedReporting }}
Who to contact
{{ cc2.name }}
{{ cc2.title }}
{{ cc2.phoneLine }}
Not covered
{{ ex }}

Claims & broker representatives

Call these people first, before the panel, before anyone else.
{{ lgRepsCaret }}
{{ ct.role }}
{{ ct.name }}
{{ ct.title }}
{{ ct.email }}
{{ ct.phone }}
{{ ct.note }}

Approved panel attorneys

Engage from this panel only. Anything outside it needs the principal broker’s written approval, and the carrier may refuse to reimburse fees for counsel it did not approve.
{{ lgPanelCaret }}
Firm & focus
Rate
Panel status
{{ pa.firm }}
{{ pa.attorney }}
{{ pa.focus }}
{{ pa.note }}
{{ pa.rate }}
{{ pa.retainer }}
{{ pa.status }}
{{ pa.sinceNote }}
Currently on:

Renewal & loss summary

What every matter has cost so far, split by who paid. The figures Connors needs to remarket the E&O policy.
{{ lgRenewalCaret }}
{{ lgRenewalTermLabel }}
{{ lgNoOpenDateNote }}
{{ rf.k }}
{{ rf.v }}
{{ rf.n }}
Prior policy terms
{{ rf2.k }}
{{ rf2.v }}
{{ rf2.n }}
{{ os.k }}
{{ os.v }}
{{ os.n }}
Lease reminders
Fires at 24, 12 and 6 months out, then every month inside 6
{{ al.tag }}
{{ al.office }}
{{ al.note }}
{{ al.left }}

Subleases, desks we rent to agents

{{ subNote }}
Monthly in
{{ subIncome }}
{{ subOffsetNote }}
Occupied
{{ subSqft }}
{{ subCount }}
Agent
Location
Sq ft
Monthly
Status
No subleases loaded. Desk and office tenancies are lease records. They live in the database behind the permission rules, not in this page. Send the signed agreements to your market center admin and they will be seeded.
{{ sb.since }}
{{ sb.suite }}
{{ sb.officeName }}
{{ sb.sqft }}
{{ sb.rate }}
{{ sb.psf }}
{{ sb.status }}
{{ sb.special }}
{{ sb.notes }}
No office leases loaded. Each office, its landlord, property manager, rent, CAM and expiration, is a record in the database, not a literal in this page. Send the executed leases to your market center admin and the expiration alerts below start working off real dates.

{{ of.name }}

{{ of.status }}
{{ of.address }}
{{ of.size }}
Monthly
{{ of.monthly }}
{{ of.rentNote }}
{{ ff.k }}
{{ ff.v }}
{{ ff.n }}
Lease runway
{{ of.startLabel }}{{ of.endLabel }}
{{ of.renewal }}
Lease documents
{{ of.docMeta }}
📄 {{ od.name }} Open
{{ mtgWhen }}
{{ mtgTitle }}
{{ mtgAttendMeta }}
{{ mtgClock }}
{{ mtgClockNote }}
In the room
Meeting recap

{{ repTitle }}

{{ repSub }}
{{ rs.k }}
{{ rs.v }}
{{ rs.n }}
{{ repGapNote }}
{{ rb.title }}
{{ rb.ran }}
{{ rg.label }}
{{ rl }}
Nothing captured in this block.
Action items by owner
{{ repActionMeta }}
{{ ro.ini }} {{ ro.count }}
{{ ri.text }} — {{ ri.tag }}
Run of show
{{ segAt }} · {{ segMins }}

{{ segTitle }}

{{ segNote }}
{{ segPace }}
{{ dl.k }}
{{ dl.n }}
{{ tb.label }}
Topic
Date
Time
Zoom
In person
{{ er.topic }}
{{ er.date }}
{{ er.time }}
{{ er.zoom }}
{{ er.inperson }}
{{ sx.label }}
{{ it2.text }}
Nothing captured yet.
{{ mtgStepMeta }}

Action items

{{ mtgActionMeta }}
{{ mtgFoundLine }}
{{ ac.text }}
{{ ac.meta }}
{{ ac.who }} ✓ In Tasks
Past meetings
No archived meetings yet, ending a meeting saves it here.
{{ mh.date }} {{ mh.present }} {{ mh.ranNote }} {{ mh.openNote }}
{{ mn.head }}
{{ ln }}
Who to call for an update
One row per builder contact, ordered by how much they are holding. Ring them once about everything they have rather than a file at a time, then mark them asked so the list ages.
{{ ncCallSummary }}
{{ ncCallMsg }}
{{ ncCallsNote }}
No builder contacts on file yet. They come off the contract documents, so a file with no paperwork has nobody to ring.
{{ rr.rep }}
{{ rr.builder }}
{{ rr.projects }}
{{ rr.contact }}
{{ rr.openLabel }}
{{ rr.closedLabel }}
{{ rr.noPriceLabel }}
{{ rr.valueLabel }}
{{ rr.askedLabel }}
{{ rf.addr }}
{{ rf.id }} · {{ rf.community }}
{{ rf.agent }} · buyer {{ rf.buyer }}
Escrow: {{ rf.escrow }}
{{ rf.price }}
{{ rf.priceNote }}
{{ rf.state }}
{{ rf.when }}
{{ rf.askTitle }}
{{ rf.askNote }}
{{ rf.problem }}
{{ rf.problemNote }}
Same unit on another file
{{ rf.peerNote }}
{{ rf.notLiveLabel }}
{{ rf.dscCount }}
On the record
Could not open this conversation. Nothing here is missing, it just has not been read.
{{ rf.dscErr }}
Opening the conversation.
Ask directly
{{ rf.dscAudienceNote }}
Nothing on the record for this file yet. What is said here stays with the contract, so the next person picking it up sees it.
{{ dm.avText }}
{{ dm.who }} {{ dm.when }} {{ dm.toLine }} Sent
{{ dm.body }}
{{ dp.name }}
{{ rf.dscUploadNote }}
{{ rf.dscFileErr }}
Record what you were told
{{ rf.statusHint }}

Closing forecast

{{ ncForecastMeta }}
{{ m3.value }}
{{ m3.label }}
{{ m3.count }}
{{ lg2.t }}
{{ ncForecastNote }}
Offboarded, pending closings
{{ ncOffTotal }}
{{ ncOffNote }}
{{ oa.name }} {{ oa.amt }}
{{ oa.meta }}
No offboarded agents have pending closings right now.
Property
Agent & buyer
Price
GCI / company
Est. close
Status
{{ r3.addr }}
{{ r3.sub }}
{{ r3.agent }}
{{ r3.buyer }}
{{ r3.price }}
{{ r3.gci }}
{{ r3.co }}
{{ r3.remain }}
{{ r3.close }}
{{ r3.closeNote }}
{{ r3.status }} {{ r3.advLabel }} Offboarded agent
No contracts match this view.
{{ ncNotLoadedNote }}
Start here
“{{ quoteText }}”
{{ quoteBy }}
{{ quoteMeta }}
The room
{{ huddleProgress }}
Attendance
Click a name to cycle In / Late / Remote / Left early / Out. Anyone marked Out is skipped in the rotation, and the day's roll is archived below with the commitments.
Parking lot
Longer topics or blockers, capture them here and solve after the huddle.
Nothing parked.
{{ pl.text }} {{ pl.by }}
Commitment & attendance log
No commitments logged yet. They'll show up here after the first huddle.
{{ cl.date }} {{ cl.text }} {{ cl.statusLabel }}
Huddle wrapped
{{ wrapHeadline }}
{{ wrapNote }}
{{ hpIni }}
{{ hpName }}
{{ hpRole }}
{{ c.label }}
{{ huddleTimeLabel }}
{{ g.title }}
{{ g.note }}
{{ r2.title }}
{{ r2.sub }}
{{ r2.tag }} {{ r2.due }}
{{ g.emptyNote }}
"{{ hpYesterdayText }}"
Marked: {{ hpYesterdayStatus }}
Today's commitments
{{ c2.text }}
{{ s2.k }}
{{ s2.v }}
{{ s2.n }}

Council goals

{{ alcGroupMeta }}
No council goals have been set for this year. Add the ones the council actually committed to, with the number each is tracking to, and this becomes the board they are held to.
{{ g.title }}
{{ g.sub }}
{{ g.pct }} of goal{{ g.gapNote }}
of {{ g.target }}
{{ g.tag }}

Members & their goals

{{ alcMemberMeta }}
Seat someone on the council
{{ alcPoolNote }}
{{ alcSeatMsg }}
{{ alcAddNoneNote }}
{{ ah.name }}
{{ ah.sub }}
Nobody is tagged to the council yet.
Open the Roster, click an agent, and tick On the ALC. They show up here with their own goal list the moment you save.
{{ m2.ini }}
{{ m2.name }}
{{ m2.sub }}
{{ m2.tag }}
{{ mg.title }}
{{ mg.sub }}
{{ mg.pct }} · {{ mg.gapNote }}
of {{ mg.target }}
Photos and logos
{{ imgCount }}
Headshots and logos live in the database, not in the design file, so they follow the Hub to any market center and anyone with the right can change them. A picture is filed against the person or the team it is of, so uploading a new one replaces the old rather than leaving two.
You can see what is on file here. Changing photos and logos needs the Change photos and logos right.
{{ imgMsg }}
Reading what is on file.
The pictures have not been read yet. Nothing is missing, this list just has not loaded.
Staff headshots
{{ ph.alt }} {{ ph.initials }}
{{ ph.name }}
{{ ph.note }}
{{ ph.when }}
{{ ph.tooBigNote }}
Show
Team logos
{{ imgTeamsNote }}
{{ imgTeamsMsg }}
{{ tl.alt }} {{ tl.initials }}
{{ tl.name }}
{{ tl.note }}
{{ tl.when }}
The market center
{{ hl.alt }} {{ hl.initials }}
{{ hl.name }}
{{ hl.note }}
{{ hl.when }}
Module permissions
{{ rightsCount }}
{{ rightsScopeNote }}
{{ rightsErr }}
Reading the catalog…
{{ rightsEmptyNote }}
Staff
{{ rc.label }} Restricted
{{ rg.name }} {{ rg.tier }}
saving…
Roster audit
Imports never delete anyone. When a report doesn't line up with the roster, it lands here for a person to decide, and the decision is stamped with a name and a time.
{{ auditCount }}
{{ auditEmptyNote }}
{{ ar.name }} {{ ar.kind }}
{{ ar.detail }}
{{ ar.sub }}
Recently resolved
{{ ad.line }}
Database
{{ cloudStatusLine }}
{{ cloudBadge }}
Where your numbers are coming from
{{ srcLead }}
{{ sc.what }}
{{ sc.where }}
{{ captureNote }}
{{ captureResult }}
✓ {{ cloudNote }}
{{ cloudErr }}
{{ cloudHelp }}
{{ demoNote }}
· {{ dm.line }}
Administrative rights
{{ adminBanner }}
Acting as

Staff access

{{ staffMeta }}
{{ p.avText }} 🥔
{{ p.name }} {{ p.tier }}
{{ p.role }} · {{ p.email }}
{{ p.contact }}
{{ p.load }}
{{ p.loadNote }}
{{ p.status }}
{{ p.selfNote }}
Details — {{ p.name }}
{{ p.editNote }}
Rights — {{ p.name }}
{{ p.rightsNote }}

Notices sent

{{ noticeMeta }}
Nothing sent yet. Terminating someone emails every active team member with that person's open assignments, and each reassignment emails the new owner.
{{ nt.kind }}
{{ nt.subject }}
{{ nt.when }}
To: {{ nt.to }}
{{ nt.body }}
{{ evDraftMsg }}
{{ evDraftTitleBar }}
{{ evDraftErr }}
What kind
Name it
Starts
Ends
Where
Who is running it
Shown to whoever gets the invitation, so it can be the market center itself.
Seats
In person or online
Joining link
Only sent to people who confirm they are joining online, never in the invitation.
Web address of the image
It has to live somewhere on the web the recipient’s mail app can reach, a Canva share link, or Google Drive set to “anyone with the link”. A file on your computer cannot travel in an email. Never goes on the text message.
Describe it, for anyone who cannot see it
What it is about
Guest places
Top of the screen
Because it is featured at the top
Cost today
Promotion, if any
Offer ends
Tickets
Where people register
Their registration page
Picture on the block
The photo behind the title at the top of the screen. A web address, same as the email picture. The Hub has nowhere to keep an uploaded file yet.
If the dates are not out yet
Fill this in and it shows instead of the date. There is no countdown until real dates are published.
{{ focusHero.kicker }}
{{ focusHero.title }}
{{ focusHero.when }}
{{ focusHero.where }}
{{ focusHero.days }} {{ focusHero.daysWord }}
No countdown until the dates are published
{{ focusHero.tickets }} {{ focusHero.travel }}
Cost today
{{ focusHero.cost }}
On offer
{{ focusHero.promo }}
{{ focusHero.promoLeft }}
Going from our office
{{ focusHero.agents }} agents, {{ focusHero.staff }} staff, {{ focusHero.guests }} guests
{{ focusHero.staffNames }}
{{ focusHero.lastTime }}
{{ fb.kicker }}
{{ fb.title }}
{{ fb.when }}
{{ fb.where }}
{{ fb.days }} {{ fb.daysWord }}
Dates not published yet
{{ fb.tickets }} {{ fb.promoLeft }}
{{ fb.promo }}
{{ fb.cost }}
{{ fb.agents }} agents · {{ fb.staff }} staff · {{ fb.guests }} guests
{{ fb.note }}
{{ evErr }}
{{ evMsg }}
Nothing on the calendar yet
No classes, trainings or events have been created. Creating one lays out its prep checklist automatically and opens the invitation list.
{{ evKind }}

{{ evTitle }}

{{ evWhen }}  ·  {{ evWhere }}
{{ ec.k }}
{{ ec.v }}
The public page
{{ evPubSince }}
Not online. Putting it up gives it its own page that anybody can open and reply on, without an invitation and without signing in. Everyone who replies lands on the same list as the people you invited from the roster.
{{ evPubUrlWord }} {{ evPubUrl }}
{{ evPubUrlNote }}
{{ evPubNoUrlNote }}
{{ evPubSignedUp }} {{ evPubSignedWord }}
{{ evPubMsg }}
{{ evPubErr }}
Who is this going to?
{{ evPickedLine2 }}
Leadership and staff · {{ evStaffCount }}
{{ sp.name }}
{{ sp.note }}
Agents · {{ evAgentCount }}
{{ ap.name }}
{{ ap.note }}
{{ evActionMsg }}
{{ evActionErr }}
Delete this event?
{{ evSubject }}
{{ evDelWhat }} Nothing about it will be recoverable. Anything still waiting to send is stopped first, so nothing fires at an event that is gone. If people have already been told it is happening, cancelling is usually kinder than deleting, because they get told again.
Cancel this event and tell people
{{ evSubject }}
Why, in a sentence they will read
Tell
Tell people it has changed
Edit the event first, then send this. It carries the new time and place, and says their reply still stands.
What changed
Tell
{{ ts.k }}
{{ ts.v }}
{{ ts.n }}

{{ calTitle }}

{{ calMeta }}
{{ dw }}
{{ cc.num }}

Classes we teach

{{ trClassMeta }}
No class schedule loaded. Classes are a market center record and live in the database, not in this page. Send the schedule to your market center admin and it will be seeded. Nothing here is invented in the meantime.

Engagement

{{ engNote }}
DEPARTED
{{ er2.sub }}
{{ er2.count }}
{{ er2.last }}
{{ er2.tier }}
Nobody is on the list yet. Add from the roster, and each person gets their own private link.
PersonReplyBringing
{{ g.name }} NOT KW STAFF
{{ g.email }}
{{ g.rsvp }} {{ g.guestName }}
These are the same rows the Tasks tab shows. This is not a copy. Tick one off in either place and it is done in both.
Follow up with the people on this one
One task each, carrying the person, so it lands on their own record as well as the board. Nobody gets two.
{{ evFollowMsg }}
{{ fr.outcome }}
No prep tasks on this one.
TaskDueWhoStatus
{{ tk.title }} {{ tk.due }} {{ tk.note }} {{ tk.owners }} {{ tk.status }} · {{ tk.priority }}
The plan in use
{{ tpName }} PINNED
{{ tpWhy }}
Use a different plan
{{ tpHeadline }}
{{ tpDetail }}
{{ tpAskLine }}
{{ tpAskDetail }}
A short-notice class and an event six months out should not get the same number of messages, so the plan is chosen by how far out the event is unless you pin one. Dates below are worked out from this event's start. Anyone who says no drops out; anyone who says yes stops being asked and starts being reminded.
No touches yet. You can still send by hand below.
{{ t.when }}
{{ t.spacing }}
{{ t.channel }} ADDED BY HAND {{ t.purpose }}
Goes to {{ t.onlyIfLabel }}
{{ t.note }}
{{ t.status }}
{{ t.askLine }}
{{ t.askDetail }}
Adding to the plan changes every event that uses it. The second only ever touches this one.
What has actually gone out
Nothing has been sent about this event yet.
{{ pr.rsvp }} {{ pr.line }} {{ pr.pending }}
Every message, newest first
{{ lg.when }} {{ lg.channel }} BY HAND
{{ lg.subject }}
{{ lg.why }}
{{ lg.state }}
{{ tpEditTitle }}
{{ tpEditNote }}
Days before
Hour (0-23)
When it goes
By
Saying
To
Note to yourself
{{ rmErr }}
{{ rmMsg }}
{{ rmDayLabel }} Click anything that reads Open to book it.
No rooms set up
Rooms are records, add them and this fills in. Nothing here is invented.
{{ rb.site }} {{ rb.addr }}
Time
{{ rh.name }}{{ rh.sub }}
{{ rr.label }}{{ rr.note }}
Outside business hours
{{ rmOutsideNote }}
{{ ro.label }} {{ ro.room }} {{ ro.purpose }}
Book a room

{{ rmBookRoom }}

{{ rmDayLabel }} · {{ rmBookWhen }}
This is the training room. An agent asking for it goes through as a request; a staff member booking it for them is the approval.
Door sheets
Print today for one room and tape it outside that room. Reprint it if anything changes.
{{ rmSheetMc }}
{{ rmSheetRoomName }}
{{ rmSheetWhere }}
{{ rmSheetDay }}
Reading the day…
{{ rmSheetErr }}
{{ sr.label }}
{{ sr.state }}
{{ sr.purpose }}
{{ sr.note }}
Anything that reads Open is free. To hold it, book it in The Hub, not on this page.
Health
Every automatic part of the Hub, and whether it is working. Checked every fifteen minutes, and again in full at 11 PM.
{{ shMsg }}
{{ shWord }}
{{ shSub }}
{{ mc.name }} {{ mc.chip }}
{{ b.code }} {{ b.title }} {{ tg.text }}
{{ b.detail }}
What to do{{ b.fix }}
{{ v.who }} {{ v.money }}
{{ v.line }}
{{ v.verdict }}
Gray is not “unknown”, it is “tripped”. A check that has gone past its own deadline without reporting counts against every light above it, so a monitor that dies shows red rather than freezing on green. The codes are there so you can say one out loud or screenshot it.
{{ tagErr }}
{{ tagMsg }}
Add a tag
Tag an agent once and you can invite the whole group in one click. A name that already exists is refused, so two spellings of the same team can never both be in the list.
No tags yet
Add one above. Until then, the only group you can grab is everybody on the roster.
Everyone tagged {{ tagMergeFrom }} moves to whichever tag you pick, and {{ tagMergeFrom }} is removed. Use this when the same team ended up with two spellings.
In use
Renaming changes it everywhere it is used.
{{ tg.label }}
{{ tg.countLine }}
Removes it from {{ tg.people }} {{ tg.people_word }}. Sure?
Retired
Out of the way, but still on the records of everyone who had them. This is usually what you want for a team that has left.
{{ rt.label }}
Still on {{ rt.people }} {{ rt.people_word }}
Worth filling in
{{ sendMissing }}
{{ sendErr }}
{{ sendMsg }}
Every invitation signs off like this
{{ ln }}
Everyone who can send
Each person’s messages leave their own mailbox, so the name on the signature and the address it came from are never two different people. Any event can be handed to any of them.
{{ w.title }}
{{ w.reads }}
{{ w.from }}
{{ w.waiting }} {{ w.badge }}
Who signs it
A message signed by a person gets read. One signed only by a company gets filed as bulk.
Signed by
Sends through {{ sendFrom }} · {{ sendScriptState }}
Your own details on it
Yours only. Nobody sets anybody else’s.
Title
Direct number
The office, in the footer
A real postal address is the strongest signal a message came from an actual business. It is also what commercial email is expected to carry.
Office address
Office number
No sign sets loaded yet
This is a shell, and it is empty because nothing has been loaded, not because nothing is out.
·{{ sr }}
{{ sgErr }}
Nothing to show
Partners live in the database
{{ ptNoneNote }}
No partners entered
{{ ptEmptyNote }}

{{ pg.label }}

{{ pg.note }}
{{ pg.count }}
{{ pg.sponsorTotal }} sponsored
{{ tr2.label }} {{ tr2.note }} {{ tr2.count }}
{{ pt.name }} {{ pt.kind }} ★ Priority
{{ pt.note }}
{{ pt.contact }}
{{ pt.role }}
{{ pt.reach }}
Since
{{ pt.since }}
Sponsored
{{ pt.sponsorTotal }}
{{ pt.sponsorCount }}
{{ sp.event }} {{ sp.date }} {{ sp.amount }}
{{ pt.taskNote }}
Create a task about {{ pt.name }}
{{ pt.taskHint }}
Edit {{ pt.name }}
Log a sponsorship
{{ pt.editNote }}
Joint ventures under {{ pt.name }}
{{ jv.name }} {{ jv.status }}
{{ jv.note }}

Pending closings by departing agents

{{ offPendingMeta }}
{{ oc.k }}
{{ oc.units }}
units
{{ oc.volume }}
{{ oc.n }}
{{ og.when }}
Units
{{ og.units }}
Volume
{{ og.volume }}
Company dollar
{{ og.co }}
{{ oi2.kind }}
{{ oi2.addr }}
{{ oi2.price }}
{{ oi2.close }}
{{ offPendingNote }}

{{ leadBoardTitle }}

{{ leadBoardMeta }}
{{ leadEmptyTitle }}
{{ leadEmptyNote }}
{{ it.title }}
{{ it.meta }}
{{ it.pct }}
{{ it.ownerInitials }} {{ it.tag }} {{ it.due }}
{{ cs.label }}
{{ cs.v }}
{{ cs.sub }}
Log an advance
Company:
{{ caDraftCostLine }}
No advances logged yet, log the first one above. Track every advance an agent takes so the pattern is visible before it becomes a problem.
Not read
{{ caNotLoadedNote }}
{{ caHeldNote }}
{{ caUnknownNote }}
{{ caReplNote }}
Held on this browser
{{ caStuckNote }}
{{ caMsg }}
{{ g.agent }} Frequent — {{ g.uses }} advances
{{ g.roll }}
{{ g.clearedNote }}
Say what was confirmed and with whom, so the next person to look does not have to ask. The flag comes back on its own if a new advance is funded after today.
{{ cr.company }} {{ cr.property }} {{ cr.amount }} {{ cr.feeLine }} {{ cr.dates }} {{ cr.termsLine }} {{ cr.status }}
{{ cr.notes }}
HubSign · audit trail

Who sent what, who signed it, when

One line per event, across onboarding, offboarding and property management. Written as it happens, a send, a reminder, a signature, a void. Never typed in afterwards. This is the record to reach for months later, when the question is whether something was actually executed.
{{ sigRepCount }}
{{ sigRepEmptyCopy }}
{{ srr.when }} {{ srr.ref }} {{ srr.actLabel }}
{{ srr.subject }} {{ srr.dept }} · {{ srr.packet }} · {{ srr.method }} · recorded by {{ srr.by }} Signer: {{ srr.who }} Documents: {{ srr.docs }} {{ srr.detail }}
{{ sigRepTrunc }}
Company dollar on two clocks

Cap year vs calendar year

A month reconciles because both sides are the same calendar month. Year to date, year on year and an agent’s cap total do not, because a cap year starts on that agent’s anniversary. This report holds both frames next to each other so the difference can be read rather than chased. It changes nothing on the cap board.
{{ cfWindowLine }}
No monthly figures imported yet
Both frames are built from the per-agent Multi-Year Trends Actuals CSVs, month by month. Load them under Data imports and this report fills in. The cap ledger alone cannot drive it. It reports one cap-year-to-date number that cannot be split into calendar months.
Calendar year to date
{{ cfCalTotal }}
Cap years to date
{{ cfCapTotal }}
Difference
{{ cfDiff }}
{{ cfPlain }}
{{ cfTxLine }}
{{ f.k }}
{{ f.v }}
{{ f.n }}

Agent by agent

{{ cfCount }} with monthly figures
Agent Anniversary Cap year to date Prior cap year, same months Last closed cap year Calendar YTD Trailing 12 Cap frame − calendar Missing from import
{{ r.name }} MREA NOT MATCHED
{{ r.anniv }}
{{ r.annivNote }}
{{ r.capYtd }}
{{ r.capMonths }}
{{ r.prior }}
{{ r.priorPct }}
{{ r.priorWindow }}
{{ r.closed }}
{{ r.closedWindow }}
{{ r.calYtd }}
{{ r.calPct }}
{{ r.calPrev }} last year
{{ r.t12 }}
{{ r.delta }}
{{ r.carry }}
{{ r.gaps }}
{{ cfCoverage }}
{{ cfMreaNote }}

Monthly Transmittal

The figures from each month’s transmittal, split into leading indicators (recruiting activity and projected closings. What the next 60–90 days look like) and lagging indicators (what actually hit the books). Log a month per transmittal and the sheet builds the trend.
Log transmittal figures
One entry per month, type the figures in, or upload the transmittal email / income statement (PDF or screenshot) and we’ll read them off. Logging the same month again replaces it.
Reading the transmittal…
{{ transExtractError }}
Reading the trends…
{{ transAiError }}
Leading indicators
{{ transNcHint }}
Lagging indicators
AI read, profit & growth drivers
• {{ al.t }}
{{ transAiWhen }} · Based only on the months logged in this sheet.
No months logged yet, log the first transmittal above and the trend sheet appears here.
Metric
{{ tm.label }}
Δ MoM
{{ row.groupHead }}
{{ row.label }}
{{ c.v }}
{{ row.deltaLabel }}
{{ tn.t }}
Months logged: {{ tc.label }}

The Delta Report

Weekly Oahu value screen, listings priced at, near, or below tax-assessed value. An evaluation tool for advising buyers and sellers and reading the market. It is not a call or prospecting list; every listing is already represented.
Run the engine, upload this week's raw exports
Upload the single-family and condo/townhome MLS exports (.csv) and, when a new month posts, the HBR Monthly Stats Report (.pdf). This computes Value / Motivation / Signal per listing here. It's an in-browser approximation of the SOP's scoring method, not the exact branded PDF/Excel output.
SF: {{ deltaSfName }}
Condo: {{ deltaCondoName }}
Reading the HBR report…
{{ deltaHbrError }}
HBR: {{ deltaHbrName }}
Top listings per district:
Health check
{{ hl }}
{{ deltaTop1Line }}
Single-family, top listings by district
{{ dd.district }}
{{ rr.address }} {{ rr.price }} Gap {{ rr.gapPct }} DOM {{ rr.domVsMkt }} Proj {{ rr.projGapPct }} V{{ rr.value }} / M{{ rr.motivation }} / S{{ rr.signal }} {{ rr.flags }}
Condo/townhome, top listings by district
{{ dd2.district }}
{{ rr2.address }} {{ rr2.price }} Gap {{ rr2.gapPct }} DOM {{ rr2.domVsMkt }} Proj {{ rr2.projGapPct }} V{{ rr2.value }} / M{{ rr2.motivation }} / S{{ rr2.signal }} {{ rr2.flags }}
Reading the cover page…
{{ deltaExtractError }}
Log this run
No runs logged yet. After you send this week's report, log it here to build the archive.
{{ dr2.dateLabel }}
{{ dr2.hbrMonth }}
{{ dr2.statsLine }}
{{ dr2.flagsLine }}
{{ dr2.healthNote }}
{{ agSub }}

{{ agName }}

{{ agContact }}
{{ tc2.label }}
{{ f.k }}
{{ f.v }}
{{ f.n }}
Missing from a report
{{ agUnconfirmedNote }}
Either way the record stays and the figures stand. Your decision is logged with your name and the date.
{{ agExitTag }}
{{ agExitNote }}
{{ cp.k }}
{{ cp.v }}
{{ cp.n }}
Every tag this office keeps. Applying one records your name and the date.
This record has no KW ID, so tags cannot be read or set against it. Add the KW ID first.
Reading their tags…
{{ agDocMsg }}
{{ agSaveCount }}
{{ nv.label }}
{{ dt.label }} {{ dt.storedLine }} Nothing stored yet {{ dt.filedLine }}
{{ agDocPrevErr }}
{{ agDocPrevTitle }}
{{ agDocPrevSub }}
{{ agDocPrevTitle }}
{{ agDocPrevNoViewNote }}
Rentals they own and manage
{{ pr.line }}
None listed yet.
The rentals list could not be read, so this may not be empty. Reload before relying on it.
{{ agDocMsg }}
{{ agSaveCount }}
{{ agEditedNote }}
{{ rf.k }}
{{ rf.v }}
{{ rf.n }}
These figures come from the reports. Your sign-in cannot change them, ask an admin if that is wrong. Career status, coaching, ALC, tags and notes stay editable.
🔒 {{ agProductionLockNote }}
Production YTD ($)
Units YTD
This agent's cap ($) {{ agCapNote }}
Company dollar earned
{{ agCoLive }}
{{ agCoNote }}
Values: {{ agValues }}
Goals: {{ agGoals }}
{{ agRecruitedBy }}
No 1:1 recorded yet.
Log a conversation
Logged against your name and today's date. This resets their clock in Retention, so they drop off the call list.
{{ tc.when }} · {{ tc.kind }}
{{ tc.notes }}
Hand something to the team
It goes on the Tasks board carrying this agent, and a dated line appears in their conversation log above.
{{ agTaskMsg }}
{{ o.label }}{{ o.mark }}
Our own coaching, run by Shanna and Mark. Add and remove people on the Coaching tab and it shows here. MAPS is the KW platform, follows the monthly import, and appears in the tag box above.
{{ agTeamMemberCount }}
{{ tm.name }}
{{ agTeamLine }}
How the team caps, one cap between them, own caps, or a rainmaker’s fractions, is set in Cap management → Teams & caps.
{{ agPracticeMeta }}
{{ agClassMeta }} {{ agTier }}
Classes, 12 months
{{ agClassCount }}
Said yes, did not come
{{ agMissedCount }}
Last attended
{{ agLastClass }}
{{ agNoClassNote }}
{{ agClassNote }}
Which chair do they hold? Common ones: {{ agAlcSeatSuggest }}. Type anything. The council makes seats as the year needs them.
{{ agYearsNote }}
{{ cr.k }}
{{ cr.v }}
Leaving the council mid-term
Remove them from the ALC?
{{ agAlcConfirmLine }}
Changing a reported figure
Are you sure?
{{ agConfirmLine }}
Terminate access
{{ termQuestion }}
{{ termDetail }}
What happens immediately
→{{ ef }}
Where each assignment goes
Choose per task. Unassigned pool leaves it open for anyone to grab from Tasks. Naming a person hands it straight to them and tells them it came from {{ termFirstName }}.
{{ tp.title }}
{{ tp.meta }}
{{ termPlanSummary }}
{{ pmdOwner }}

{{ pmdTenant }}

{{ pmdAddr }}
{{ pf4.k }}
{{ pf4.v }}
{{ pf4.n }}
Flagged as the likely variance
{{ pmdSuspectNote }}
{{ pfd.hint }}
Who runs this door
{{ pmdSplitState }}
{{ ps2.pct }}
{{ pmdSplitNote }}
{{ sessWhen }}

{{ sessName }}

{{ sessSub }}
{{ sf.k }}
{{ sf.v }}
{{ sf.n }}
{{ sd2.k }} {{ sd2.v }}
{{ sessRollMeta }}
{{ at2.name }} {{ at2.sub }} {{ at2.rsvp }} {{ at2.came }}
{{ sessNoOneNote }}
Taking the roll

{{ evRollTitle }}

{{ evRollWhen }}
{{ evRollHere }} {{ evRollOf }}
{{ evRollNoneNote }}
{{ evRollErr }}
Coaching record

{{ codName }}

{{ codSub }}
Progress to graduation
{{ codTag }}
{{ codProgress }}
{{ cf.k }}
{{ cf.v }}
{{ cf.n }}
{{ obdTrack }}

{{ obdName }}

{{ obdSub }}
{{ obdStepMeta }}
{{ obdCapNote }}
{{ obdLabelMeta }}
{{ lb.text }}
{{ obdDocMeta }}
📄 {{ od2.name }}
{{ pdIni }}
Staff record

{{ pdName }}

{{ pdNote }}
{{ pdRightsNote }}
{{ pdLoad }}
{{ pdLoadNote }}
{{ ncdKicker }}

{{ ncdAddr }}

{{ ncdSub }}
{{ m4.k }}
{{ m4.v }}
{{ m4.n }}
{{ ncdStatusNote }}
On the record
{{ dscCount }}
Could not open this conversation. Nothing here is missing, it just has not been read.
{{ dscErr }}
Opening the conversation.
Ask directly
{{ dscAudienceNote }}
Nothing on the record for this contract yet. What is said here stays with the file, so the next person picking it up sees it.
{{ em.avText }}
{{ em.when }} {{ em.toLine }} Sent
{{ em.body }}
{{ ep.name }}
{{ dscUploadNote }}
{{ dscFileErr }}
{{ f4.n }}
{{ ncdDocMeta }}
Builder contact
{{ ncdBuilderContact }}
{{ ncdBuilderPhone }}
{{ ncdBuilderEmail }}
Missing documents, follow up with builder
{{ md2 }}
Reading the document and pulling the fields…
{{ ncUploadError }}
Pulled from {{ ncExtractFileName }}. Review before applying
Pulled by Claude from the document text. Check it against the original before relying on it, especially price and dates.
📄 {{ dc2.name }} {{ dc2.kind }} Open ↗ No link on file
Confirm handoff
{{ handoffQuestion }}
{{ handoffDetail }}
{{ dRef }}

Edit task

{{ dStatus }}
{{ dStatusNote }}
{{ dStatusHint }}
{{ dLinkNote }}
{{ dAssignNote }}
{{ dPhaseCount }}
Add a step per person. The step marked On deck is who everyone is waiting on. Nothing moves until they hand off.
{{ tr3.avText }}🥔 ✓
Step {{ tr3.num }} {{ tr3.name }} Has it now
{{ tr3.who }}
Edit the chain
🔒
{{ c.text }}
Blocking {{ bl.title }}
{{ dCompleteWho }}
{{ dCompleteNote }}
{{ dCommentMeta }}
{{ cm.avText }}
{{ cm.by }} {{ cm.when }}
{{ cm.text }}
No notes yet. Anyone on the task can add context here. What you tried, who you called, what you are waiting on.
{{ lg.text }} — {{ lg.by }}
{{ lg.when }}
Nothing recorded yet. Completions, handoffs, reassignments and archiving all land here.
{{ dCloseNote }}
{{ dEditNote }}
🚨 Bulletin, read before you start
{{ bulletinWhen }}
{{ bulletinText }}
Posted by {{ bulletinBy }} · {{ bulletinUntilLine }}
Outside business hours

The desk is closed right now.

You can submit anything you like. It will sit in the queue and be picked up when we open at {{ afterHoursNext }}. Nothing is worked overnight or on weekends.

If it is urgent, draft the contract yourself. An offer that has to go out tonight should not wait on us. Write it, send it, and submit it here afterward for review and cleanup.
Business hours: Monday to Friday, 9:00 AM to 5:00 PM. Queue time is measured in business hours only.