Deal Pipeline

Deals under contract · projects · key dates

Calendar sync: on
Active deals
6
owned, in progress
Under contract
3
not yet owned
In active reno
3
Dayten on site
Stabilized projects
9
2 need action · 7 waiting
Due this week
12
next 7 days
Overdue
0
past due dates
Avg days vacant
39
6 owned & vacant

Upcoming key dates

Projects that need action from you. Default order is tenant impact → fastest capital recycling → your profit share (Construction 100% ▸ Properties/Blue Chip 50%); use ▲▼ to override. Estimated dates and Dayten's 2-slot scheduling follow this order. Click a row to open.
1
1668 N Gilbert St — Full renovation
Refinance · BRRRR
Near cash-outReno ~$50KBlue Chip RE LLC · 50% yoursDayten: in a work slotJun 1, 2026 → Jul 31, 2026
2
1423 Golf Terrace — Full renovation
Renovation · Flip
Mid-projectReno ~$60KPence Properties LLC · 50% yoursDayten: in a work slotJul 1, 2026 → Aug 14, 2026
3
2114 Smith Ave — Roof replacement
Stabilized · BRRRR
Tenant impactEarly stageBlue Chip RE LLC · 50% yoursDayten: queuedEst. Jul 31, 2026 → Aug 2, 2026
4
205 W Conron — Trash-out / debris removal, Full renovation
Renovation · BRRRR
Early stageReno ~$15KPence Construction LLC · 100% yoursDayten: queuedEst. Aug 2, 2026 → Aug 23, 2026
5
404 S 4th St — Planned renovation
Under Contract · Flip
Deploying capitalPence Construction LLC · 100% yoursEst. Aug 16, 2026 → Sep 6, 2026
6
44 Warrington Ave — Roof replacement
Stabilized · BRRRR
Tenant impactEarly stagePence Properties LLC · 50% yoursDayten: queuedEst. Aug 23, 2026 → Aug 24, 2026
7
1327 N State St — Full renovation
Renovation · BRRRR
Early stageReno ~$20KPence Properties LLC · 50% yoursDayten: queuedEst. Aug 24, 2026 → Sep 28, 2026
8
905 Skyline Dr — Full renovation
Renovation · BRRRR
Early stageReno ~$15KPence Properties LLC · 50% yoursDayten: queuedEst. Sep 6, 2026 → Oct 4, 2026
9
1907 Syrcle Dr — Full renovation
Renovation · BRRRR
Early stageReno ~$13KBlue Chip RE LLC · 50% yoursDayten: queuedEst. Sep 28, 2026 → Oct 19, 2026
10
1908 Syrcle Dr — Planned renovation
Under Contract · BRRRR
Deploying capitalPence Properties LLC · 50% yoursEst. Oct 4, 2026 → Oct 25, 2026
11
904 Holiday Dr — Full renovation
Under Contract · BRRRR
Deploying capitalReno ~$18KPence Properties LLC · 50% yoursDayten: queuedEst. Oct 19, 2026 → Nov 16, 2026
Not shown: 7 projects waiting on a contractor (no action needed) — see the Pipeline view or the Stabilized projects metric.
", inject+"\n"); const blob=new Blob([html],{type:"text/html"}); const a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download="index.html"; a.click(); URL.revokeObjectURL(a.href); } /* ---------- helpers ---------- */ function esc(s){ return String(s??"").replace(/[&<>"']/g,c=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[c])); } function renderDashboard(){ renderKPIs(); renderUpcoming(); renderMain(); } function closeAll(){ document.querySelectorAll(".overlay").forEach(o=>o.classList.remove("open")); } function closeProj(){ document.getElementById("projOverlay").classList.remove("open"); } /* ---------- wiring ---------- */ document.getElementById("btnNew").onclick=()=>openEdit(null); document.querySelectorAll(".vtab").forEach(t=>t.onclick=()=>{ view=t.dataset.view; renderMain(); }); document.getElementById("btnContractor").onclick=exportContractorPage; document.getElementById("dealForm").elements["type"].onchange=toggleType; document.getElementById("addTaskBtn").onclick=()=>{ const t=document.getElementById("newTaskText"),du=document.getElementById("newTaskDue"); if(!t.value.trim())return; editTasks.push({text:t.value.trim(),due:du.value||"",done:false}); t.value="";du.value=""; renderEditTasks(); }; document.getElementById("newTaskText").addEventListener("keydown",e=>{if(e.key==="Enter"){e.preventDefault();document.getElementById("addTaskBtn").click();}}); document.getElementById("saveBtn").onclick=()=>{ const form=document.getElementById("dealForm"); if(!form.elements["address"].value.trim()){form.elements["address"].focus();return;} const d=collect(); const idx=deals.findIndex(x=>x.id===d.id); if(idx>=0)deals[idx]=d; else deals.push(d); save(); closeAll(); renderDashboard(); bgSync(d); }; document.getElementById("deleteBtn").onclick=async ()=>{ if(!editingId)return; if(confirm("Delete this deal? This cannot be undone.")){ const target=deals.find(x=>x.id===editingId); await cleanupDeal(target); deals=deals.filter(x=>x.id!==editingId); save(); closeAll(); renderDashboard(); } }; document.getElementById("editFromDetail").onclick=()=>{ document.getElementById("detailOverlay").classList.remove("open"); openEdit(editingId); }; document.getElementById("syncCalBtn").onclick=async ()=>{ const b=document.getElementById("syncCalBtn"); if(!calAvailable()){ alert("Calendar isn't available in this view."); return; } const o=b.textContent; b.textContent="Syncing…"; b.disabled=true; const d=deals.find(x=>x.id===editingId); const r=await autoSyncDeal(d,true); b.textContent=o; b.disabled=false; renderDashboard(); alert(r&&!r.skipped?`Synced. ${r.created} added, ${r.updated} updated, ${r.deleted} removed on your Google Calendar.`:"Nothing to sync."); }; document.getElementById("autoSyncChk").onchange=e=>{ localStorage.setItem(AUTOSYNC_KEY, e.target.checked?"on":"off"); if(e.target.checked) autoSyncAll(true); else setCalStatus(); }; document.getElementById("projSaveBtn").onclick=saveProject; document.getElementById("addDocBtn").onclick=()=>{ const l=document.getElementById("newDocLabel"),u=document.getElementById("newDocUrl"); if(!u.value.trim())return; editDocs.push({label:l.value.trim()||"link",url:u.value.trim()}); l.value="";u.value=""; renderDocs(); }; document.getElementById("projDeleteBtn").onclick=()=>{ if(!projEditId)return; const d=deals.find(x=>x.id===projDealId); if(confirm("Delete this project?")){ d.projects=d.projects.filter(x=>x.id!==projEditId); save(); closeProj(); openDetail(projDealId); renderDashboard(); bgSync(d); } }; document.querySelectorAll("[data-close]").forEach(b=>b.onclick=closeAll); document.querySelectorAll("[data-pclose]").forEach(b=>b.onclick=closeProj); document.querySelectorAll(".overlay").forEach(o=>o.addEventListener("click",e=>{ if(e.target===o){ if(o.id==="projOverlay")closeProj(); else closeAll(); } })); document.addEventListener("keydown",e=>{ if(e.key==="Escape"){ if(document.getElementById("projOverlay").classList.contains("open"))closeProj(); else closeAll(); } }); document.getElementById("btnExport").onclick=()=>{ const blob=new Blob([JSON.stringify(deals,null,2)],{type:"application/json"}); const a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download="deal-pipeline-backup-"+todayISO()+".json"; a.click(); URL.revokeObjectURL(a.href); }; document.getElementById("btnImport").onclick=()=>document.getElementById("importFile").click(); document.getElementById("importFile").onchange=e=>{ const f=e.target.files[0]; if(!f)return; const r=new FileReader(); r.onload=()=>{ try{ const arr=JSON.parse(r.result); if(Array.isArray(arr)){ if(confirm("Replace current deals with "+arr.length+" imported deal(s)?")){ deals=arr.map(migrate); save(); renderDashboard(); autoSyncAll(false); } } else alert("Not a valid backup."); }catch(err){ alert("Could not read file."); } }; r.readAsText(f); e.target.value=""; }; /* ---------- boot ---------- */ function boot(){ if(window.__READONLY__){ RO=true; document.body.classList.add("readonly"); document.getElementById("roBanner").classList.remove("hide"); document.getElementById("subtitle").textContent="Contractor view — read-only snapshot"; deals=(window.__DEALS__||[]).map(migrate); } else { deals=load().map(migrate); applyPresets(); deals=deals.map(migrate); save(); seedPriOrder(); const chk=document.getElementById("autoSyncChk"); if(chk) chk.checked=calEnabled(); setCalStatus(); renderDashboard(); autoSyncAll(false); return; } renderDashboard(); } if(document.readyState==="loading") document.addEventListener("DOMContentLoaded",boot); else boot(); })();