← YR Rental Process Diagrams

Contents

1. System Overview & Business Logic
2. Three-System Architecture
3. Process 1 — Initial Rental Order
4. Process 2 — Monthly Rental Charge
5. Pickup Scenarios (3 types)
6. Zoho Field Reference
7. YR_Equipment Module
8. Genius Sync Runbook
9. Automation Rules (YR1–YR4) + Deluge Code
10. Fleet Snapshots & Funnel Data
11. BOL Layer — Designed, Not Yet Built
12. Bugs & Open Decisions
🏗️

1. System Overview & Business Logic

HandiRamp rents yard ramps to customers at ~$800–$4,000/month. The core operational challenge: ramps are physical assets at customer locations, and freight cost is the margin killer.

✓ Best Case — Direct Re-Rental
New customer found near current ramp location. Ramp moves Customer A → Customer B. One freight leg. Maximum margin.
⚠ Fallback — Hub Return
No nearby customer. Ramp returns to hub (Kenosha / Denton / Glendale). Two freight legs. Margin hit — especially painful on short rentals.
Days to Hub Deadline = 30 − (Today − Notification of Contract End)
When a customer gives cancellation notice, Sales Management has 30 days to find a nearby customer or accept the two-leg freight hit. "Available – Pending Return" ramps in Zoho are actively marketable — ramp is still at customer's site, visible on the map, clock is ticking.

Why the tracking system exists: Knowing where every ramp is, in real time, is the entire business case. The BOL layer being designed will automate this. Today it's partially manual.

⚙️

2. Three-System Architecture

System Role Owner Status
Genius ERP Physical asset register. Source of truth for serial numbers, Genius IDs, billing, invoicing. Accounting / CS ✅ Live
Zoho CRM Rental contracts, customer relationships, fleet status tracking, automation. YR_Equipment module synced from Genius manually. CS / Sales Management ✅ Live
Google Sheet Legacy fleet tracker. Being replaced by Zoho. Key limitation: location requires manual update; status not automated. Manual (legacy) ⚠ Legacy — being replaced
Genius ↔ Zoho relationship: Genius owns the physical asset (serial number, customer billing, asset register). Zoho owns the rental logic and status automation. They are bridged manually — CS re-enters SO data into Genius, and periodic Genius exports sync equipment records into Zoho. No live integration.

Known Hubs

Kenosha
WI
Denton
NC
Glendale
AZ
Rio Vista
TX (Brazos partner)
📋

3. Process 1 — Initial Rental Order

End state: Rental complete → ramp returning or re-rented → Zoho SO has Rental Pickup Requested Date set → Rental Status = Rental Order Completed.
🔁

4. Process 2 — Monthly Rental Charge

✅ Rental still active
Return to Step 1 next month.
❌ Contract ending
Sales Manager sets Notification of Contract End on Initial Order → YR2 fires → Equipment = Available → 30-day window starts.
🚛

5. Pickup Scenarios — 3 Types

All pickup fields entered and maintained by Sales Manager only.

Scenario Pickup Type Pickup Required By YR4 Fires? Notes
1. Standard 30-Day Standard 30-Day Notification date + 30 days ⚡ Yes — at day 20 Soft deadline. YR4 auto-escalates to Customer Hard Date 10 days before deadline.
2. Customer Hard Date Customer Hard Date Customer's firm date No Hard constraint — construction site, lease end, facility handoff. Rental Pickup Requested Date must be ≤ Pickup Required By. Missing this = customer dispute.
3. Extended Stay Extended Stay Blank — until Sales Manager sets a date No Customer not in a hurry. Ramp stays Checked Out. Cancellation is on record but no pickup urgency. Sales Manager sets Pickup Required By only when a date is eventually agreed.

Pickup Field Reference

FieldPurpose
Notification of Contract EndDate customer formally notified cancellation. Triggers YR2 (ramp → Available). Always entered first.
Pickup TypeStandard 30-Day / Customer Hard Date / Extended Stay. Drives urgency and how Pickup Required By is interpreted.
Pickup Required ByDeadline for ramp removal. Standard = +30 days. Hard Date = customer's firm date. Extended Stay = blank until agreed.
Rental Pickup Requested DateDate freight pickup actually scheduled. Set when freight is booked. Used in formula fields (Days Overrun, Est Days Remaining) to track vs. deadline.
📊

6. Zoho Field Reference — Initial Order SO

