← Back to Site Map

Cash Flow Voids (CFVs) — Standard Operating Procedure

Detection, management, chase tracking, auto-return and resolution of missing rent payments
Version 1.35 · 3 September 2026 · Owner: Kevin Brittain

Quick Reference

Data Source
Airtable — Tenancies table + Transactions table
Key Tables
Tenancies (tblN51a88qTDB6iMH), Transactions (tbln0gzhCAorFc3zB), Tenants (tblX4elTuu01gwBYh)
Payment Check
Has the current rent cycle been paid? A payment up to 5 days early still counts for that cycle
2-Day Tolerance
(CFV_TOLERANCE_DAYS = 2) Used for re-flagging and for how long a dismissal lasts. It is not a waiting period before a new CFV is spotted
Owner
Kevin Brittain
Version
1.35

🔍 1. Overview & Purpose

The Cash Flow Voids (CFVs) tab automatically detects tenancies where expected rent has not been received. It compares each tenancy's rent due day against reconciled bank transactions that are directly linked to that tenancy in Airtable.

There is no separate CFV table in Airtable. CFVs are derived in real time from the Tenancies table and Transactions table every time the tab loads or the dashboard refreshes.

ℹ️ CFVs are detected only for tenancies where the tenant status is Active (not Former), the tenancy is In Payment, and the monthly rent is greater than zero.
💡 When a reconciled transaction linked to a CFV tenancy is detected, the system automatically returns that tenancy to In Payment and adds an audit comment — no manual intervention needed.

🔗 2. How to Access

  1. Open the Leadership Dashboard at app.operationsdirector.co.uk/
  2. Enter your Airtable Personal Access Token (PAT) if prompted. Your PAT must have scopes: data.records:read, data.records:write, data.recordComments:read and data.recordComments:write. The write scope is what lets the tab save its audit comments — including the dismissal tag it later reads back.
  3. Open Leadership Dashboard in the sidebar, then click the Cash Flow Voids button in the bar of buttons across the top of the dashboard. There is no separate Cash Flow Voids item in the sidebar.
  4. The CFV tab loads automatically — detection runs each time you switch to this tab or when the dashboard refreshes.
ℹ️ Direct link: app.operationsdirector.co.uk/#cfv

📊 3. Summary Cards

Five KPI cards appear at the top of the CFV tab, providing an at-a-glance summary:

CardWhat It ShowsColour
Potential CFVsNumber of tenancies auto-detected as likely missed payments, awaiting your review. Only appears if count is greater than zero.Amber border
Confirmed CFVsNumber of tenancies with Airtable status set to CFV (confirmed voids with active chase).Red text
Total ExposureCombined monthly rent (in £) across all CFVs and potential CFVs on the list.Red text
Oldest OverdueThe highest number of days overdue across all CFVs. Shows “Escalation may be required” if over 14 days.Default
CFV ActionedNumber of tenancies marked as CFV Actioned (acknowledged, action taken, awaiting payment confirmation).Amber text

4. CFV Detection Logic

How Detection Works

The detectCFVs() function runs each time the CFV tab renders. It processes every tenancy record and follows two paths:

Path A — Existing CFV / CFV Actioned Tenancies

  1. Run the payment check (described below) on the tenancy.
  2. If the current rent cycle has been paid: add the tenancy to the auto-return queue (see Section 6). It will be returned to In Payment automatically.
  3. If the cycle has not been paid: display the tenancy in the CFV table with its current status.
  4. For CFV Actioned tenancies: if this month’s due day has passed by 2 days or more (CFV_TOLERANCE_DAYS), mark as re-flagged (see Section 10). This is the only place a plain days-since-due count is still used.

Path B — “In Payment” Tenancies (New CFV Detection)

  1. Skip if tenant status is not Active or monthly rent is zero or less.
  2. Run the payment check (described below).
  3. If the cycle has been paid: not a CFV — skip.
  4. If the cycle has not been paid: flag as a Potential CFV for your review.
