{"id":811,"date":"2026-05-14T22:51:52","date_gmt":"2026-05-14T22:51:52","guid":{"rendered":"https:\/\/360bizbrokers.com\/?page_id=811"},"modified":"2026-05-14T22:55:05","modified_gmt":"2026-05-14T22:55:05","slug":"transactions-tracker-real-estate","status":"publish","type":"page","link":"https:\/\/360bizbrokers.com\/pt\/transactions-tracker-real-estate\/","title":{"rendered":"Transactions Tracker &#8211; Real Estate"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"811\" class=\"elementor elementor-811\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f9ec217 e-flex e-con-boxed e-con e-parent\" data-id=\"f9ec217\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-96e95bb elementor-widget elementor-widget-html\" data-id=\"96e95bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>Real Estate Transactions - Check List & Docs Tracker<\/title>\n  <style>\n    :root {\n      --bg: #f6f8fb;\n      --card: #ffffff;\n      --text: #1f2937;\n      --muted: #6b7280;\n      --border: #e5e7eb;\n      --primary: #2563eb;\n      --primary-dark: #1d4ed8;\n      --red: #dc2626;\n      --yellow: #d97706;\n      --blue: #2563eb;\n      --green: #16a34a;\n      --gray: #9ca3af;\n      --orange: #ea580c;\n      --purple: #7c3aed;\n    }\n\n    * { box-sizing: border-box; }\n\n    body {\n      margin: 0;\n      font-family: Arial, Helvetica, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n    }\n\n    .hidden { display: none !important; }\n\n    .login-screen {\n      min-height: 100vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: 24px;\n      background: linear-gradient(135deg, #eff6ff, #f8fafc);\n    }\n\n    .login-card {\n      width: min(520px, 100%);\n      background: #fff;\n      border: 1px solid var(--border);\n      border-radius: 22px;\n      padding: 28px;\n      box-shadow: 0 20px 60px rgba(15, 23, 42, 0.12);\n    }\n\n    .login-card h1 {\n      margin: 0 0 10px;\n      font-size: 30px;\n      line-height: 1.2;\n    }\n\n    .login-card p {\n      margin: 0 0 20px;\n      color: var(--muted);\n      line-height: 1.5;\n    }\n\n    .login-card label,\n    .form-grid label {\n      display: grid;\n      gap: 6px;\n      font-size: 13px;\n      font-weight: 800;\n    }\n\n    input, select, textarea {\n      border: 1px solid var(--border);\n      border-radius: 10px;\n      padding: 10px 12px;\n      font-size: 14px;\n      font-family: inherit;\n      background: #fff;\n    }\n\n    textarea { resize: vertical; min-height: 72px; }\n\n    .button {\n      border: 0;\n      border-radius: 10px;\n      background: var(--primary);\n      color: #fff;\n      padding: 11px 16px;\n      font-size: 14px;\n      font-weight: 700;\n      cursor: pointer;\n      transition: 0.2s ease;\n    }\n\n    .button:hover { background: var(--primary-dark); }\n    .button.secondary { background: #eef2ff; color: var(--primary); }\n    .button.secondary:hover { background: #dbeafe; }\n    .button.danger { background: #fee2e2; color: var(--red); }\n    .button.danger:hover { background: #fecaca; }\n\n    .login-actions { margin-top: 16px; display: flex; gap: 10px; flex-wrap: wrap; }\n\n    .tracker-app {\n      max-width: 1240px;\n      margin: 0 auto;\n      padding: 32px 16px;\n    }\n\n    .tracker-header {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      align-items: flex-start;\n      margin-bottom: 24px;\n      flex-wrap: wrap;\n    }\n\n    .tracker-header h1 {\n      margin: 0 0 8px;\n      font-size: 32px;\n      line-height: 1.2;\n    }\n\n    .tracker-header p {\n      margin: 0;\n      color: var(--muted);\n      max-width: 760px;\n      font-size: 16px;\n    }\n\n    .agent-pill {\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      background: #fff;\n      border: 1px solid var(--border);\n      border-radius: 999px;\n      padding: 8px 12px;\n      color: var(--muted);\n      font-size: 13px;\n      margin-top: 10px;\n    }\n\n    .header-actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; }\n\n    .summary-grid {\n      display: grid;\n      grid-template-columns: repeat(4, minmax(0, 1fr));\n      gap: 16px;\n      margin-bottom: 24px;\n    }\n\n    .summary-card, .panel, .transaction-card {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: 16px;\n      box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n    }\n\n    .summary-card { padding: 18px; }\n    .summary-label {\n      color: var(--muted);\n      font-size: 13px;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n    .summary-value { margin-top: 8px; font-size: 30px; font-weight: 800; }\n\n    .layout { display: grid; grid-template-columns: 380px 1fr; gap: 20px; }\n    .panel { padding: 18px; }\n    .panel h2 { margin: 0 0 14px; font-size: 20px; }\n    .transaction-list { display: grid; gap: 12px; }\n\n    .transaction-card {\n      padding: 16px;\n      cursor: pointer;\n      transition: 0.2s ease;\n    }\n\n    .transaction-card:hover, .transaction-card.active {\n      border-color: var(--primary);\n      transform: translateY(-1px);\n    }\n\n    .transaction-title-row { display: flex; justify-content: space-between; gap: 10px; align-items: flex-start; }\n    .transaction-card h3 { margin: 0; font-size: 17px; }\n    .transaction-meta { margin-top: 6px; color: var(--muted); font-size: 13px; line-height: 1.35; }\n\n    .progress-wrap { margin-top: 12px; }\n    .progress-bar { height: 9px; background: #e5e7eb; border-radius: 999px; overflow: hidden; }\n    .progress-fill { height: 100%; background: var(--green); border-radius: 999px; width: 0; }\n    .progress-text { display: flex; justify-content: space-between; margin-top: 6px; color: var(--muted); font-size: 13px; }\n\n    .badge {\n      display: inline-flex;\n      align-items: center;\n      border-radius: 999px;\n      padding: 5px 9px;\n      font-size: 12px;\n      font-weight: 800;\n      white-space: nowrap;\n    }\n\n    .badge.red { background: #fee2e2; color: var(--red); }\n    .badge.yellow { background: #fef3c7; color: var(--yellow); }\n    .badge.blue { background: #dbeafe; color: var(--blue); }\n    .badge.green { background: #dcfce7; color: var(--green); }\n    .badge.gray { background: #f3f4f6; color: #4b5563; }\n    .badge.orange { background: #ffedd5; color: var(--orange); }\n    .badge.purple { background: #ede9fe; color: var(--purple); }\n\n    .detail-header { display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; align-items: flex-start; margin-bottom: 16px; }\n    .detail-header h2 { margin: 0 0 6px; font-size: 24px; }\n    .detail-meta { color: var(--muted); font-size: 14px; line-height: 1.45; }\n\n    .toolbar { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }\n    .toolbar input, .toolbar select { min-width: 170px; }\n\n    .table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: 14px; }\n    table { width: 100%; border-collapse: collapse; min-width: 920px; background: #fff; }\n    th, td { padding: 13px 12px; border-bottom: 1px solid var(--border); text-align: left; font-size: 14px; vertical-align: top; }\n    th { background: #f9fafb; color: #374151; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; }\n    tr:last-child td { border-bottom: 0; }\n    .doc-name { font-weight: 800; }\n    .notes { color: var(--muted); max-width: 280px; }\n    select.status-select { min-width: 135px; border: 1px solid var(--border); border-radius: 9px; padding: 8px; background: #fff; }\n\n    .reminder-box { margin-top: 20px; background: #fff7ed; border: 1px solid #fed7aa; border-radius: 16px; padding: 16px; }\n    .reminder-box h3 { margin: 0 0 8px; color: #9a3412; }\n    .reminder-box ul { margin: 10px 0 0; padding-left: 18px; color: #7c2d12; }\n\n    .modal-backdrop {\n      position: fixed;\n      inset: 0;\n      background: rgba(15, 23, 42, 0.55);\n      display: none;\n      align-items: center;\n      justify-content: center;\n      padding: 20px;\n      z-index: 9999;\n    }\n\n    .modal {\n      width: min(620px, 100%);\n      max-height: 92vh;\n      overflow-y: auto;\n      background: #fff;\n      border-radius: 18px;\n      padding: 22px;\n      box-shadow: 0 20px 60px rgba(0,0,0,0.25);\n    }\n\n    .modal h2 { margin: 0 0 14px; }\n    .form-grid { display: grid; gap: 12px; }\n    .form-two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\n    .modal-actions { margin-top: 16px; display: flex; justify-content: flex-end; gap: 10px; flex-wrap: wrap; }\n\n    .empty-state {\n      padding: 20px;\n      background: #f9fafb;\n      border: 1px dashed var(--border);\n      border-radius: 14px;\n      color: var(--muted);\n      line-height: 1.5;\n    }\n\n    @media (max-width: 960px) {\n      .summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n      .layout { grid-template-columns: 1fr; }\n    }\n\n    @media (max-width: 620px) {\n      .summary-grid, .form-two { grid-template-columns: 1fr; }\n      .tracker-header h1, .login-card h1 { font-size: 26px; }\n      .header-actions { justify-content: flex-start; }\n    }\n  <\/style>\n<\/head>\n<body>\n  <section class=\"login-screen\" id=\"loginScreen\">\n    <div class=\"login-card\">\n      <h1>Real Estate Transactions - Check List & Docs Tracker<\/h1>\n      <p>Enter your name to open your personal transaction tracker. Your transactions are saved only in this browser on this device.<\/p>\n      <label>\n        Agent Name\n        <input id=\"agentNameInput\" placeholder=\"Enter your name\" \/>\n      <\/label>\n      <div class=\"login-actions\">\n        <button class=\"button\" onclick=\"startAgentSession()\">Start Tracking<\/button>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <div class=\"tracker-app hidden\" id=\"trackerApp\">\n    <header class=\"tracker-header\">\n      <div>\n        <h1>Real Estate Transactions - Check List & Docs Tracker<\/h1>\n        <p>Track contracts, financing, inspections, title, HOA, appraisal, closing tasks, document status, due dates, and reminders for every active real estate transaction.<\/p>\n        <div class=\"agent-pill\">Agent: <strong id=\"agentNameDisplay\"><\/strong><\/div>\n      <\/div>\n      <div class=\"header-actions\">\n        <button class=\"button secondary\" onclick=\"changeAgent()\">Change Agent<\/button>\n        <button class=\"button\" onclick=\"openTransactionModal()\">+ Add Transaction<\/button>\n      <\/div>\n    <\/header>\n\n    <section class=\"summary-grid\">\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Active Transactions<\/div>\n        <div class=\"summary-value\" id=\"activeTransactions\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Missing Docs<\/div>\n        <div class=\"summary-value\" id=\"missingDocs\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Overdue Items<\/div>\n        <div class=\"summary-value\" id=\"overdueDocs\">0<\/div>\n      <\/div>\n      <div class=\"summary-card\">\n        <div class=\"summary-label\">Avg. Completion<\/div>\n        <div class=\"summary-value\" id=\"avgCompletion\">0%<\/div>\n      <\/div>\n    <\/section>\n\n    <main class=\"layout\">\n      <aside class=\"panel\">\n        <h2>Active Transactions<\/h2>\n        <div class=\"transaction-list\" id=\"transactionList\"><\/div>\n      <\/aside>\n\n      <section class=\"panel\">\n        <div class=\"detail-header\">\n          <div>\n            <h2 id=\"detailTitle\">Select a transaction<\/h2>\n            <div class=\"detail-meta\" id=\"detailMeta\"><\/div>\n          <\/div>\n          <span class=\"badge gray\" id=\"readinessBadge\">No transaction selected<\/span>\n        <\/div>\n\n        <div class=\"toolbar\">\n          <input type=\"text\" id=\"searchInput\" placeholder=\"Search documents...\" oninput=\"renderDetail()\" \/>\n          <select id=\"statusFilter\" onchange=\"renderDetail()\">\n            <option value=\"all\">All statuses<\/option>\n            <option value=\"Missing\">Missing<\/option>\n            <option value=\"Requested\">Requested<\/option>\n            <option value=\"Received\">Received<\/option>\n            <option value=\"Reviewed\">Reviewed<\/option>\n            <option value=\"Overdue\">Overdue<\/option>\n            <option value=\"N\/A\">N\/A<\/option>\n          <\/select>\n          <button class=\"button secondary\" onclick=\"openDocumentModal()\">+ Add Document<\/button>\n          <button class=\"button secondary\" onclick=\"generateReminderSummary()\">Generate Reminder Summary<\/button>\n        <\/div>\n\n        <div class=\"table-wrap\">\n          <table>\n            <thead>\n              <tr>\n                <th>Document \/ Task<\/th>\n                <th>Status<\/th>\n                <th>Responsible Party<\/th>\n                <th>Due Date<\/th>\n                <th>Last Updated<\/th>\n                <th>Reminder<\/th>\n                <th>Notes<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"documentRows\"><\/tbody>\n          <\/table>\n        <\/div>\n\n        <div class=\"reminder-box\" id=\"reminderBox\">\n          <h3>Reminder Center<\/h3>\n          <p>Select a transaction to see missing and overdue reminders.<\/p>\n        <\/div>\n      <\/section>\n    <\/main>\n  <\/div>\n\n  <div class=\"modal-backdrop\" id=\"transactionModalBackdrop\">\n    <div class=\"modal\">\n      <h2>Add New Real Estate Transaction<\/h2>\n      <div class=\"form-grid\">\n        <label>\n          Property Address\n          <input id=\"newPropertyAddress\" placeholder=\"Example: 123 Main Street, Orlando, FL\" \/>\n        <\/label>\n        <div class=\"form-two\">\n          <label>\n            Transaction Type\n            <select id=\"newTransactionType\">\n              <option>Buyer Side<\/option>\n              <option>Seller Side<\/option>\n              <option>Lease<\/option>\n              <option>Referral<\/option>\n              <option>Commercial<\/option>\n            <\/select>\n          <\/label>\n          <label>\n            Transaction Stage\n            <select id=\"newTransactionStage\">\n              <option>Under Contract<\/option>\n              <option>Listing Prep<\/option>\n              <option>Inspection Period<\/option>\n              <option>Financing \/ Appraisal<\/option>\n              <option>Title \/ Closing<\/option>\n              <option>Closed<\/option>\n            <\/select>\n          <\/label>\n        <\/div>\n        <div class=\"form-two\">\n          <label>\n            Client Name\n            <input id=\"newClientName\" placeholder=\"Client name\" \/>\n          <\/label>\n          <label>\n            Closing Date\n            <input id=\"newClosingDate\" type=\"date\" \/>\n          <\/label>\n        <\/div>\n        <label>\n          Notes\n          <textarea id=\"newTransactionNotes\" placeholder=\"Optional transaction notes\"><\/textarea>\n        <\/label>\n      <\/div>\n      <div class=\"modal-actions\">\n        <button class=\"button secondary\" onclick=\"closeTransactionModal()\">Cancel<\/button>\n        <button class=\"button\" onclick=\"addTransaction()\">Create Transaction<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"modal-backdrop\" id=\"documentModalBackdrop\">\n    <div class=\"modal\">\n      <h2>Add Document or Task<\/h2>\n      <div class=\"form-grid\">\n        <label>\n          Document \/ Task Name\n          <input id=\"newDocumentName\" placeholder=\"Example: HOA Estoppel, Survey, Addendum\" \/>\n        <\/label>\n        <div class=\"form-two\">\n          <label>\n            Status\n            <select id=\"newDocumentStatus\">\n              <option>Missing<\/option>\n              <option>Requested<\/option>\n              <option>Received<\/option>\n              <option>Reviewed<\/option>\n              <option>Overdue<\/option>\n              <option>N\/A<\/option>\n            <\/select>\n          <\/label>\n          <label>\n            Responsible Party\n            <input id=\"newDocumentOwner\" placeholder=\"Example: Buyer, Seller, Lender, Title\" \/>\n          <\/label>\n        <\/div>\n        <label>\n          Due Date\n          <input id=\"newDocumentDueDate\" type=\"date\" \/>\n        <\/label>\n        <label>\n          Notes\n          <textarea id=\"newDocumentNotes\" placeholder=\"Optional notes\"><\/textarea>\n        <\/label>\n      <\/div>\n      <div class=\"modal-actions\">\n        <button class=\"button secondary\" onclick=\"closeDocumentModal()\">Cancel<\/button>\n        <button class=\"button\" onclick=\"addDocumentToTransaction()\">Add Document<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n    const agentNameKey = \"realEstateTrackerAgentName\";\n    const transactionsKeyPrefix = \"realEstateTransactions_\";\n\n    const defaultDocs = [\n      \"Executed Contract\",\n      \"Seller Disclosure\",\n      \"Lead-Based Paint Disclosure\",\n      \"HOA \/ Condo Documents\",\n      \"Pre-Approval or Proof of Funds\",\n      \"Escrow Deposit Receipt\",\n      \"Inspection Report\",\n      \"Repair Addendum\",\n      \"Loan Approval\",\n      \"Appraisal\",\n      \"Survey\",\n      \"Title Commitment\",\n      \"Homeowners Insurance\",\n      \"Closing Disclosure\",\n      \"Final Walkthrough\",\n      \"Commission Disbursement Authorization\"\n    ];\n\n    let currentAgentName = \"\";\n    let transactions = [];\n    let selectedTransactionId = null;\n\n    function today() {\n      return new Date().toISOString().slice(0, 10);\n    }\n\n    function storageKey() {\n      return transactionsKeyPrefix + currentAgentName.trim().toLowerCase().replace(\/\\s+\/g, \"_\");\n    }\n\n    function createDoc(name, status, owner, dueDate, notes) {\n      return {\n        name,\n        status,\n        owner,\n        dueDate,\n        lastUpdated: today(),\n        reminder: status !== \"Reviewed\" && status !== \"N\/A\",\n        notes\n      };\n    }\n\n    function loadAgent() {\n      const savedAgent = localStorage.getItem(agentNameKey);\n      if (savedAgent) {\n        currentAgentName = savedAgent;\n        openTracker();\n      }\n    }\n\n    function startAgentSession() {\n      const name = document.getElementById(\"agentNameInput\").value.trim();\n      if (!name) {\n        alert(\"Please enter your name.\");\n        return;\n      }\n      currentAgentName = name;\n      localStorage.setItem(agentNameKey, currentAgentName);\n      openTracker();\n    }\n\n    function changeAgent() {\n      localStorage.removeItem(agentNameKey);\n      currentAgentName = \"\";\n      transactions = [];\n      selectedTransactionId = null;\n      document.getElementById(\"agentNameInput\").value = \"\";\n      document.getElementById(\"trackerApp\").classList.add(\"hidden\");\n      document.getElementById(\"loginScreen\").classList.remove(\"hidden\");\n    }\n\n    function openTracker() {\n      document.getElementById(\"agentNameDisplay\").textContent = currentAgentName;\n      document.getElementById(\"loginScreen\").classList.add(\"hidden\");\n      document.getElementById(\"trackerApp\").classList.remove(\"hidden\");\n      loadTransactions();\n      render();\n    }\n\n    function loadTransactions() {\n      const saved = localStorage.getItem(storageKey());\n      transactions = saved ? JSON.parse(saved) : [];\n      selectedTransactionId = transactions.length ? transactions[0].id : null;\n    }\n\n    function saveTransactions() {\n      if (!currentAgentName) return;\n      localStorage.setItem(storageKey(), JSON.stringify(transactions));\n    }\n\n    function completion(transaction) {\n      const required = transaction.documents.filter(d => d.status !== \"N\/A\");\n      const done = required.filter(d => d.status === \"Reviewed\").length;\n      return required.length ? Math.round((done \/ required.length) * 100) : 100;\n    }\n\n    function readiness(transaction) {\n      const overdue = transaction.documents.filter(d => d.status === \"Overdue\").length;\n      const missing = transaction.documents.filter(d => d.status === \"Missing\").length;\n      const pct = completion(transaction);\n      if (overdue) return { label: \"Overdue Items\", color: \"orange\" };\n      if (missing) return { label: \"Needs Attention\", color: \"yellow\" };\n      if (pct < 100) return { label: \"In Progress\", color: \"blue\" };\n      return { label: \"Ready \/ Complete\", color: \"green\" };\n    }\n\n    function renderSummary() {\n      const allDocs = transactions.flatMap(t => t.documents);\n      const missing = allDocs.filter(d => d.status === \"Missing\").length;\n      const overdue = allDocs.filter(d => d.status === \"Overdue\").length;\n      const avg = transactions.length ? Math.round(transactions.reduce((sum, t) => sum + completion(t), 0) \/ transactions.length) : 0;\n\n      document.getElementById(\"activeTransactions\").textContent = transactions.length;\n      document.getElementById(\"missingDocs\").textContent = missing;\n      document.getElementById(\"overdueDocs\").textContent = overdue;\n      document.getElementById(\"avgCompletion\").textContent = avg + \"%\";\n    }\n\n    function renderTransactions() {\n      const wrap = document.getElementById(\"transactionList\");\n      wrap.innerHTML = \"\";\n\n      if (!transactions.length) {\n        wrap.innerHTML = `<div class=\"empty-state\">No transactions yet. Click <strong>+ Add Transaction<\/strong> to create your first real estate transaction.<\/div>`;\n        return;\n      }\n\n      transactions.forEach(transaction => {\n        const pct = completion(transaction);\n        const missing = transaction.documents.filter(d => d.status === \"Missing\").length;\n        const overdue = transaction.documents.filter(d => d.status === \"Overdue\").length;\n        const ready = readiness(transaction);\n\n        const card = document.createElement(\"div\");\n        card.className = \"transaction-card\" + (transaction.id === selectedTransactionId ? \" active\" : \"\");\n        card.onclick = () => {\n          selectedTransactionId = transaction.id;\n          render();\n        };\n\n        card.innerHTML = `\n          <div class=\"transaction-title-row\">\n            <div>\n              <h3>${escapeHtml(transaction.address)}<\/h3>\n              <div class=\"transaction-meta\">\n                ${escapeHtml(transaction.type)} \u00b7 ${escapeHtml(transaction.stage)}<br>\n                Client: ${escapeHtml(transaction.client || \"Not entered\")} \u00b7 Closing: ${transaction.closingDate || \"TBD\"}\n              <\/div>\n            <\/div>\n            <span class=\"badge ${ready.color}\">${ready.label}<\/span>\n          <\/div>\n          <div class=\"progress-wrap\">\n            <div class=\"progress-bar\"><div class=\"progress-fill\" style=\"width:${pct}%\"><\/div><\/div>\n            <div class=\"progress-text\">\n              <span>${pct}% complete<\/span>\n              <span>${missing} missing \u00b7 ${overdue} overdue<\/span>\n            <\/div>\n          <\/div>\n        `;\n        wrap.appendChild(card);\n      });\n    }\n\n    function renderDetail() {\n      const transaction = transactions.find(t => t.id === selectedTransactionId);\n      const rows = document.getElementById(\"documentRows\");\n      const search = document.getElementById(\"searchInput\").value.toLowerCase();\n      const filter = document.getElementById(\"statusFilter\").value;\n\n      rows.innerHTML = \"\";\n\n      if (!transaction) {\n        document.getElementById(\"detailTitle\").textContent = \"Select a transaction\";\n        document.getElementById(\"detailMeta\").textContent = \"\";\n        document.getElementById(\"readinessBadge\").textContent = \"No transaction selected\";\n        document.getElementById(\"readinessBadge\").className = \"badge gray\";\n        document.getElementById(\"reminderBox\").innerHTML = `<h3>Reminder Center<\/h3><p>Add or select a transaction to see reminders.<\/p>`;\n        return;\n      }\n\n      const ready = readiness(transaction);\n      document.getElementById(\"detailTitle\").textContent = transaction.address;\n      document.getElementById(\"detailMeta\").textContent = `${transaction.type} \u00b7 ${transaction.stage} \u00b7 Client: ${transaction.client || \"Not entered\"} \u00b7 Closing: ${transaction.closingDate || \"TBD\"} \u00b7 ${completion(transaction)}% complete`;\n      document.getElementById(\"readinessBadge\").textContent = ready.label;\n      document.getElementById(\"readinessBadge\").className = `badge ${ready.color}`;\n\n      const docs = transaction.documents.filter(d => {\n        const matchesSearch = d.name.toLowerCase().includes(search) || d.notes.toLowerCase().includes(search) || d.owner.toLowerCase().includes(search);\n        const matchesFilter = filter === \"all\" || d.status === filter;\n        return matchesSearch && matchesFilter;\n      });\n\n      if (!docs.length) {\n        rows.innerHTML = `<tr><td colspan=\"7\">No documents match the current search\/filter.<\/td><\/tr>`;\n      }\n\n      docs.forEach(d => {\n        const actualIndex = transaction.documents.indexOf(d);\n        const tr = document.createElement(\"tr\");\n        tr.innerHTML = `\n          <td><div class=\"doc-name\">${escapeHtml(d.name)}<\/div><\/td>\n          <td>\n            <select class=\"status-select\" onchange=\"updateStatus(${transaction.id}, ${actualIndex}, this.value)\">\n              ${[\"Missing\", \"Requested\", \"Received\", \"Reviewed\", \"Overdue\", \"N\/A\"].map(s => `\n                <option value=\"${s}\" ${d.status === s ? \"selected\" : \"\"}>${s}<\/option>\n              `).join(\"\")}\n            <\/select>\n          <\/td>\n          <td>${escapeHtml(d.owner)}<\/td>\n          <td>${d.dueDate || \"\u2014\"}<\/td>\n          <td>${d.lastUpdated}<\/td>\n          <td>${d.reminder ? \"On\" : \"Off\"}<\/td>\n          <td class=\"notes\">${escapeHtml(d.notes || \"\")}<\/td>\n        `;\n        rows.appendChild(tr);\n      });\n\n      renderReminders(transaction);\n    }\n\n    function renderReminders(transaction) {\n      const box = document.getElementById(\"reminderBox\");\n      const reminders = transaction.documents.filter(d =>\n        d.reminder && [\"Missing\", \"Requested\", \"Overdue\"].includes(d.status)\n      );\n\n      if (!reminders.length) {\n        box.innerHTML = `<h3>Reminder Center<\/h3><p>No active reminders. This transaction is in good shape.<\/p>`;\n        return;\n      }\n\n      box.innerHTML = `\n        <h3>Reminder Center<\/h3>\n        <p>${reminders.length} item${reminders.length === 1 ? \"\" : \"s\"} need attention.<\/p>\n        <ul>\n          ${reminders.map(d => `<li><strong>${escapeHtml(d.name)}<\/strong> \u2014 ${d.status}, responsible party: ${escapeHtml(d.owner)}, due ${d.dueDate || \"TBD\"}.<\/li>`).join(\"\")}\n        <\/ul>\n      `;\n    }\n\n    function updateStatus(transactionId, docIndex, status) {\n      const transaction = transactions.find(t => t.id === transactionId);\n      if (!transaction) return;\n      transaction.documents[docIndex].status = status;\n      transaction.documents[docIndex].lastUpdated = today();\n      transaction.documents[docIndex].reminder = status !== \"Reviewed\" && status !== \"N\/A\";\n      saveTransactions();\n      render();\n    }\n\n    function generateReminderSummary() {\n      const transaction = transactions.find(t => t.id === selectedTransactionId);\n      if (!transaction) {\n        alert(\"Please select a transaction first.\");\n        return;\n      }\n\n      const reminders = transaction.documents.filter(d =>\n        d.reminder && [\"Missing\", \"Requested\", \"Overdue\"].includes(d.status)\n      );\n\n      if (!reminders.length) {\n        alert(\"No reminders needed for this transaction.\");\n        return;\n      }\n\n      const summary = reminders.map(d => `- ${d.name}: ${d.status}, responsible party: ${d.owner}, due: ${d.dueDate || \"TBD\"}`).join(\"\\n\");\n      alert(`Reminder Summary for ${transaction.address}\\n\\n${summary}`);\n    }\n\n    function openTransactionModal() {\n      document.getElementById(\"transactionModalBackdrop\").style.display = \"flex\";\n    }\n\n    function closeTransactionModal() {\n      document.getElementById(\"transactionModalBackdrop\").style.display = \"none\";\n      document.getElementById(\"newPropertyAddress\").value = \"\";\n      document.getElementById(\"newClientName\").value = \"\";\n      document.getElementById(\"newClosingDate\").value = \"\";\n      document.getElementById(\"newTransactionNotes\").value = \"\";\n    }\n\n    function addTransaction() {\n      const address = document.getElementById(\"newPropertyAddress\").value.trim();\n      const type = document.getElementById(\"newTransactionType\").value;\n      const stage = document.getElementById(\"newTransactionStage\").value;\n      const client = document.getElementById(\"newClientName\").value.trim();\n      const closingDate = document.getElementById(\"newClosingDate\").value;\n      const notes = document.getElementById(\"newTransactionNotes\").value.trim();\n\n      if (!address) {\n        alert(\"Please enter the property address.\");\n        return;\n      }\n\n      const newTransaction = {\n        id: Date.now(),\n        address,\n        type,\n        stage,\n        client,\n        closingDate,\n        notes,\n        createdAt: today(),\n        documents: defaultDocs.map(name => createDoc(name, \"Missing\", defaultOwnerForDoc(name, type), \"\", \"\"))\n      };\n\n      transactions.push(newTransaction);\n      selectedTransactionId = newTransaction.id;\n      saveTransactions();\n      closeTransactionModal();\n      render();\n    }\n\n    function defaultOwnerForDoc(name, type) {\n      if ([\"Pre-Approval or Proof of Funds\", \"Loan Approval\", \"Appraisal\", \"Closing Disclosure\"].includes(name)) return type === \"Seller Side\" ? \"Buyer \/ Buyer Agent\" : \"Buyer \/ Lender\";\n      if ([\"Title Commitment\", \"Escrow Deposit Receipt\"].includes(name)) return \"Title Company\";\n      if ([\"Inspection Report\", \"Final Walkthrough\"].includes(name)) return \"Buyer \/ Inspector\";\n      if ([\"Seller Disclosure\", \"Lead-Based Paint Disclosure\", \"HOA \/ Condo Documents\"].includes(name)) return \"Seller \/ Listing Agent\";\n      if ([\"Homeowners Insurance\"].includes(name)) return \"Buyer \/ Insurance Agent\";\n      return \"Agent \/ Transaction Coordinator\";\n    }\n\n    function openDocumentModal() {\n      if (!selectedTransactionId) {\n        alert(\"Please select or create a transaction first.\");\n        return;\n      }\n      document.getElementById(\"documentModalBackdrop\").style.display = \"flex\";\n    }\n\n    function closeDocumentModal() {\n      document.getElementById(\"documentModalBackdrop\").style.display = \"none\";\n      document.getElementById(\"newDocumentName\").value = \"\";\n      document.getElementById(\"newDocumentOwner\").value = \"\";\n      document.getElementById(\"newDocumentDueDate\").value = \"\";\n      document.getElementById(\"newDocumentNotes\").value = \"\";\n      document.getElementById(\"newDocumentStatus\").value = \"Missing\";\n    }\n\n    function addDocumentToTransaction() {\n      const transaction = transactions.find(t => t.id === selectedTransactionId);\n      if (!transaction) return;\n\n      const name = document.getElementById(\"newDocumentName\").value.trim();\n      const status = document.getElementById(\"newDocumentStatus\").value;\n      const owner = document.getElementById(\"newDocumentOwner\").value.trim() || \"Agent \/ Transaction Coordinator\";\n      const dueDate = document.getElementById(\"newDocumentDueDate\").value;\n      const notes = document.getElementById(\"newDocumentNotes\").value.trim();\n\n      if (!name) {\n        alert(\"Please enter a document or task name.\");\n        return;\n      }\n\n      transaction.documents.push(createDoc(name, status, owner, dueDate, notes));\n      saveTransactions();\n      closeDocumentModal();\n      render();\n    }\n\n    function render() {\n      renderSummary();\n      renderTransactions();\n      renderDetail();\n    }\n\n    function escapeHtml(value) {\n      return String(value || \"\")\n        .replace(\/&\/g, \"&amp;\")\n        .replace(\/<\/g, \"&lt;\")\n        .replace(\/>\/g, \"&gt;\")\n        .replace(\/\"\/g, \"&quot;\")\n        .replace(\/'\/g, \"&#039;\");\n    }\n\n    loadAgent();\n  <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Real Estate Transactions &#8211; Check List &#038; Docs Tracker Real Estate Transactions &#8211; Check List &#038; Docs Tracker Enter your name to open your personal&#8230;<\/p>","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-811","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Transactions Tracker - Real Estate - 360 Biz Brokers<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/360bizbrokers.com\/pt\/transactions-tracker-real-estate\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transactions Tracker - Real Estate\" \/>\n<meta property=\"og:description\" content=\"Real Estate Transactions &#8211; Check List &#038; Docs Tracker Real Estate Transactions &#8211; Check List &#038; Docs Tracker Enter your name to open your personal...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/360bizbrokers.com\/pt\/transactions-tracker-real-estate\/\" \/>\n<meta property=\"og:site_name\" content=\"360 Biz Brokers\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-14T22:55:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/\",\"url\":\"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/\",\"name\":\"Transactions Tracker - Real Estate - 360 Biz Brokers\",\"isPartOf\":{\"@id\":\"https:\/\/360bizbrokers.com\/#website\"},\"datePublished\":\"2026-05-14T22:51:52+00:00\",\"dateModified\":\"2026-05-14T22:55:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/360bizbrokers.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transactions Tracker &#8211; Real Estate\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/360bizbrokers.com\/#website\",\"url\":\"https:\/\/360bizbrokers.com\/\",\"name\":\"Florida 360 Business Brokers\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/360bizbrokers.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/360bizbrokers.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/360bizbrokers.com\/#organization\",\"name\":\"Florida 360 Business Brokers\",\"url\":\"https:\/\/360bizbrokers.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg\",\"contentUrl\":\"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg\",\"width\":1080,\"height\":1080,\"caption\":\"Florida 360 Business Brokers\"},\"image\":{\"@id\":\"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Transactions Tracker - Real Estate - 360 Biz Brokers","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/360bizbrokers.com\/pt\/transactions-tracker-real-estate\/","og_locale":"pt_BR","og_type":"article","og_title":"Transactions Tracker - Real Estate","og_description":"Real Estate Transactions &#8211; Check List &#038; Docs Tracker Real Estate Transactions &#8211; Check List &#038; Docs Tracker Enter your name to open your personal...","og_url":"https:\/\/360bizbrokers.com\/pt\/transactions-tracker-real-estate\/","og_site_name":"360 Biz Brokers","article_modified_time":"2026-05-14T22:55:05+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/","url":"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/","name":"Transactions Tracker - Real Estate - 360 Biz Brokers","isPartOf":{"@id":"https:\/\/360bizbrokers.com\/#website"},"datePublished":"2026-05-14T22:51:52+00:00","dateModified":"2026-05-14T22:55:05+00:00","breadcrumb":{"@id":"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/360bizbrokers.com\/transactions-tracker-real-estate\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/360bizbrokers.com\/"},{"@type":"ListItem","position":2,"name":"Transactions Tracker &#8211; Real Estate"}]},{"@type":"WebSite","@id":"https:\/\/360bizbrokers.com\/#website","url":"https:\/\/360bizbrokers.com\/","name":"Florida 360 Business Brokers","description":"","publisher":{"@id":"https:\/\/360bizbrokers.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/360bizbrokers.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/360bizbrokers.com\/#organization","name":"Florida 360 Business Brokers","url":"https:\/\/360bizbrokers.com\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/","url":"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg","contentUrl":"https:\/\/360bizbrokers.com\/wp-content\/uploads\/2025\/12\/LOGO-FLORIDA-360-BUSINESS-BROKERS.jpg","width":1080,"height":1080,"caption":"Florida 360 Business Brokers"},"image":{"@id":"https:\/\/360bizbrokers.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages\/811","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/comments?post=811"}],"version-history":[{"count":0,"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/pages\/811\/revisions"}],"wp:attachment":[{"href":"https:\/\/360bizbrokers.com\/pt\/wp-json\/wp\/v2\/media?parent=811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}