FieldPurpose
YR_Equipment / _2 / _3 / _4Lookup to physical ramp — up to 4 slots for multi-ramp orders. Assignment triggers YR1.
Rental_Order_TypeInitial Order / Monthly Rental Charge
Rental_Start_DateBOL delivery date — manual entry by CS
Estimated_Rental_MonthsRep's forecast at booking
Estimated_Return_DateCalculated: Start Date + Est. Months (handles fractional months)
Remaining_Rental_DaysCalculated: Est. Days − Days Elapsed. Freezes when pickup date set. Goes negative in overtime.
Rental_StatusAuto-calculated formula — 5 categories (see below). NOT the same as Equipment Rental_Status.
Cancellation_Notification_ReceivedLabel: "Notification of Contract End." Triggers YR2 when populated. Triggers YR2b (reversal) when cleared.
Contract_End_DatePaired with cancellation notice
Pickup_TypeStandard 30-Day / Customer Hard Date / Extended Stay
Pickup_Required_ByDeadline for ramp removal
Rental_Pickup_Requested_DateDate freight actually scheduled → triggers Rental Order Completed status
Original_OrderOn Monthly Charge SOs only — lookup to Initial SO. Auto-set by YR3.

5 Auto-Calculated Rental Status Values (formula field on Initial Order SO — Live)

StatusTrigger Condition
🟢 Long-Term Remaining30+ days to estimated return
🟡 Nearing End1–30 days remaining — action: line up replacement customer
🟠 Extended Past EstimateRemaining days negative (overtime) — revenue upside
🔵 Available – Pending ReturnNotification of Contract End populated — ramp marketable, still at customer
✅ Rental Order CompletedRental Pickup Requested Date entered

Google Sheet → Zoho Field Mapping (Migration Reference)

Google Sheet ColumnZoho Location
Ramp ID (serial)Equipment · Serial Number
RepInitial SO · Sales Order Owner
Status (Checked Out / Available)Equipment · Rental Status (auto via workflow)
Check In Due OnInitial SO · Estimated Return Date (calculated)
Pictures / DescriptionEquipment · Item / Model
Location / City / State / ZipInitial SO · Ship-To Address fields
Location NoteInitial SO · Description / Notes
Rental AmountInitial SO · Line Item Grand Total
How Long Expected on RentInitial SO · Estimated Rental Months
Ramp Age (times rented)Equipment · Related SOs count (derived)
NOTESInitial SO · Notes
(no Google Sheet equivalent)Initial SO · Notification of Contract End ← new in Zoho

Key improvement: location always accurate (from SO Ship-To, not manual update). Status always current (workflow automation, not rep remembering to edit a cell).

🏗️

7. YR_Equipment Module — Current Live State

FieldTypeNotes
Name / Serial NumberText (record title)Primary key. Source: Genius SerialNumber.
Genius_IDIntegerERP asset link. Source: Genius export.
Current_CustomerText field (not a CRM lookup)Customer name from Genius sync. Updated by periodic Genius export. NOT an Account lookup.
Rental_StatusPicklistCurrently only: Available / Checked Out. Workflow-managed — Genius sync never touches this field.
City / StateTextExist in Zoho. Currently unpopulated.
Active_in_GeniusBooleanSet False for Sunbelt and non-Genius records.
Rule: Rental_Status is owned entirely by Zoho automation (YR1/YR2). Genius sync never overwrites it. Even if Genius shows a different status, the Zoho value stands.

Equipment Status Machine — Current Live (2-State)

Available
At hub, ready to assign to next SO. Set by YR2 on cancellation, or on initial creation.
Checked Out
On rent at customer location. Set by YR1 when Sales Management assigns equipment to an Initial Order SO.
🔧

8. Genius Sync Runbook

Apr 15
Last sync (2026)
Manual
Trigger — Genius export provided
/Equipment snapshots/
4TB Dropbox path

Skip Rules — Never Process

RuleWhy
SerialNumber starts with "Sold to"Sold units, not active rentals
SerialNumber starts with "Billboard Rental"Non-standard rental, excluded
SerialNumber starts with "SUNBELT"Sunbelt records — exist in Zoho as non-Genius, never overwrite or delete
IsActive = FalseInactive/retired records
Serial = "QMH NC" (Genius ID 31)Placeholder, no real serial
Genius ID 147MST20-24060012 - Ramp entered in error — leave in Zoho as-is, never update

Known Serial Mismatches (Same Physical Ramp)