⚠️ There is no waiting period before a new CFV appears. Path B does not count days since this month’s due day at all. Because the payment check asks for the previous cycle to be paid until this month’s due day has passed by 2 days, a tenant who missed last month shows as a Potential CFV before this month’s due day arrives. That is deliberate: a tenant with a late due day used to stay invisible for most of the month.

The Payment Check — used by both paths

  1. No payment history at all? If not one reconciled transaction is linked to the tenancy, it counts as unpaid straight away, whatever the dates say. This is why a brand-new tenancy flags immediately.
  2. Otherwise, find the most recent reconciled payment linked to the tenancy.
  3. Work out which cycle has to be paid by now. If this month’s due day passed 2 or more days ago, it is this month’s cycle. If not, it is last month’s.
  4. That cycle counts as paid when the most recent payment is dated on or after 5 days before its due day. The 5 days cover standing orders that land early over a weekend or bank holiday.
  5. Paid means not a CFV. Not paid means the tenancy is in arrears and is flagged.
⚠️ Important: Payment detection uses the txTenancy linked record field on transactions — not keyword matching or surname matching. A transaction must be reconciled and linked to the tenancy record in Airtable for the system to recognise it as payment.
ℹ️ There is one fallback. If the arrears engine (js/arrears.js) fails to load, the check drops back to the old rule: any reconciled linked transaction dated in the current calendar month counts as payment. That older rule both missed early payments and accepted unrelated ones, so it is a safety net, not the live behaviour.
Detection Flow Diagram
📅Rent Due DayPer tenancy
🔎Last Linked PaymenttxTenancy, reconciled
🗑Which Cycle Is Due?This month or last
Potential CFVThat cycle unpaid

🔄 5. Status Lifecycle & Transitions

CFV tenancies move through these statuses. The Payment Status field (tenPayStatus) on the Tenancies table in Airtable is the source of truth.

💵In PaymentNormal state
Potential CFVAuto-detected
🚨CFVConfirmed
CFV ActionedAction taken
💵In PaymentResolved
TransitionHow It HappensAirtable Updated?
In Payment → Potential CFVAutomatic: the rent cycle that should have been paid by now has no linked reconciled payment (see Section 4)No — display only in dashboard
Potential CFV → CFVUser clicks “Confirm CFV” buttonYes — PATCH to set status to CFV
Potential CFV → dismissedUser clicks “Not a CFV” button. Only a Potential CFV can be dismissed. The dismissal lasts until the tenancy’s next rent due day plus the 2-day tolerance, then the tenancy is re-checked.Yes — posts a tagged [CFV-DISMISSED:YYYY-MM-DD] comment on the tenancy, as well as saving it in localStorage
CFV → CFV ActionedUser clicks “Mark Actioned” buttonYes — PATCH to set status to CFV Actioned
CFV Actioned → In PaymentUser clicks “In Payment” button, or automatically when a reconciled linked transaction is detectedYes — PATCH to set status to In Payment
CFV Actioned → CFVUser clicks “Move to CFV” button, or user confirms a re-flagYes — PATCH to set status to CFV
CFV / CFV Actioned → In PaymentAuto-return: the payment check finds the current rent cycle paid by a reconciled transaction linked to this tenancyYes — automatic PATCH + audit comment
🛑 Potential CFV is a dashboard-only status. It does NOT exist in Airtable. The tenancy remains “In Payment” in Airtable until you click “Confirm CFV”.

🔄 6. Auto-Return to In Payment

When the payment check (Section 4) finds that a tenancy currently in CFV or CFV Actioned status has cleared its current rent cycle, it automatically:

  1. Sets a local flag (cfv_{id}_returned) to prevent the tenancy from re-appearing before Airtable syncs.
  2. Sends a PATCH request to Airtable to update the tenancy’s Payment Status to In Payment.
  3. Clears all chase tracking data from localStorage (chase start date, return dismissal, and the dead legacy start-date key — see Section 15).
  4. Updates the local data array so the dashboard reflects the change immediately.
  5. Adds an audit comment to the Airtable tenancy record: “Auto-returned to In Payment — reconciled transaction linked to this tenancy detected for [Month Year].”
  6. Re-renders the CFV tab and updates the sidebar badges.
