Owing money never stops service; only a manual pause does
A past-due subscription stayed live for seven days and then lost everything on the clock. It now stays live for as long as it is past due. A manual pause was th...
A floor signal's domains, its throttle and what a frame carries [skip ci]
A lead import can name its text consent column, and a source's setting can be saved
The ledger's one tally answers by lead, by hour and by day, and the floor can signal live
DialTally gains what the sales floor's panes need, so none of them count for themselves: a breakdown over a set of leads, hours and days, conversations resting ...
Reports' own-loans scope reads the one role store
The loan officer is backfilled, so every role is a row and the deal's column is a mirror.
A lead source can count its own consent field as text consent, and zones follow NANPA
Off by default, per source. When on, a lead source's chosen consent field writes the SMS consent OutreachCheck already reads, with the proof in LeadConsentValue...
One model for who works a deal, and one list of walls
Deal roles: LoanPartyRole is the catalog, DealRoleAssignment holds a member or SI per role with who assigned it and when. The loan officer stays on the deal, so...
One meaning of stale, a capture's lead note, and a lead's list lines close when it is called
Do Not Contact's stop commits
LeadService runs it after its own commit, where a plain transactional call joins the finished transaction and the write is lost without an error. It now runs in...
One decision: consent records in OutreachCheck, named email hours
An automated text now needs SMS consent on record, read from the contact state the SI's gate reads, on the lead or on a number it holds, and an opt-out there re...
Lead status is the one control for what came of a call
Each LeadStatusType carries an optional fixed contact meaning, and a neutral Contacted (107) covers a conversation with no other status. LeadStatusLabel words t...
The grid row and filter read a lead's own occupancy
Adds propertyOccupancyId to the list row and the grid query, from LeadClaimMortgage, so the board needs no second field.
One source of targets and one count of the floor
OrgGoal is now the only place a target lives, so it gains EACH_MEMBER for a number everyone is held to and outcome ids for a goal on chosen call outcomes. DialT...
Going quiet also reads the communication record
The contact rollup has no history from before it was added, so every older lead read as quiet, including ones called this week. A lead is now quiet only when th...
No next action reads a lead's real tasks
The Tasks tab lists checklist items linked to the lead, and LEAD_TASK is the table those migrated from, so a lead with an open task still read as having nothing...
Put back this file's line endings
The last commit changed them by accident; no code moves here.
Goals, the cockpit switch, per-loan money, and rights 681-683
Goals name a metric, a target and a charter period for the organization, a team or a member, and every figure is measured from a permanent record. Revenue and c...
The SI layer's tables, two rights, and the org switch for SI loan access
Sales floor M11. New tables only, applied by hand. Rights 685 and 686. SI_LOAN_ACCESS is off by default and lifts an org's own SI to loan officer level, read li...
The two-systems guard finds a borrower by phone and email
Almost no lead carries an account, and a loan adopted from another system has no lead, so the guard follows the lead's phone and email to any borrower on a loan...
An outcome answers for its own call, even one reported late
A person's No answer or Voicemail on a dial now corrects that call and no other. A phone sync that arrives afterwards can't put the conversation back, because t...
Mortgage switches for every way a stream reaches a borrower, off by default
Six new MlosAutomationAction switches in BORROWER_OUTREACH, asked by OutreachCheck on every automated send. A mortgage lead, or one tied to a mortgage loan, get...
The append-only dial ledger, call floor settings, and rights 673-674
Attempts and outcomes get a table of their own that is only ever inserted into, and the phone system's calls join the press that started them. PhoneCallLog chan...
A reply leaves a run's timer alone, so a plain wait doesn't end early
Human-send queue, call list, reply signal and SI call settings, and email hours for streams
A run hears a reply through automation_outbox (LEAD_REPLIED) and the run's new read-only replied_at. Human sends and call_list_entries are new tables, call_list...
A board floor on each pipeline, and an index for a lead's loans
leads_from holds every board column to a range of (ORG_ID, DATE_CREATED): 14 seconds down to 3 ms on a market of 795,919 leads. Column already applied by hand; ...
Switches for stage and loan sync, and a move's origin
Three lender switches, off by default: a stage follows its loans, loans follow a stage, and a person's stage move may reach a linked external loan. A transition...
Contact foundation: outcomes, last contact, stop all outreach, consent and the outreach check
Org-named call outcomes on fixed meanings, last attempt and conversation per lead in a new table fed from LeadCommunicationLinker, a lead-level Stop all outreac...
How a lead reads its loans
A lead shows the least advanced loan still in play. Loans that ended unfunded and unfinished archived loans are ignored, funded loans count, and the answer neve...
Stream, version, run and outbox tables, rights 665-666, and the lead-change tap
Dark until SecurityService declares the writer bean and an org publishes a stream. The outbox insert runs in its own savepoint so it can never fail the lead tra...
Pipeline, dropdown field and saved view tables, and rights 661-664
New tables only; leads is unchanged. Positions and dropdown answers use plain lead ids, so they sit in a soft-reference list the lead delete walks, apart from t...
Optional Need Docs, Ready for Submission and Closing Scheduled statuses
Three more stops a lender can add to its pipeline, each off until the organization turns it on, so no other lender sees them and no loan row can carry the new o...
Canonical templates draw spacers without zero-size text
38 templates drew colour bands and gaps as font-size:0 cells holding , which spam filters score as hidden text. EmailService rewrites these at send time f...
An organization's call and meeting notices, declared for KamoInitializer (TPNODISCLOSE)
ai_org_voice_notices: the neutral recording notice (default ON) and whether SIs introduce themselves up front as virtual assistants (default OFF), one row per o...
The updated-invoice email, and what else the customer owes
commerce.invoice_updated tells a customer their invoice was updated, what changed, the old and new amounts and the new due date, with the updated PDF. Both invo...
Updated invoices — later charges go onto the customer's unpaid bill
A seat or license change can now be billed OPEN_INVOICE: when it takes effect its prorated charge is added to the customer's sent, unpaid invoice, which is then...
The role editor and app names say SI, not AI, for the SI Assistant and SI Workforce
WELCOME_SET_PASSWORD, the letter for an account that has no password yet
An administrator who adds a member creates a user with a null password. The plain WELCOME told them to sign in, which cannot work. This letter carries the set-p...
Estimate the next renewal, and find an organization's own subscriptions
For the customer-facing My Bill page: the next renewal as it would be raised today (never saved), and the subscriptions an organization is the target of.
LOAN_ADVERSE_ACTION_CLOCK — the ECOA notice clock for person-made denials is the lender's switch
Owner 2026-10-28: tracking the 30-day adverse-action notice for a loan a person denies in Kamo is one of the automation settings, off by default.
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