Zoho NameGenius SerialNumberNotes
FT20-25020015FT20-2502015Genius has typo (missing zero) — Genius ID 198
MST20-25070028 (96 Wide)MST20-25070028Zoho has ` (96 Wide)` suffix
ITZ20-23021504ITZ20-23021504 also #56VLS Environmental pair — multi-ramp SO edge case
ITZ20-23011496ITZ20-23011496 also #45VLS Environmental pair
PSL-503654-RentalPSL-503654Zoho has -Rental suffix — Genius ID 154

Fields the Sync Updates vs. Never Touches

Safe to update:
Genius_ID — if missing or wrong
Current_Customer — if Genius has a newer customer
Never overwrite:
Rental_Status — workflow-driven inside Zoho
Name (Serial Number) — only Nathan renames
• Sunbelt records — leave completely alone

Last Sync Results (April 15, 2026)

ActionCountDetail
Customer updates5MST20-24060014, MST20-24100020, ITZ20-U250301, BRS20-25111060, ITZ20-25113890
Genius_ID fixes2HT20-25051082 → 260, PSL-503654-Rental → 154
Records deleted1Q20-U8434NU01 — not in Genius, phantom record
New records created0All Genius active records already in Zoho

9. Automation Rules (YR1–YR4) + Deluge Code

⚠ Critical Deluge Gotcha — Read Before Editing Any Function
Zoho sometimes rewrites void automation.FunctionName()void automation.FunctionName(String id) on save. When this happens, input.get("id","") returns "" and the function fails with "Value is empty" on .toLong(). Fix: use soId = id; (not input.get("id","")). All live functions already use this pattern.

Additional rules:
get() on input = 2 args (key + default): input.get("id","")
get() on API result = 1 arg: soRecord.get("YR_Equipment")
• Bracket notation map["key"] = syntax error in Deluge
• Chained .get().get() = doesn't work — break into separate variables
• Lookup fields return a map with "id" key — call .toLong() before passing to update

Workflow Summary

RuleWorkflow IDTriggerConditionActionStatus
YR1817882000391611091YR_Equipment edited on SORental_Order_Type = Initial OrderSlot 1 ramp → Checked Out✅ Live
YR1bliveYR_Equipment_2 editedsameSlot 2 ramp → Checked Out✅ Live
YR1cliveYR_Equipment_3 editedsameSlot 3 ramp → Checked Out✅ Live
YR1dliveYR_Equipment_4 editedsameSlot 4 ramp → Checked Out✅ Live
YR2817882000391611125Cancellation_Notification_Received → not emptyAll 4 slots → Available✅ Live
YR2b817882000391611204Cancellation_Notification_Received → clearedPickup_Requested_Date is emptyAll 4 slots → Checked Out (reversal guard)✅ Live
YR3817882000391772018Rental_Order_Type → Monthly Rental ChargeLink Original_Order + copy 4 equipment slots + strip freight/misc✅ Live
YR4liveScheduled — 10 days before Pickup Required ByPickup_Type = Standard 30-DayAuto-escalate to Customer Hard Date✅ Live

YR1 — YR_CheckedOut_OnAssignment (Slot 1, Live)

void automation.YR_CheckedOut_OnAssignment(String id)
{
  soId = id;
  soRecord = zoho.crm.getRecordById("Sales_Orders",soId.toLong());
  equipmentMap = soRecord.get("YR_Equipment");
  if(equipmentMap == null) { return; }
  equipmentId = equipmentMap.get("id");
  if(equipmentId == null) { return; }
  zoho.crm.update("YR_Equipment",equipmentId.toLong(),{"Rental_Status":"Checked Out"});
}

YR1b / YR1c / YR1d are identical — replace "YR_Equipment" with "YR_Equipment_2", "YR_Equipment_3", "YR_Equipment_4" respectively.

YR2 — YR_Available_OnCancellation (Live)

void automation.YR_Available_OnCancellation(String id)
{
  soId = id;
  soRecord = zoho.crm.getRecordById("Sales_Orders",soId.toLong());
  equipmentFields = list();
  equipmentFields.add("YR_Equipment");
  equipmentFields.add("YR_Equipment_2");
  equipmentFields.add("YR_Equipment_3");
  equipmentFields.add("YR_Equipment_4");
  for each fieldName in equipmentFields
  {
    equipmentMap = soRecord.get(fieldName);
    if(equipmentMap != null)
    {
      equipmentId = equipmentMap.get("id");
      if(equipmentId != null)
      {
        zoho.crm.update("YR_Equipment",equipmentId.toLong(),{"Rental_Status":"Available"});
      }
    }
  }
}