💡 If the Airtable PATCH fails, the local flag is removed so the auto-return will retry on the next page load or tab switch.

When this runs

Not only on the CFV tab. Auto-return is a side effect of CFV detection, and detection runs on four paths — every one of them can write to Airtable:

  • Every dashboard load or refresh. The sidebar badge count runs detection, so opening the dashboard on any tab can auto-return a tenancy without you ever visiting the CFV tab. It happens twice on a cold load: once on the cached render, once when the fresh Airtable data lands.
  • Opening or re-rendering the CFV tab.
  • After a reconciliation. The badge refresh runs the moment a transaction is reconciled, which is usually what makes the payment findable in the first place.
  • When the AI assistant gathers CFV context while the CFV tab is open.
⚠️ This means a status change and an audit comment can appear in Airtable from a page view alone. If a tenancy comes back as In Payment and nobody remembers touching it, this is why. The cfv_{id}_returned flag stops it repeating within one browser, but it is local, so a different browser or a cleared cache can run it again.
🚨CFV / CFV Actioned
🔎Linked Tx FoundClears the due cycle
📤PATCH AirtableStatus → In Payment
💬Audit CommentAuto-logged
💵In PaymentResolved

📋 7. CFV Table & Columns

The CFV table displays all detected cash flow voids, sorted by status (Potential first, then CFV, then CFV Actioned) and then by due day.

ColumnSourceDescription
TenanttenSurname + tenRefTenant surname (bold) with tenancy reference below in grey.
PropertytenProperty + tenUnitRefProperty name with unit reference below.
RenttenRentMonthly rent amount in £, right-aligned with tabular numerals.
Due DaytenDueDayThe day of the month rent is due (e.g. 1, 15, 28).
Days OverdueCalculatedDays since the rent cycle that the last received payment did NOT cover (see below). Colour-coded: black (0–3), amber (4–7), red (8+).
Last PaymentCalculatedThe date and amount of the most recent reconciled transaction linked to this tenancy. This is the figure the Days Overdue count is built from.
StatustenPayStatusBadge: Potential CFV, CFV, CFV Actioned, or Re-flagged
ContacttenantPhone + tenantEmailClickable phone (tel:) and email (mailto:) links. Shows warning if no contact info.
ActionsContext-sensitive action buttons (see Section 8).
Days Overdue Calculation

Days overdue is worked out live from the last rent payment actually received for that tenancy. Nothing is stored on your computer, so the number is the same on every device.

  1. Find the most recent reconciled transaction linked to the tenancy. That is the last payment.
  2. Add 5 days to that payment date (CFV_EARLY_PAY_DAYS = 5). A tenant who pays up to five days early has still paid that month, and without this the payment would be credited to the wrong cycle.
  3. The cycle that payment covered is the latest rent due day on or before that adjusted date. The next due day after it is the one now outstanding.
  4. Days overdue = today minus that outstanding due day, minimum 0.
  5. If the tenancy has no payment history at all, the count runs from the most recent due day that has already passed — this month’s if it has been and gone, otherwise last month’s.
ℹ️ Clearing your browser data does not reset this figure any more. If the number changes, a payment was reconciled, unreconciled, or relinked to a different tenancy.

🔨 8. Action Buttons Reference

Each row in the CFV table shows different action buttons depending on the tenancy’s current status. Every status-changing action shows a confirmation dialog before proceeding.

When status is: Potential CFV

ButtonAppearanceWhat It Does
Confirm CFVRed background, white textAfter confirmation dialog: sends PATCH to Airtable to set status to CFV. Adds audit comment “Confirmed as CFV from Leadership Dashboard.” Re-renders CFV tab after 1.5s, reloads dashboard after 3s.
Not a CFVGreen/success styleAfter confirmation dialog: stores the dismissal timestamp in localStorage (cfv_dismissed_{id}) and posts a tagged comment to the tenancy in Airtable — “[CFV-DISMISSED:YYYY-MM-DD] Dismissed as not a CFV from Leadership Dashboard. Payment confirmed via other means.” Clears chase tracking data. Expires at the tenancy’s next rent due day plus the 2-day tolerance, then the system re-checks. Only a Potential CFV can be dismissed.