YR2b — YR_ReversalGuard (Live)

void automation.YR_ReversalGuard(String id)
{
  soId = id;
  soRecord = zoho.crm.getRecordById("Sales_Orders",soId.toLong());
  equipmentFields = list();
  equipmentFields.add("YR_Equipment");
  equipmentFields.add("YR_Equipment_2");
  equipmentFields.add("YR_Equipment_3");
  equipmentFields.add("YR_Equipment_4");
  for each fieldName in equipmentFields
  {
    equipmentMap = soRecord.get(fieldName);
    if(equipmentMap != null)
    {
      equipmentId = equipmentMap.get("id");
      if(equipmentId != null)
      {
        zoho.crm.update("YR_Equipment",equipmentId.toLong(),{"Rental_Status":"Checked Out"});
      }
    }
  }
}

YR3 — YR3_FollowUp_AutoPopulate (Live)

void automation.YR3_FollowUp_AutoPopulate(String id)
{
  soId = id;
  soRecord = zoho.crm.getRecordById("Sales_Orders",soId.toLong());

  existingOriginal = soRecord.get("Original_Order");
  if(existingOriginal != null) { return; }  // Month 2+ guard — exit immediately

  accountMap = soRecord.get("Account_Name");
  if(accountMap == null) { return; }
  accountName = accountMap.get("name");
  if(accountName == null || accountName.toString() == "") { return; }

  searchCriteria = "(Rental_Order_Type:equals:Initial Order)AND(Account_Name:equals:" + accountName + ")";
  initialSOs = zoho.crm.searchRecords("Sales_Orders",searchCriteria,1,1);
  if(initialSOs == null || initialSOs.size() == 0) { return; }

  initialSOId = initialSOs.get(0).get("id");
  initialRecord = zoho.crm.getRecordById("Sales_Orders",initialSOId.toLong());

  updateMap = Map();
  updateMap.put("Original_Order",{"id":initialSOId});

  equipmentFields = list();
  equipmentFields.add("YR_Equipment");
  equipmentFields.add("YR_Equipment_2");
  equipmentFields.add("YR_Equipment_3");
  equipmentFields.add("YR_Equipment_4");

  for each fieldName in equipmentFields
  {
    equipmentMap = initialRecord.get(fieldName);
    if(equipmentMap != null)
    {
      equipmentId = equipmentMap.get("id");
      if(equipmentId != null)
      {
        updateMap.put(fieldName,{"id":equipmentId});
      }
    }
  }

  allProducts = soRecord.get("Product_Details");
  if(allProducts != null)
  {
    keepProducts = list();
    for each product in allProducts
    {
      productName = product.get("product").get("name").toString().toLowerCase();
      if(!productName.contains("freight") && !productName.contains("misc"))
      {
        keepProducts.add(product);
      }
    }
    updateMap.put("Product_Details",keepProducts);
  }

  zoho.crm.updateRecord("Sales_Orders",soId.toLong(),updateMap);
}

YR4 is a scheduled workflow rule (not a custom function) — no Deluge code. Fires 10 days before Pickup Required By when Pickup Type = Standard 30-Day. Field update action only.

Field Change History

DateChange
2026-03-17YR_Serial_Number text field removed from Sales Orders. Serial now surfaces only via YR_Equipment lookup record name. Do not re-add YR_Serial_Number references to any function.
2026-03-23All 4 functions updated to 4-slot support. Ramp_No copy logic removed from YR1. YR1b/YR1c/YR1d added.
📈

10. Fleet Snapshots & Funnel Data

Fleet Snapshot — April 16, 2026 (yr-checked-out-dashboard.html)

30
Ramps checked out
$34,910
Active rental revenue / mo
10.8 mo
Avg months on rent
MetricValue
Median months on rent4.7 months
Longest active rentalM20-1250 at PSC (Visalia, CA) — 91.8 months, $800/mo since Aug 2018
Known data quality issue⚠ Duplicate Serial ITZ20-24061559 appears on two simultaneous active SOs — equipment swap orphan bug in production

Available Ramps — March 10, 2026 Snapshot (yr-rental-model.html)

21 Available / 33 Checked Out at time of snapshot.