When status is: CFV

ButtonAppearanceWhat It Does
Mark ActionedBlue/primaryAfter confirmation: PATCHes Airtable to set status to CFV Actioned. Adds audit comment. Button shows “Done ✓” in green on success.
💬 CommentsDefault style, shows countOpens the comments panel for this tenancy (see Section 11). Shows the number of existing comments as a badge.

When status is: CFV Actioned

ButtonAppearanceWhat It Does
In PaymentGreen/successAfter confirmation: PATCHes status to In Payment. Clears all localStorage tracking. Adds audit comment “Returned to In Payment from Leadership Dashboard. Payment confirmed.” Sets local returned flag.
Move to CFVRed border, red textAfter confirmation: PATCHes status back to CFV. Adds audit comment “Moved back to CFV from CFV Actioned via Leadership Dashboard.”
💬 CommentsDefault, shows countOpens comments panel.

When status is: Re-flagged (CFV Actioned + overdue)

ButtonAppearanceWhat It Does
Confirm CFVRed backgroundAfter confirmation: PATCHes status back to CFV. Adds comment “Re-flagged as CFV — payment not received on next due date.” Clears re-flag dismissal.
DismissDefaultStores dismissal in localStorage. The re-flag badge disappears but the tenancy stays as CFV Actioned.
💬 CommentsDefault, shows countOpens comments panel.
ℹ️ All buttons show “...” while processing and are disabled to prevent double-clicks. On success they show “Done ✓” or “Confirmed ✓”. On failure they show “Failed” and re-enable.

💬 9. Chase Stage Tracking

Each CFV is assigned a chase stage based on how many days have passed since the chase was initiated. Chase stages never trigger automated communications.

⚠️ There is no Chase column on the table any more. The stage is still worked out in the background and the clock still starts the first time a tenancy appears as a Potential CFV or CFV, but nothing on screen shows it. Treat the table below as a description of the timings the code uses, not of something you can read off a row. If you want the chase stages back on screen, that is a build request, not a settings change.
StageDays Since Chase StartLabelDescriptionBadge Colour
Stage 10+ daysFriendly reminderInitial stage — contact the tenant informally to remind them of the missed payment.Blue/default
Stage 23+ daysFollow-up chaseIf Stage 1 hasn’t resolved, escalate to a more formal follow-up.Amber
Stage 37+ daysEscalationFormal escalation — may require letters, legal references, or management review.Red
⚠️ The chase clock starts only for Potential CFV and CFV tenancies, never for CFV Actioned ones. The chase start date is stored in this browser only, under cfv_{id}_chaseStart, and persists across sessions on that browser. It is the only CFV date that lives in your browser — Days Overdue does not (see Section 7).

⚠️ 10. Re-Flagging Logic

A CFV Actioned tenancy can be automatically re-flagged if the next month’s due date passes without payment. The system checks:

  1. Is the tenancy currently CFV Actioned?
  2. Has the due day for the current month already passed?
  3. Have at least 2 days (CFV_TOLERANCE_DAYS) elapsed since the due day?
  4. Has the user previously dismissed this re-flag? (Check cfv_reflag_dismissed_{id} in localStorage.)

If all conditions are met and the re-flag hasn’t been dismissed, the row shows a “Re-flagged ⚠” badge in amber/warning style, along with “Confirm CFV” and “Dismiss” buttons.

💡 Re-flagging ensures that “CFV Actioned” tenancies don’t get forgotten. If the tenant was promised to pay and misses the next due date, the system brings it back to your attention.

📝 11. Comments & Audit Trail

Every CFV action creates an audit comment on the Airtable tenancy record via the Comments API. You can also view and add comments manually.

Automatic Comments