Serial #LocationStateRepDays to Hub DeadlineNotes
DB-HDC6060 001Kenosha, WIWIBill DAt HubNEW
ITZ20-25113890Yorkville, WIWIBillAt HubChicago IL → New Stock
ITZ20-23081529Yorkville, WIWIBillAt HubImlay City MI → New Stock
MST20-84-30NUYorkville, WIWIAt Hub
MST20-24070016Denton, NCNCAt HubVia Floral Park NY, Schaefferstown PA
BRS20-25101057Rio Vista, TXTXAt HubFramework Events → Bulverde TX
BRS20-25111060Rio Vista, TXTXAt HubPryor OK → New Stock
ITZBZ20-2110Rio Vista, TXTXAt HubPryor OK → Houston TX
Q20-U8434NU01Glendale, AZAZAt Hub
FT20-24080005Glendale, AZAZAt HubNew Ramp
BRS20-U2571049Glendale, AZAZAt HubHyrox NA → Carrollton TX
FT20-24120014Glendale, AZAZAt HubHyrox NA → Santa Fe NM
FT20-25070026Glendale, AZAZAt HubHyrox NA → Las Vegas NV
FT20-25070025Glendale, AZAZAt HubGlendale AZ → Las Vegas NV
PSL-503654-RentalPlatte, SDSDBill24 daysLift Rental — 10+ months
MST20-23070002Cookeville, TNTN21 daysDenton NC → Atlanta GA
MST20-25070028Carrollton, TXTX19 days96" Wide — Sturtevant WI → Mt Clemens MI
ITZ20-U250301McKinney, TXTX17 daysRio Vista TX → Houston TX
MST20-24100020Kingsport, TNTN14 days→ Statesville NC
ITZ20-24121577Ormond Beach, FLFL11 daysDenton NC → Ashland OH
ITZ20-24121575Siloam Springs, ARAR6 days ⚠Locust Grove OK

Sales Funnel — Dec 2025–Mar 2026 (yr-funnel-overview.html)

98
Opportunities created
20%
Win rate (20 of 98)
$439K
Open pipeline
30
Initial orders signed (4 mo)
$119,505
Gross revenue (4 mo)
$3,984
Avg order value

By Rep

RepCreatedWonOpen
Mark Larson32724
Bill Dorn30521
John Rodriguez17611
Chris Hamilton12110
Bill Klaus1019
Alex Disch101

Contact Attribution

ChannelOpen OppsClosed Orders
Phone Inbound42 (59%)9
Web Form13 (18%)
Chat8 (11%)1
Email1
Not attributed817

57% of closed orders have no linked contact with a channel set in CRM — attribution gap, not confirmed untracked.

🚧

11. BOL Layer — Designed, Not Yet Built in Zoho

Status: Fully designed as of April 1, 2026. Spec in notes/zoho/yr-rental-bol-module.md (backup) and projects/yr-equipment-bol-tracking.md. Nothing has been built in Zoho yet.

New Fields to Add to YR_Equipment

FieldTypeNotes
Rental_StatusPicklist — expandAdd Reserved and In Transit to existing Available / Checked Out
Location_TypePicklist — newHub / At Customer / At Customer – Pending Return / In Transit
Current_HubPicklist — newKenosha WI / Denton NC / Glendale AZ / Rio Vista TX
Current_SOSO lookup — newActive SO the ramp is assigned to. Replaces Current_Customer text field. SO surfaces customer, contact, and ship-to cleanly.
Last_Move_DateDate — newAuto-updated on BOL status changes
In_Service_DateDate — newAuto from first BOL delivery — only if currently blank; manual entry wins
Current_City / Current_StateText — already existExist in Zoho, currently unpopulated. Will be auto-updated from BOL.

Bills_of_Lading Module — New Custom Module

FieldTypeRequiredNotes
EquipmentYR_Equipment lookupLinks BOL to the ramp
Sales_OrderSO lookup✅ for deliveries/returnsOptional for hub transfers
BOL_TypePicklistDelivery to Customer / Return from Customer / Hub Transfer / Other
StatusPicklistCreated / In Transit / Delivered / Cancelled
CarrierTextFree text — multi-vendor, no single carrier dependency
Carrier_ReferenceTextPRO # or carrier order #
BOL_NumberTextPhysical BOL number
From_Location_NameTextHub name or customer name
From_City / From_StateText
To_Location_NameTextHub name or customer name
To_City / To_StateText
Ship_DateDate
Delivered_DateDate
Freight_CostCurrencyEnables freight cost reporting per rental
BOL_AttachmentFilePhysical BOL scan/photo
NotesText area

Module Relationships