The following actions automatically add a comment to the tenancy record:

  • Confirming a potential as CFV: “Confirmed as CFV from Leadership Dashboard.”
  • Dismissing a potential: [CFV-DISMISSED:YYYY-MM-DD] Dismissed as not a CFV from Leadership Dashboard. Payment confirmed via other means.” The date tag is what the dashboard reads back — do not edit or delete these comments.
  • Marking as CFV Actioned: “Status changed to CFV Actioned from Leadership Dashboard.”
  • Returning to In Payment: “Returned to In Payment from Leadership Dashboard. Payment confirmed.”
  • Moving back to CFV: “Moved back to CFV from CFV Actioned via Leadership Dashboard.”
  • Re-flagging: “Re-flagged as CFV — payment not received on next due date.”
  • Auto-return: “Auto-returned to In Payment — reconciled transaction linked to this tenancy detected for [Month Year].”

Dismissals are restored from these comments

When the CFV tab loads on a computer that has no record of a dismissal — a different device, a new browser, or after clearing browser data — it reads the tenancy’s Airtable comments and looks for the newest [CFV-DISMISSED:YYYY-MM-DD] tag. Older dismissals made before the tag existed are still recognised by their wording. If that dismissal has not yet reached the next rent due day plus the 2-day tolerance, the tenancy stays hidden and the dismissal is saved locally again.

⚠️ Your PAT needs the data.recordComments:write scope for this to work. If a comment fails to save you now get a warning message on screen; before August 2026 that failure was silent, and the dismissal simply came back on the next device.

Viewing Comments

  1. Click the 💬 Comments button on any CFV or CFV Actioned row.
  2. A comments panel appears below the table, showing the tenant’s name and reference.
  3. All comments are loaded from Airtable (with pagination for long histories).
  4. Each comment shows the date/time, author name/email, and the comment text.
  5. Click Close to dismiss the panel.

Adding a Manual Comment

  1. Open the comments panel for the tenancy.
  2. Type your note in the textarea at the bottom.
  3. Click Add Comment. The comment is posted to Airtable and the panel refreshes.
⚠️ If no comments load and you know there should be some, your PAT may be missing the data.recordComments:read scope. Update your PAT at airtable.com/create/tokens.

💵 13. Rent Statements Block

Below the CFV table the same tab renders a second block called Rent Statements. It is a different feature with a different job: the CFV table asks “did this month’s rent arrive?”, Rent Statements asks “how much does this tenant owe in total?”

Each row shows the tenant and unit, the tenancy type, the monthly rent, the running balance, how many days of rent that balance represents, and whether the arrears have reached the Section 8 threshold.

FigureHow it is worked out
BalanceRent charged for the tenancy so far, less every reconciled payment linked to it.
Days in arrearsBalance divided by the daily rent, where daily rent = monthly rent ÷ 31. It is a measure of the debt, not of how long it has been owed.
Section 8Flagged once days in arrears reaches 62 — two months at 31 days a month, the threshold for a Section 8 ground 8 notice. It is an indicator, not legal advice: check the position before serving anything.

This block writes to Airtable

Click a row to expand it and you see every payment attached to that tenancy, each with five dropdowns: Category, Sub-Category, Tenancy, Unit and Property.

⚠️ Changing any of these dropdowns writes straight to the Transactions table the moment you pick a value. There is no confirmation dialog. Changing Tenancy also rewrites that transaction’s Unit and Property to match the new tenancy, and moves the payment off one tenant and onto another — which changes both tenants’ balances, their days overdue, and whether either is detected as a CFV. An Undo appears in the toast message; use it straight away if you picked the wrong row.

🛠 14. Data Fields & Airtable Reference