Accounts → Sales_Orders (many per account) → YR_Equipment (lookup on SO, up to 4 slots) → Bills_of_Lading (many per equipment) → Sales_Order lookup (ties BOL to specific rental)

Equipment Status Flow When BOL Is Live (4-State)

EventRental_StatusLocation_Type
Assigned to SO by CS/Sales MgrReserved(unchanged)
BOL created + marked In TransitIn TransitIn Transit
BOL Delivered — Delivery to CustomerChecked OutAt Customer
BOL Delivered — Return from CustomerIn TransitIn Transit
BOL Delivered — Hub TransferAvailableHub
Cancellation notification received (YR2)AvailableAt Customer – Pending Return

Equipment Swap Rules (When BOL Is Live)

Situation on Original RampAction
No BOL existsAutomation reverts original to Available, clears Current_SO. New ramp gets Reserved.
BOL exists, Status = CreatedSwap permitted. CS must manually cancel/void the BOL on original ramp.
BOL Status = In Transit or DeliveredSwap blocked. CS must resolve BOL manually before reassignment.

Build Sequence

#Step
1Add new fields to YR_Equipment in Zoho (expand Rental_Status, add Location_Type, Current_Hub, Current_SO, Last_Move_Date, In_Service_Date)
2Create Bills_of_Lading custom module with full field spec
3Update YR1–YR1d to set Reserved (not Checked Out) on assignment + fix equipment swap orphan bug
4Build BOL-triggered automations (In Transit / Delivered / Hub Transfer status transitions)
5Update YR2 to also clear Current_SO + set Location_Type = At Customer – Pending Return
6Build Available Ramps dashboard (filter: Rental_Status = Available, show Current_Hub and location)

Key Collaborator

Alexis Whelpley (AW) — CS Team Lead — added to Discord collaboration channel 2026-06-23. She owns the CS workflow: SO Genius re-entry (Step 5), BOL receipt, invoice generation in Genius, shipping coordination. She will be the primary operator of the BOL system when built. Profile: memory/people/alexis-whelpley.md — waiting for her to fill in.
⚠️

12. Bugs & Open Decisions

Known Bugs

Bug 1 — Equipment Swap Orphan (Critical, Unresolved)

Problem: When CS reassigns a different ramp to an SO (overwrites YR_Equipment lookup), YR1 sets the new ramp to Checked Out — but has no logic to revert the old ramp back to Available. Old ramp is permanently stuck in Checked Out.

Evidence in production: ITZ20-24061559 appears on two simultaneous active SOs in the April 16, 2026 snapshot — flagged as "Duplicate Serial" in the dashboard.

Fix design: Capture previous equipment ID in Deluge before updating new equipment. Revert old equipment to Available, clear Current_SO. Block swap if existing BOL = In Transit or Delivered. Confirm Deluge syntax for previous field value capture before building.

Current workaround: None — must be caught and fixed manually in Zoho.
Bug 2 — YR_Serial_Number field (resolved, cosmetic)
The YR_Serial_Number text field was removed from Sales Orders on March 17, 2026. Serial number now surfaces only via the YR_Equipment lookup record name. Some older function versions (pre-March 23) still reference this field. Do not re-add YR_Serial_Number references to any function.

Open Decisions (Unresolved since April 2026)

1
Location data backfill: Backfill current ramp locations from the Google Sheet into Zoho, or start fresh going forward with new BOL entries only?
2
Deluge syntax for previous field value: Confirm how to capture the prior value of YR_Equipment before it's overwritten (likely input.get("YR_Equipment_before","") or similar). Required for the equipment swap orphan fix.
3
Available Ramps dashboard: Build before or after fields are populated with real location data?
4
Ryan Transportation email parsing: Ryan currently sends structured email summaries (tabular, parseable). Future option for auto-creating BOL records. Deferred until carrier mix is stable.
5
Genius sync overdue: Last run April 15, 2026 — 2+ months ago. New export should be pulled before the BOL layer is built so the Equipment module has current data.

Other Pending Items

ItemStatus
YR nightly reports cron (June 23 1:00 AM failure)Fix applied in dream cycle — next run June 24 1:00 AM
Alexis Whelpley profileSkeleton created — waiting for AW to fill in
Initial orders script second live run verificationWatch rentals_count in yr-reports-log.json after June 24 run
Generated by Forge · 2026-06-23 · All sources: design docs, HTML diagrams, Zoho notes, Deluge code, project files, backup specs