Tenancies Table Fields Used
Human NameField IDTypeUsed For
Payment StatusfldxU3dPUnbK0SCDqSingle SelectCurrent status: In Payment, CFV, CFV Actioned
Monthly RentfldDMyfZLFMeONPq8CurrencyExpected rent amount
Due Dayfldhy2U0CQmM2oS4PNumberDay of month rent is due
SurnamefldOXazTqBWieEOK2TextTenant display name
Tenancy ReferencefldyNVvFn4x8GY14qTextUnique reference code
Unit Referencefldql2nyQlPfkPP4pLookupLinked rental unit name
PropertyfldxfIa0W1nqCbLo2LookupProperty name
Linked Tenantfld1i5bDoHL3B6rUfLinkLinks to Tenants table for contact info
Tenant StatusfldgWAyha1Uij1SZPRollupActive/Former — only Active tenancies are checked
Transactions Table Fields Used
Human NameField IDTypeUsed For
ReconciledfldxKX1IbIFcAOnn5CheckboxOnly reconciled transactions count as payment
Tenancy (link)fldPmAMmxwqs4SdPaLinkDirect link to tenancy record — this is how payment is matched
DatefldoyQ6Rr9cHp3bgQDateCompared against the rent cycle that is due, allowing payment up to 5 days early. Also the date shown in the Last Payment column
Tenants Table Fields Used
Human NameField IDTypeUsed For
Tenant NamefldxBKW7QnujSDWqATextFull name display
Contact NumberfldraHUkWfqo4olLFPhoneClickable tel: link in Contact column
Email AddressfldybEduFY3DWWTfTEmailClickable mailto: link in Contact column
Airtable Payment Status Select IDs
Status NameSelect Option IDUsed In Code As
In Paymentsel4I99slfpd7Vc1tCFV_STATUS_IDS.inPayment
CFVsel2mWzsvOd8d8de0CFV_STATUS_IDS.cfv
CFV ActionedselmhFXah5Bodgg9xCFV_STATUS_IDS.cfvActioned
⚠️ These IDs are recorded for reference only — the dashboard does not send them. Every status update sends the option name (“In Payment”, “CFV”, “CFV Actioned”). So the thing that breaks this tab is renaming a Payment Status option in Airtable, not deleting and recreating the field. If an option is renamed, update the strings in the PATCH body in js/cfv.js to match.
API Calls Made by Cash Flow Voids tab
MethodEndpointWhen
PATCH/v0/{base}/Tenancies/{id}Every status change (Confirm CFV, Mark Actioned, In Payment, Move to CFV, auto-return)
POST/v0/{base}/Tenancies/{id}/commentsEvery status change + manual comment add
GET/v0/{base}/Tenancies/{id}/commentsWhen rendering the CFV table (comment counts) and when opening the comments panel

💾 15. Local Storage Keys

The Cash Flow Voids tab stores tracking data in your browser’s localStorage. These persist across sessions but are specific to the browser/device.

Key PatternValuePurposeCleared When
cfv_{id}_chaseStartISO date stringWhen the chase stage tracking began. Used to determine Stage 1/2/3.Returned to In Payment or dismissed
cfv_{id}_returned“1”Prevents a just-returned tenancy from re-appearing before the next full data load.Cleared if Airtable PATCH fails
cfv_{id}_returnDismissed“1”Legacy flag for dismissing return banners.Returned to In Payment
cfv_dismissed_{id}ISO date stringPotential CFV dismissed by user. Backed up as a [CFV-DISMISSED:date] comment in Airtable and restored from it on another device.Expires at the next rent due day + 2 days, then the system re-checks
cfv_reflag_dismissed_{id}ISO date stringRe-flag dismissed by user. Tenancy stays CFV Actioned.When user confirms re-flag as CFV
cfv_{id}_startDateDead legacy key. It used to hold a frozen CFV start date that drove Days Overdue. Nothing writes it any more; the code only ever deletes it, to clear up leftovers from the old build. Days Overdue is now worked out from the last reconciled payment instead (Section 7).Deleted on dismissal, on return to In Payment, and on auto-return
⚠️ Clearing your browser data or using a different device resets the keys above. Days Overdue is not affected — it is worked out live from Airtable payments and reads the same on every device. Chase stages restart, and a dismissal is restored from its Airtable comment (Section 11).

🔧 16. Troubleshooting

A tenant paid but the CFV is still showing
The payment transaction must be reconciled and linked to the tenancy record via the Tenancy field in Airtable. Check the transaction in the Reconciliation view — if the Tenancy field is empty, the CFV system cannot detect it. Reconcile the transaction with the correct tenancy link and reload the CFV tab.
CFV not detected for a known missed payment
Check: (1) Is the tenancy status In Payment in Airtable? CFVs are only auto-detected for In Payment tenancies. (2) Is the tenant status Active (not Former)? (3) Is the rent amount greater than zero? (4) Does the tenancy have a start date, and is that date in the past? The payment check ignores a tenancy with no start date, or one that has not begun. (5) Is a reconciled payment attached to this tenancy that is newer than you think — for example one paid up to 5 days before the due day, which counts for the following cycle? Open the Rent Statements block below the table to see every payment attached. If all are correct, reload the dashboard to trigger a fresh detection.
Auto-return didn’t clear a CFV after reconciliation
Auto-return runs whenever CFV detection runs: every dashboard load or refresh, every CFV tab render, and straight after a reconciliation (see section 6). So a plain page reload is enough, on any tab. Check the transaction is reconciled and linked to the tenancy, and that its date clears the rent cycle that is currently due. A payment counts from 5 days before its due day onwards, so a payment that is older than that only clears an earlier cycle and will not return the tenancy to In Payment.
Status update failed — alert says “Failed to update Airtable”
Your Airtable PAT needs the data.records:write scope. Go to airtable.com/create/tokens, edit your token, and ensure this scope is enabled. Also check your internet connection.
Comments not loading — panel shows “No comments yet”
Your PAT may be missing the data.recordComments:read scope. The system will show a link to update your token. Add the scope and refresh.
Sidebar badges not showing any numbers
Badges only appear when there are CFVs to show. If you expect to see badges, ensure the dashboard data has loaded (check for the spinning loader). The badges update after the initial data load and after every CFV tab render.
Days overdue changed unexpectedly
The figure comes from the last rent payment linked to the tenancy, not from anything stored in your browser, so clearing browser data cannot change it. If it moved, a payment was reconciled, unreconciled, or relinked to a different tenancy. Open the Rent Statements block below the CFV table and check which payments are attached to this tenancy.
A dismissed potential CFV has reappeared
Dismissals last until the tenancy’s next rent due day plus 2 days, then expire by design — so a dismissal made just before the due day is short, and one made just after it lasts almost a month. If the tenant still has not paid, the system re-flags them for review. Dismiss again or confirm as CFV if the payment is still missing.

📋 17. Changelog

VersionDateChanges
1.353 Sep 2026Drift repair against the live code (findings 035, 055, 170, 171, 276). Rewrote Section 4: detection no longer waits 2 days after the due day and no longer asks whether a payment landed in the current calendar month. Both paths now run one payment check, described in full — no linked payment at all means unpaid, otherwise the cycle that is due (this month’s once the due day has passed by 2 days, last month’s until then) must have a payment dated within 5 days before its due day. The calendar-month rule is documented as the fallback it now is. Corrected the same wording in the lifecycle table, Section 6, the flow diagrams, the Transactions field table and troubleshooting. The 2-day tolerance is now described where it is really used: re-flagging and dismissal expiry. Removed the Chase column from the Section 7 table (it is gone from the page) and added the Last Payment column that replaced it; Section 9 now says the chase stage is computed but not shown. Added the dead cfv_{id}_startDate key to Section 15 and corrected the note that said clearing browser data resets Days Overdue.
1.3426 Aug 2026Drift repair against the live code (findings 164–169, 172). Dismissals expire at the next rent due day + 2 days, not after 25 days, and are backed up as tagged Airtable comments that restore them on another device. Days Overdue is derived from the last reconciled payment with a 5-day early-pay window; the localStorage start date is gone. New section 13 documents the Rent Statements block and its live writes to the Transactions table. Corrected how the tab is opened (dashboard button, not a sidebar item) and where the badges render. Payment Status is PATCHed by NAME, so a renamed option is what breaks it. Added the data.recordComments:write scope; a failed comment now warns on screen instead of failing silently.
1.616 Apr 2026Complete SOP rewrite. Documented: direct tenancy-linked payment detection (replaced keyword matching), auto-return to In Payment, re-flagging logic, sidebar badges, all action buttons per status, comments system via Airtable Comments API, localStorage tracking keys, chase stages (visual only, not automated), all Airtable field IDs and select option IDs.
1.412 Apr 2026Added Potential CFVs section, UC Check section, status IDs reference.
1.0Mar 2026Initial SOP release.