1<!DOCTYPE html><html lang="en"><head> 2 <!-- Analytics will be loaded after DOM ready for better performance --> 3 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 6
6<script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-TZZ5448V"></script>
6<script async="" src="https://scripts.clarity.ms/0.8.74-beta/clarity.js"></script>
6<script type="text/javascript" async="" src="https://www.clarity.ms/tag/txssedjw3f?ref=gtm"></script>
6<script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-VXZQGNBXN9&cx=c&gtm=4e69u2"></script>
6<script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-TZZ5448V"></script>
6<script type="text/javascript" async="" src="//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"></script>
6<script> 7 (function () { 8 var protocol = window.location && window.location.protocol; 9 var isNativeShell = protocol === "capacitor:" || protocol === "ionic:"; 10 11 if (!isNativeShell) { 12 return; 13 } 14 15 document.documentElement.classList.add("native-capacitor-shell"); 16 17 function clearNativeStartupRoot() { 18 var root = document.getElementById("root"); 19 if (!root) { 20 return false; 21 } 22 23 var hasPrerenderedContent = 24 root.getAttribute("data-prerendered") === "true"; 25 var hasStartupLoader = !!root.querySelector("#loading-indicator"); 26 27 if (!hasPrerenderedContent && !hasStartupLoader) { 28 return false; 29 } 30 31 root.innerHTML = ""; 32 root.removeAttribute("data-prerendered"); 33 root.removeAttribute("style"); 34 root.setAttribute("data-native-startup-cleared", "true"); 35 return true; 36 } 37 38 if (!clearNativeStartupRoot()) { 39 var observer = new MutationObserver(function () { 40 if (clearNativeStartupRoot()) { 41 observer.disconnect(); 42 } 43 }); 44 45 observer.observe(document.documentElement, { 46 childList: true, 47 subtree: true, 48 }); 49 50 document.addEventListener( 51 "DOMContentLoaded", 52 function () { 53 clearNativeStartupRoot(); 54 observer.disconnect(); 55 }, 56 { once: true } 57 ); 58 } 59 })(); 60 </script>
60 61 <style> 62 html.native-capacitor-shell #root[data-prerendered="true"] { 63 visibility: hidden !important; 64 opacity: 0 !important; 65 } 66 </style> 67 68 <!-- Safari Compatibility Meta Tags --> 69 <meta name="format-detection" content="telephone=no"> 70 <meta name="apple-mobile-web-app-capable" content="yes"> 71 <meta name="apple-mobile-web-app-status-bar-style" content="default"> 72 <meta name="apple-touch-fullscreen" content="yes"> 73 74 <!-- Additional Safari iOS Support --> 75 <meta name="mobile-web-app-capable" content="yes"> 76 <meta name="apple-mobile-web-app-title" content="REPSShield"> 77 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 78 <!-- SEO Meta Tags --> 79 <meta name="description" content="Expert articles on IRS Real Estate Professional Status, material participation rules, tax strategies, and REPS hour tracking. Written for real estate investors." /> 80 <meta name="keywords" content="REP status, real estate professional, IRS compliance, time tracking, material participation, rental property, tax benefits, audit ready reports"> 81 <meta name="author" content="REPSShield"> 82 <meta name="robots" content="index, follow"> 83 84 <!-- Open Graph Meta Tags --> 85 <meta property="og:title" content="Real Estate Tax & REPS Compliance Blog | REPSShield" /> 86 <meta property="og:description" content="Expert articles on IRS Real Estate Professional Status, material participation rules, tax strategies, and REPS hour tracking. Written for real estate investors." /> 87 <meta property="og:type" content="website"> 88 <meta property="og:image" content="https://repsshield.com/repsshield-logo-main.png"> 89 <meta property="og:url" content="https://repsshield.com/blog" /> 90 <meta property="og:locale" content="en_US" /> 91 <meta property="og:site_name" content="REPSShield"> 92 93 <!-- Twitter Card Meta Tags --> 94 <meta name="twitter:card" content="summary_large_image"> 95 <meta name="twitter:title" content="Real Estate Tax & REPS Compliance Blog | REPSShield" /> 96 <meta name="twitter:description" content="Expert articles on IRS Real Estate Professional Status, material participation rules, tax strategies, and REPS hour tracking. Written for real estate investors." /> 97 <meta name="twitter:image" content="https://repsshield.com/repsshield-logo-main.png"> 98 99 <!-- Google Workspace Domain Verification --> 100 <meta name="google-site-verification" content="cqP-09PR0BaU2WIhFBeqgZVvytDSELFNgi81gP7DLYc"> 101 102 <!-- Technical Meta Tags --> 103 <meta name="theme-color" content="#55b021"> 104 <meta name="apple-mobile-web-app-capable" content="yes"> 105 <meta name="apple-mobile-web-app-status-bar-style" content="default"> 106 <meta name="apple-mobile-web-app-title" content="REPSShield"> 107 <meta name="mobile-web-app-capable" content="yes"> 108 109 <!-- SEO Technical Tags --> 110 <link rel="canonical" id="canonical-link" href="https://repsshield.com/blog" /> 111 <meta name="referrer" content="no-referrer-when-downgrade"> 112 <meta http-equiv="content-language" content="en-US"> 113 <meta name="geo.region" content="US"> 114 <meta name="geo.placename" content="United States"> 115 116 <!-- Resource Links --> 117 <link rel="icon" type="image/x-icon" href="/favicon.ico"> 118 <link rel="shortcut icon" href="/favicon.png"> 119 <link rel="apple-touch-icon" href="/repsshield-logo-main.png"> 120 <link rel="manifest" href="/manifest.json"> 121 <link rel="sitemap" type="application/xml" href="/sitemap.xml"> 122 123 <!-- LunchMoney Style System with performance optimization --> 124 <link rel="stylesheet" href="/style.css" media="all"> 125 126 <!-- Performance: Preload critical CSS --> 127 <link rel="stylesheet" href="/style.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 128 <noscript><link rel="stylesheet" href="/style.css" /></noscript> 129 130 <title>Real Estate Tax & REPS Compliance Blog | REPSShield</title> 131 132 <!-- Performance Optimization: Resource Hints --> 133 <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin=""> 134 <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="">
135 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> 136 <link rel="dns-prefetch" href="//www.google-analytics.com"> 137 <link rel="preconnect" href="https://cdn.amplitude.com" crossorigin=""> 138 139 <!-- Deferred Google Tag Manager for better performance --> 140
140<script> 141 // Defer GTM loading until after page load for better performance 142 window.addEventListener("load", function () { 143 (function (w, d, s, l, i) { 144 w[l] = w[l] || []; 145 w[l].push({ 146 "gtm.start": new Date().getTime(), 147 event: "gtm.js", 148 }); 149 var f = d.getElementsByTagName(s)[0], 150 j = d.createElement(s), 151 dl = l != "dataLayer" ? "&l=" + l : ""; 152 j.async = true; 153 j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; 154 f.parentNode.insertBefore(j, f); 155 })(window, document, "script", "dataLayer", "GTM-TZZ5448V"); 156 }); 157 </script>
157 158 159 <!-- Structured Data for SEO --> 160 161
vendor: 3,251 bytes, lines 161-237
161<script type="text/javascript"> 162 (function (e, c) { 163 if (!c.__SV) { 164 var l, h; 165 window.mixpanel = c; 166 c._i = []; 167 c.init = function (q, r, f) { 168 function t(d, a) { 169 var g = a.split("."); 170 2 == g.length && ((d = d[g[0]]), (a = g[1])); 171 d[a] = function () { 172 d.push([a].concat(Array.prototype.slice.call(arguments, 0))); 173 }; 174 } 175 var b = c; 176 "undefined" !== typeof f ? (b = c[f] = []) : (f = "mixpanel"); 177 b.people = b.people || []; 178 b.toString = function (d) { 179 var a = "mixpanel"; 180 "mixpanel" !== f && (a += "." + f); 181 d || (a += " (stub)"); 182 return a; 183 }; 184 b.people.toString = function () { 185 return b.toString(1) + ".people (stub)"; 186 }; 187 l = 188 "disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders start_session_recording stop_session_recording people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split( 189 " " 190 ); 191 for (h = 0; h < l.length; h++) t(b, l[h]); 192 var n = "set set_once union unset remove delete".split(" "); 193 b.get_group = function () { 194 function d(p) { 195 a[p] = function () { 196 b.push([ 197 g, 198 [p].concat(Array.prototype.slice.call(arguments, 0)), 199 ]); 200 }; 201 } 202 for ( 203 var a = {}, 204 g = ["get_group"].concat( 205 Array.prototype.slice.call(arguments, 0) 206 ), 207 m = 0; 208 m < n.length; 209 m++ 210 ) 211 d(n[m]); 212 return a; 213 }; 214 c._i.push([q, r, f]); 215 }; 216 c.__SV = 1.2; 217 var k = e.createElement("script"); 218 k.type = "text/javascript"; 219 k.async = !0; 220 k.src = 221 "undefined" !== typeof MIXPANEL_CUSTOM_LIB_URL 222 ? MIXPANEL_CUSTOM_LIB_URL 223 : "file:" === e.location.protocol && 224 "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//) 225 ? "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" 226 : "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"; 227 e = e.getElementsByTagName("script")[0]; 228 e.parentNode.insertBefore(k, e); 229 } 230 })(document, window.mixpanel || []); 231 mixpanel.init("edfe0ecd8c675dbbc5d0103ee433f5e5", { 232 autocapture: true, 233 // Session recording consolidated into PostHog â Mixpanel keeps 234 // analytics/autocapture only, it no longer records sessions. 235 record_sessions_percent: 0, 236 }); 237 </script>
237 238 239 <!-- Amplitude Analytics (session replay consolidated into PostHog: 240 the Session Replay plugin is no longer loaded or registered) --> 241
241<script defer="" src="https://cdn.amplitude.com/libs/analytics-browser-2.11.1-min.js.gz"></script>
241 242
242<script> 243 window.addEventListener("load", function () { 244 if (window.amplitude?.init) { 245 window.amplitude.init("c705623f4bce3f86b242ede807f4c23e", { 246 autocapture: { elementInteractions: true }, 247 }); 248 } 249 }); 250 </script>
250 251
251<script type="module" crossorigin="" src="/assets/index-DGo-vssZ.js"></script>
251 252 <link rel="modulepreload" crossorigin="" href="/assets/vendor-Qgthw7N1.js"> 253 <link rel="stylesheet" crossorigin="" href="/assets/index-C2doZrJs.css"> 254 <style id="immediate-overlay-kill"> 255 vite-error-overlay, 256 [data-type="error"], 257 .error-overlay { 258 display: none !important; 259 visibility: hidden !important; 260 opacity: 0 !important; 261 pointer-events: none !important; 262 z-index: -999999 !important; 263 } 264 #root { display: block !important; visibility: visible !important; opacity: 1 !important; } 265 body { pointer-events: auto !important; visibility: visible !important; opacity: 1 !important; } 266 </style><link rel="modulepreload" as="script" crossorigin="" href="/assets/LandingPage-CpY9e08F.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/building-wUoLfZZJ.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/brain-B45HfaeR.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/timer-DEA0yRXX.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/useSEOMetaTags-DuPP1K7p.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/useSchemaMarkup-CFsXJ2MT.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/calendar-days-COgXMVIl.js"><link rel="modulepreload" as="script" crossorigin="" href="/assets/activity-BpWmCysw.js">
266<script defer="" src="https://cloud.umami.is/script.js" data-website-id="0473b837-662f-4cd9-ada3-b65b89dc1e73"></script>
266<script defer="" data-domain="repsshield.com" data-api="https://plausible.io/api/event" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.revenue.tagged-events.js"></script>
266<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"REPSShield","url":"https://repsshield.com","logo":"https://repsshield.com/repsshield-logo-main.png","sameAs":["https://www.facebook.com/people/REPSShield/61581467498722/","https://x.com/repsshield","http://linkedin.com/company/repsshield","https://www.threads.com/@repsshield","https://www.instagram.com/repsshield/","https://www.tiktok.com/@repsshield"]}</script>
266<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"REPSShield","applicationCategory":"BusinessApplication","description":"Professional IRS REP tracking software to track REP hours and maintain IRS compliance for real estate professionals, including STR Tax Loophole tracking.","url":"https://repsshield.com","operatingSystem":"Web Browser","softwareVersion":"1.0","offers":{"@type":"AggregateOffer","lowPrice":"10.00","highPrice":"29.00","priceCurrency":"USD","offerCount":"4","url":"https://repsshield.com/pricing"},"applicationSubCategory":"Time Tracking Software","featureList":["IRS REP tracking","Track REP hours","IRS compliance tools","Material participation tracking for STR tax loophole","Audit-ready reports","Real estate professional time tracking"],"publisher":{"@type":"Organization","name":"REPSShield"}}</script>
266<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What is the Real Estate Professional (REP) Status tax designation?","acceptedAnswer":{"@type":"Answer","text":"REP Status is an IRS tax designation that allows qualified real estate investors to treat rental losses as active income losses, which can offset W-2 or other active income."}},{"@type":"Question","name":"What is the best way to track Real Estate Professional (REP) hours for IRS audit defense?","acceptedAnswer":{"@type":"Answer","text":"Use professional, contemporaneous time-tracking software to log all daily real estate activities, including timestamps and detailed descriptions, to generate audit-ready annual reports."}},{"@type":"Question","name":"Which real estate activities count towards the REP 750-hour requirement?","acceptedAnswer":{"@type":"Answer","text":"Qualifying activities include property management, tenant relations, maintenance oversight, financial recordkeeping, lease negotiations, property acquisition, and direct participation in operations."}},{"@type":"Question","name":"How many hours are required to qualify for REP status?","acceptedA
266nswer":{"@type":"Answer","text":"To qualify, you must log 750+ hours in real estate activities annually and demonstrate that more than half of your total work time was spent in those activities."}},{"@type":"Question","name":"What records and documentation does the IRS require for REP status?","acceptedAnswer":{"@type":"Answer","text":"The IRS requires contemporaneous records, which include detailed time logs, activity descriptions, and supporting documentation to prove active participation and audit-readiness."}},{"@type":"Question","name":"How can I prove material participation for the STR tax loophole?","acceptedAnswer":{"@type":"Answer","text":"To prove material participation (often for the STR tax loophole), you must document active, regular, and substantial involvement in property operations, such as tenant communication and maintenance coordination."}}]}</script>
266<script type="application/ld+json">{"@context":"https://schema.org","@type":"MobileApplication","name":"REPSShield","applicationCategory":"BusinessApplication","operatingSystem":"Android","downloadUrl":"https://play.google.com/store/apps/details?id=com.repsshield.app","description":"Professional IRS REP tracking mobile app for real estate professionals. Track REP hours, log activities, and maintain IRS compliance on the go.","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"REPSShield"}}</script>
266<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://repsshield.com"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://repsshield.com/blog"}]}]}</script>
266 267</head> 268 <body class="wallpaper-bg" style="visibility: visible !important; opacity: 1 !important; display: block !important; margin: 0px !important;"> 269 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 269-271
269 270 <noscript><iframe 271 src="https://www.googletagmanager.com/ns.html?id=
271GTM-TZZ5448V
vendor: 126 bytes, lines 271-277
271" 272 height="0" 273 width="0" 274 style="display: none; visibility: hidden" 275 ></iframe 276 ></noscript> 277
277<!-- End Google Tag Manager (noscript) --> 278 279 <!-- Debug: Ensure body and root are visible --> 280 <style> 281 body { 282 visibility: visible !important; 283 opacity: 1 !important; 284 display: block !important; 285 background-color: #f7f7f7; 286 } 287 #root { 288 visibility: visible !important; 289 opacity: 1 !important; 290 display: block !important; 291 min-height: 100vh; 292 } 293 .native-startup-shell { 294 min-height: 100vh; 295 display: flex; 296 align-items: center; 297 justify-content: center; 298 background: #f7f7f7; 299 color: #111827; 300 font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 301 padding: max(16px, env(safe-area-inset-top)) 16px max(16px, env(safe-area-inset-bottom)); 302 } 303 .native-startup-mascot-wrap { 304 position: relative; 305 display: inline-flex; 306 flex-direction: column; 307 align-items: center; 308 margin: 16px 0 24px; 309 } 310 .native-startup-mascot { 311 width: 96px; 312 height: 96px; 313 -o-object-fit: contain; 314 object-fit: contain; 315 animation: native-startup-bounce 1.4s ease-in-out infinite; 316 } 317 .native-startup-shadow { 318 width: 64px; 319 height: 12px; 320 margin-top: 8px; 321 border-radius: 999px; 322 background: rgba(0, 0, 0, 0.18); 323 filter: blur(2px); 324 animation: native-startup-shadow 1.4s ease-in-out infinite; 325 } 326 @keyframes native-startup-bounce { 327 0%, 100% { transform: translateY(0); } 328 50% { transform: translateY(-14px); } 329 } 330 @keyframes native-startup-shadow { 331 0%, 100% { transform: scale(1); opacity: 0.2; } 332 50% { transform: scale(0.72); opacity: 0.1; } 333 } 334 </style> 335 336 <div id="root" data-prerendered="true" data-ssr="true"> 337 <main style="max-width:1180px;margin:0 auto;padding:40px 16px"> 338 <header style="text-align:center;margin-bottom:36px"> 339 <h1 style="font-size:2.25rem;line-height:1.2;margin:0 0 12px;color:#111827">REPSShield Blog</h1> 340 <p style="font-size:18px;line-height:1.6;color:#4b5563;margin:0 auto;max-width:720px">Real estate investor tax strategies, REPS qualification guides, and IRS compliance insights.</p> 341 </header> 342 <section style="display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px"> 343 344 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 345 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/reps-with-full-time-w2-job-50-test-explained.webp" alt="Can You Qualify for REPS with a Full-Time W-2 Job? The 50% Test Explained" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 346 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 347 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 348 <a href="/blog/reps-with-full-time-w2-job-50-test-explained" style="color:inherit;text-decoration:none">Can You Qualify for REPS with a Full-Time W-2 Job? The 50% Test Explained</a> 349 </h2> 350 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · September 28, 2026 · 1 min read</p> 351 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Yes, but it's very difficult. The 50% test requires that more than half of your total personal service hours be spent in real property trades or businesses. If </p> 352 <a href="/blog/reps-with-full-time-w2-job-50-test-explained" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 353 </article> 354 355 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 356 357 <a href="/blog?category=tax-savings" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">Tax Savings</a> 358 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 359 <a href="/blog//blog/augusta-rule-real-estate-investors-tax-free-income" style="color:inherit;text-decoration:none">The Augusta Rule for Real Estate Investors: How IRC Section 280A(g) Creates Tax-Free Rental Income</a> 360 </h2> 361 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · September 21, 2026 · 15 min read</p> 362 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Yes, if you rent your home for 14 days or fewer during the year and the property is a dwelling unit used as a residence. Airbnb income from those days is tax-fr</p> 363 <a href="/blog//blog/augusta-rule-real-estate-investors-tax-free-income" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 364 </article> 365 366 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 367 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/reps-audit-defense-prove-750-hours.webp" alt="REPS Audit Defense: How to Prove Your 750 Hours When the IRS Comes Calling" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 368 <a href="/blog?category=audit-protection" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">Audit Protection</a> 369 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 370 <a href="/blog/reps-audit-defense-prove-750-hours" style="color:inherit;text-decoration:none">REPS Audit Defense: How to Prove Your 750 Hours When the IRS Comes Calling</a> 371 </h2> 372 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · September 14, 2026 · 15 min read</p> 373 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Yes. IRC Section 469(c)(7) has not been repealed or weakened. However, the IRS has intensified enforcement, so documentation is more important than ever.</p> 374 <a href="/blog/reps-audit-defense-prove-750-hours" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 375 </article> 376 377 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 378 379 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 380 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 381 <a href="/blog/real-estate-professional-status-reps-guide" style="color:inherit;text-decoration:none">Real Estate Professional Status (REPS): The Complete 2025 Guide to Qualifying, Documentation, and Tax Savings</a> 382 </h2> 383 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · September 7, 2026 · 16 min read</p> 384 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Yes, but it's challenging. You must spend more than 750 hours in real property trades or businesses AND more than 50% of your total personal service time in tho</p> 385 <a href="/blog/real-estate-professional-status-reps-guide" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 386 </article> 387 388 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 389 390 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 391 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 392 <a href="/blog/property-grouping-reps-469-election" style="color:inherit;text-decoration:none">Property Grouping for REPS: How the §469 Election Impacts Your 750-Hour Test</a> 393 </h2> 394 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · August 31, 2026 · 12 min read</p> 395 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">The grouping election under Reg. 1.469-9(g) allows a real estate professional to treat all rental real estate activities as a
395single activity for material parti</p> 396 <a href="/blog/property-grouping-reps-469-election" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 397 </article> 398 399 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 400 401 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 402 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 403 <a href="/blog/7-material-participation-tests-reps-status-2026" style="color:inherit;text-decoration:none">The 7 Material Participation Tests Explained: Which One Qualifies You for REPS Status in 2026</a> 404 </h2> 405 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · August 24, 2026 · 12 min read</p> 406 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">REPS (Real Estate Professional Status) is an IRS classification under IRC Section 469(c)(7) that allows qualifying taxpayers to deduct rental real estate losses</p> 407 <a href="/blog/7-material-participation-tests-reps-status-2026" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 408 </article> 409 410 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 411 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/bonus-depreciation-reps-maximizing-100-percent-bonus-depreciation-qualifying-hours.webp" alt="Can Bonus Depreciation Offset W-2 Income? 100% Rules for 2026" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 412 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 413 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 414 <a href="/blog/bonus-depreciation-real-estate-professional-status" style="color:inherit;text-decoration:none">Can Bonus Depreciation Offset W-2 Income? 100% Rules for 2026</a> 415 </h2> 416 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · August 10, 2026 · 13 min read</p> 417 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Bonus depreciation is a tax incentive that allows you to immediately deduct a percentage of the cost of qualifying property. Cost segregation is a study that re</p> 418 <a href="/blog/bonus-depreciation-real-estate-professional-status" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 419 </article> 420 421 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 422 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/spousal-aggregation-reps-married-couples-combine-hours.webp" alt="Can Spouses Combine Hours for REPS? What §469 Actually Says" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 423 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 424 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 425 <a href="/blog/spousal-aggregation-reps-married-couples-combine-hours" style="color:inherit;text-decoration:none">Can Spouses Combine Hours for REPS? What §469 Actually Says</a> 426 </h2> 427 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · August 3, 2026 · 11 min read</p> 428 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">No, spousal aggregation only applies to married couples filing a joint return. If you file separately, each spouse must meet the 750-hour test individually.</p> 429 <a href="/blog/spousal-aggregation-reps-married-couples-combine-hours" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 430 </article> 431 432 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 433 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/cost-segregation-for-reps-investors-2026.webp" alt="Cost Segregation + REPS: Is a Study Worth It for Your Rentals?" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 434 <a href="/blog?category=tax-savings" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">Tax Savings</a> 435 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 436 <a href="/blog/cost-segregation-for-reps-investors-2026" style="color:inherit;text-decoration:none">Cost Segregation + REPS: Is a Study Worth It for Your Rentals?</a> 437 </h2> 438 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · July 27, 2026 · 16 min read</p> 439 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">No, cost segregation will accelerate depreciation regardless of your REPS status. However, to use those deductions against active income (W-2, business), you mu</p> 440 <a href="/blog/cost-segregation-for-reps-investors-2026" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 441 </article> 442 443 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 444 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/tax-court-rulings-reps-status-3-cases.webp" alt="REPS Tax Court Cases: Why Investors Lose (and Who Won)" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 445 <a href="/blog?category=audit-protection" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">Audit Protection</a> 446 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 447 <a href="/blog/tax-court-rulings-reps-status-3-cases" style="color:inherit;text-decoration:none">REPS Tax Court Cases: Why Investors Lose (and Who Won)</a> 448 </h2> 449 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · July 20, 2026 · 9 min read</p> 450 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">The most common reason is failure to provide credible, contemporaneous evidence of the 750-hour requirement and material participation. Courts consistently reje</p> 451 <a href="/blog/tax-court-rulings-reps-status-3-cases" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 452 </article> 453 454 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 455 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/material-participation-short-term-rentals-activities-that-count.webp" alt="Material Participation for Short-Term Rentals: What Counts in 2026" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 456 <a href="/blog?category=short-term-rentals" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">Short-Term Rentals</a> 457 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 458 <a href="/blog/material-participation-short-term-rentals-activities-that-count" style="color:inherit;text-decoration:none">Material Participation for Short-Term Rentals: What Counts in 2026</a> 459 </h2> 460 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · July 13, 2026 · 15 min read</p> 461 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">Typically, at least 100 hours and more than any other individual (Test 3), or 500 total hours (Test 1). The most common test for STR investors is Test 3: more t</p> 462 <a href="/blog/material-participation-short-term-rentals-activities-that-count" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 463 </article> 464 465 <article style="border:1px solid #e5e7eb;border-radius:8px;padding:20px;background:#fff"> 466 <img src="https://pub-e49f52df6e7e46e4aa0c58e93e87ee32.r2.dev/blog-images/reps-vs-str-loophole-key-differences.webp" alt="REPS vs. STR Loophole: Which One Can You Qualify For?" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;margin-bottom:16px" /> 467 <a href="/blog?category=reps-qualification" style="display:inline-block;font-size:13px;color:#2563eb;text-decoration:none;margin-bottom:8px">REPS Qualification</a> 468 <h2 style="font-size:1.35rem;line-height:1.3;margin:0 0 10px;color:#111827"> 469 <a href="/blog/reps-vs-str-loophole-key-differences" style="color:inherit;text-decoration:none">REPS vs. STR Loophole: Which One Can You Qualify For?</a> 470 </h2> 471 <p style="font-size:13px;color:#6b7280;margin:0 0 12px">REPSShield Team · July 11, 2026 · 10 min read</p> 472 <p style="font-size:15px;line-height:1.6;color:#4b5563;margin:0 0 14px">No. You do not need Real Estate Professional Status to use the STR loophole. The STR loophole only requires you to meet the material participation tests (e.g., </p> 473 <a href="/blog/reps-vs-str-loophole-key-differences" style="font-size:14px;font-weight:600;color:#2563eb;text-decoration:none">Read article</a> 474 </article> 475 </section> 476 </main></div></article><article class="flex items-center gap-6 p-6 bg-white border rounded-xl transition-all duration-300 hover:border-green-500 hover:shadow-lg"><div class="flex-shrink-0"><div class="h-16 w-16 rounded-full bg-green-50 flex items-center justify-center transition-transform duration-300 group-hover:scale-110"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text h-8 w-8 text-green-600 transition-transform duration-300 group-hover:rotate-6" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg></div></div><div><h3 class="text-lg font-semibold text-gray-900 mb-2 tracking-tight">Audit-Ready Reports</h3><p class="text-sm text-gray-600 mb-4 leading-relaxed">Maintain meticulous records for IRS REP tracking with automated evidence collection and detailed activity logs.</p><a href="/features/audit-ready-reporting" class="text-sm font-medium text-green-600 hover:text-green-700 transition-colors">Learn more â</a></div></article><article class="flex items-center gap-6 p-6 bg-white border rounded-xl transition-all duration-300 hover:border-green-500 hover:shadow-lg"><div class="flex-shrink-0"><div class="h-16 w-16 rounded-full bg-green-50 flex items-center justify-center transition-transform duration-300 group-hover:scale-110"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-8 w-8 text-green-600 transition-transform duration-300 group-hover:rotate-6" aria-hidden="true"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg></div></div><div><h3 class="text-lg font-semibold text-gray-900 mb-2 tracking-tight">Goal Progress Tracker</h3><p class="text-sm text-gray-600 mb-4 leading-relaxed">Track progress toward REP qualification with visual indicators, milestone tracking, and automated compliance monitoring.</p><a href="/features/goal-progress-tracker" class="text-sm font-medium text-green-600 hover:text-green-700 transition-colors">Learn more â</a></div></article><article class="flex items-center gap-6 p-6 bg-white border rounded-xl transition-all duration-300 hover:border-green-500 hover:shadow-lg"><div class="flex-shrink-0"><div class="h-16 w-16 rounded-full bg-green-50 flex items-center justify-center transition-transform duration-300 group-hover:scale-110"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house h-8 w-8 text-green-600 transition-transform duration-300 group-hover:rotate-6" aria-hidden="true"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg></div></div><div><h3 class="text-lg font-semibold text-gray-900 mb-2 tracking-tight">Multi-Property Support</h3><p class="text-sm text-gray-600 mb-4 leading-relaxed">
476Manage and track time across multiple rental properties with detailed property-specific reporting and analytics.</p><a href="/features/multi-property-support" class="text-sm font-medium text-green-600 hover:text-green-700 transition-colors">Learn more â</a></div></article></section><div class="rep-section container mx-auto px-4 py-20 space-y-20"><div class="mt-4 mb-12 text-center max-w-2xl mx-auto"><div class="mb-6"><span class="inline-block rounded-full bg-green-50 text-green-700 text-xs font-bold px-4 py-1.5">IRS-COMPLAINT TIME LOGGING</span></div><h2 class="text-3xl sm:text-4xl font-bold text-gray-900 mb-4">Time Tracking for Both <span class="text-green-600">Rental Types</span></h2><p class="mt-2 text-lg text-gray-600">Easily track hours for both long-term and short-term rentals with compliance tools and activity logging.</p></div><div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center"><div class="flex justify-center lg:justify-start w-full"><img src="/land-logo/2.png" alt="Long-term rental property time tracking interface showing 750-hour REPS compliance progress and activity categories in REPSShield" class="rep-image w-full max-w-[650px] h-[280px]"></div><div class="lg:pl-8 w-full"><h2 class="text-2xl font-bold mb-4">750-Hour Real Estate Professional Status (REPS) Compliance Tracking</h2><p class="text-gray-600 mb-4">Track REPS hours for long-term rental properties with our advanced IRS compliance tools. Our platform provides a robust, audit-ready system for detailed activity logging, allowing you to monitor and document every minute spent on your business. Easily prove your material participation toward the crucial <strong>750-hour annual requirement</strong> with segmented time entries for property management, financial recordkeeping, and maintenance oversight, protecting your ability to convert passive rental losses into active income.</p><ul class="space-y-2"><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-primary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Property management and maintenance oversight</li><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-primary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Tenant screening and relations management</li><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-primary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Financial recordkeeping and compliance</li></ul></div></div><div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center"><div class="lg:pr-8 w-full"><h2 class="text-2xl font-bold mb-4">STR Tax Loophole: Material Participation & Time Tracking</h2><p class="text-gray-600 mb-4">Comprehensive IRS tracking for short-term rentals. By achieving material participation statusâmeeting the 100-hour test or the 500-hour standardâyou can unlock the STR tax loophole to convert passive rental losses into active losses that offset W-2 or active income. Easily monitor your hours and ensure your property adheres to the crucial 7-day average stay rule with detailed time logging, so you stay audit-ready and protect this key tax saving strategy.</p><ul class="space-y-2"><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-secondary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Material participation activities tracking</li><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-secondary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Guest communication and booking management</li><li class="flex items-start text-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-5 w-5 text-secondary mr-2 mt-0.5"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg>Property preparation and cleaning coordination</li></ul></div><div class="flex justify-center lg:justify-end w-full"><img src="/land-logo/1.png" alt="Short-term rental material participation tracking showing 100-hour and 500-hour STR tax loophole compliance in REPSShield" class="rep-image w-full max-w-[650px] h-[280px]"></div></div></div><div class="mt-20 mb-6 sm:mb-8 text-center"><div class="mb-6"><span class="inline-block rounded-full bg-green-50 text-green-700 text-xs font-bold px-4 py-1.5">PROFESSIONAL REP TOOLS</span></div><h2 class="text-3xl font-semibold text-gray-900 mb-2 sm:mb-2">Discover our <span class="text-green-600">tools</span></h2><p class="mt-1 text-base text-gray-600">Powerful resources to simplify investing and stay compliant.</p></div><section class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-20 sm:mb-28" aria-labelledby="tools-heading"><h2 id="tools-heading" class="sr-only">Real Estate Investment Tools</h2><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calculator h-8 w-8 text-green-600 group-hover:text-green-700"><rect width="16" height="20" x="4" y="2" rx="2"></rect><line x1="8" x2="16" y1="6" y2="6"></line><line x1="16" x2="16" y1="14" y2="18"></line><path d="M16 10h.01"></path><path d="M12 10h.01"></path><path d="M8 10h.01"></path><path d="M12 14h.01"></path><path d="M8 14h.01"></path><path d="M12 18h.01"></path><path d="M8 18h.01"></path></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">Rental Property Calculator</h3><p class="text-sm text-gray-700 leading-relaxed">
476Comprehensive rental property investment analysis with <a href="/tools/rental-calculator" class="font-bold underline decoration-green-500">30-year projections</a>, break-even analysis, and ROI calculations.</p></article><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trending-up h-8 w-8 text-green-600 group-hover:text-green-700"><polyline points="22 7 13.5 15.5 8.5 10.5 2 17"></polyline><polyline points="16 7 22 7 22 13"></polyline></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">BRRR Strategy Calculator</h3><p class="text-sm text-gray-700 leading-relaxed">Analyze Buy, Rehab, Rent, Refinance deals with <a href="/tools/brrr-calculator" class="font-bold underline decoration-green-500">cash recovery</a> and post-refinance ROI analysis.</p></article><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check-big h-8 w-8 text-green-600 group-hover:text-green-700"><path d="M21.801 10A10 10 0 1 1 17 3.335"></path><path d="m9 11 3 3L22 4"></path></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">REP Status Qualification</h3><p class="text-sm text-gray-700 leading-relaxed">Determine if you qualify for <a href="/tools/rep-status-calculator" class="font-bold underline decoration-green-500">Real Estate Professional</a> status using official IRS guidelines.</p></article><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-target h-8 w-8 text-green-600 group-hover:text-green-700"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="6"></circle><circle cx="12" cy="12" r="2"></circle></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">REP Status Audit Scan</h3><p class="text-sm text-gray-700 leading-relaxed">Upload your REP hour tracking file and get an <a href="/tools/rep-status-audit-scan" class="font-bold underline decoration-green-500">audit readiness score</a> with AI-enhanced suggestions.</p></article><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar h-8 w-8 text-green-600 group-hover:text-green-700"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">REP Hours Tracker Generator</h3><p class="text-sm text-gray-700 leading-relaxed">Generate a custom IRS-compliant <a href="/tools/rep-hours-tracker" class="font-bold underline decoration-green-500">hours tracking template</a> in Excel, Google Sheets, or Notion.</p></article><article class="group bg-white rounded-2xl p-6 border border-green-100 shadow-sm transition-all duration-300 hover:shadow-lg hover:border-green-400 text-center"><div class="bg-green-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 transition-colors duration-300 group-hover:bg-green-200"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-building2 h-8 w-8 text-green-600 group-hover:text-green-700"><path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"></path><path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"></path><path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2"></path><path d="M10 6h4"></path><path d="M10 10h4"></path><path d="M10 14h4"></path><path d="M10 18h4"></path></svg></div><h3 class="text-lg font-semibold text-gray-900 mb-2 transition-colors duration-300 group-hover:text-green-900">1031 Exchange Timer</h3><p class="text-sm text-gray-700 leading-relaxed">Track multi-property <a href="/tools/1031-exchange-timer" class="font-bold underline decoration-green-500">1031 exchanges</a> with compliance checking and interactive timelines.</p></article></section><div class="relative mx-auto max-w-7xl my-20 rounded-3xl shadow-lg bg-gradient-to-r from-[#44958C] to-[#43A047]"><div class="px-8 md:px-12 py-10"><div class="flex flex-col md:flex-row items-center md:justify-between gap-10"><div class="flex items-center text-left max-w-2xl h-full"><div><h2 class="text-4xl md:text-3xl font-bold tracking-tight mb-3 text-white">
476Professional REP Tracking Software</h2><p class="text-base md:text-sm text-white leading-relaxed max-w-2xl">Trusted by professionals. Flexible pricing for every investor.</p></div></div><div class="flex-shrink-0 self-center md:self-auto"><a href="/pricing"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 touch-manipulation active:scale-[0.97] active:opacity-90 h-12 sm:h-11 px-6 py-2 rounded-xl border border-white text-white bg-transparent hover:bg-white hover:text-green-600 hover:shadow-lg hover:scale-105 transition-all duration-300">View Pricing</button></a></div></div></div></div><section class="pt-12 pb-12"><div class="container mx-auto px-4 sm:px-6"><div class="max-w-4xl mx-auto"><h2 class="text-3xl font-semibold text-gray-900 mb-4 sm:mb-4 text-center"><div class="mb-6"><span class="inline-block rounded-full bg-green-50 text-green-700 text-xs font-bold px-4 py-1.5">REP STATUS FAQ's</span></div>Frequently Asked Questions â <span class="text-green-600">REP Status Tracking</span></h2><p class="text-gray-700 text-md text-center mb-10">Everything you need to know about tracking your Real Estate Professional status</p><div class="w-full space-y-4" data-orientation="vertical"><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:r3:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">What is the Real Estate Professional (REP) Status tax designation?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:r4:" hidden="" role="region" aria-labelledby="radix-:r3:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:r5:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">What is the best way to track Real Estate Professional (REP) hours for IRS audit defense?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:r6:" hidden="" role="region" aria-labelledby="radix-:r5:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:r7:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">Which real estate activities count towards the REP 750-hour requirement?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:r8:" hidden="" role="region" aria-labelledby="radix-:r7:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:r9:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">How many hours are required to qualify for REP status?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:ra:" hidden="" role="region" aria-labelledby="radix-:r9:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:rb:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">What records and documentation does the IRS require for REP status?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:rc:" hidden="" role="region" aria-labelledby="radix-:rb:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div><div data-state="closed" data-orientation="vertical" class="border rounded-2xl shadow-sm"><h3 data-orientation="vertical" data-state="closed" class="flex"><button type="button" aria-expanded="false" data-state="closed" data-orientation="vertical" id="radix-:rd:" class="flex flex-1 items-center justify-between transition-all [&[data-state=open]>svg]:rotate-180 px-5 py-4 text-left text-md font-semibold text-green-700 hover:no-underline" data-radix-collection-item="">How can I prove material participation for the STR tax loophole?<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-4 w-4 shrink-0 transition-transform duration-200"><path d="m6 9 6 6 6-6"></path></svg></button></h3><div data-state="closed" id="radix-:re:" hidden="" role="region" aria-labelledby="radix-:rd:" data-orientation="vertical" class="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" style="--radix-accordion-content-height: var(--radix-collapsible-content-height); --radix-accordion-content-width: var(--radix-collapsible-content-width);"></div></div></div></div></div></section><section class="marquee-section"><div class="marquee-container group"><div class="fade-left"></div><div class="fade-right"></div><div class="marquee-content group-hover:paused "><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock icon"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg><span class="label">Time Tracking</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text icon"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><span class="label">Material Participation</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chart-no-axes-column-increasing icon"><line x1="12" x2="12" y1="20" y2="10"></line><line x1="18" x2="18" y1="20" y2="4"></line><line x1="6" x2="6" y1="20" y2="16"></line></svg><span class="label">Audit Reports</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-target icon"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="6"></circle><circle cx="12" cy="12" r="2"></circle></svg><span class="label">
476Goal Tracker</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-building icon"><rect width="16" height="20" x="4" y="2" rx="2" ry="2"></rect><path d="M9 22v-4h6v4"></path><path d="M8 6h.01"></path><path d="M16 6h.01"></path><path d="M12 6h.01"></path><path d="M12 10h.01"></path><path d="M12 14h.01"></path><path d="M16 10h.01"></path><path d="M16 14h.01"></path><path d="M8 10h.01"></path><path d="M8 14h.01"></path></svg><span class="label">Multi Property</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-brain icon"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"></path><path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"></path><path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4"></path><path d="M17.599 6.5a3 3 0 0 0 .399-1.375"></path><path d="M6.003 5.125A3 3 0 0 0 6.401 6.5"></path><path d="M3.477 10.896a4 4 0 0 1 .585-.396"></path><path d="M19.938 10.5a4 4 0 0 1 .585.396"></path><path d="M6 18a4 4 0 0 1-1.967-.516"></path><path d="M19.967 17.484A4 4 0 0 1 18 18"></path></svg><span class="label">AI Features</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock icon"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg><span class="label">Time Tracking</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text icon"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><span class="label">Material Participation</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chart-no-axes-column-increasing icon"><line x1="12" x2="12" y1="20" y2="10"></line><line x1="18" x2="18" y1="20" y2="4"></line><line x1="6" x2="6" y1="20" y2="16"></line></svg><span class="label">Audit Reports</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-target icon"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="6"></circle><circle cx="12" cy="12" r="2"></circle></svg><span class="label">Goal Tracker</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-building icon"><rect width="16" height="20" x="4" y="2" rx="2" ry="2"></rect><path d="M9 22v-4h6v4"></path><path d="M8 6h.01"></path><path d="M16 6h.01"></path><path d="M12 6h.01"></path><path d="M12 10h.01"></path><path d="M12 14h.01"></path><path d="M16 10h.01"></path><path d="M16 14h.01"></path><path d="M8 10h.01"></path><path d="M8 14h.01"></path></svg><span class="label">Multi Property</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-brain icon"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"></path><path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"></path><path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4"></path><path d="M17.599 6.5a3 3 0 0 0 .399-1.375"></path><path d="M6.003 5.125A3 3 0 0 0 6.401 6.5"></path><path d="M3.477 10.896a4 4 0 0 1 .585-.396"></path><path d="M19.938 10.5a4 4 0 0 1 .585.396"></path><path d="M6 18a4 4 0 0 1-1.967-.516"></path><path d="M19.967 17.484A4 4 0 0 1 18 18"></path></svg><span class="label">AI Features</span></div></div></div><div class="marquee-container group"><div class="fade-left"></div><div class="fade-right"></div><div class="marquee-content group-hover:paused reverse"><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calculator icon"><rect width="16" height="20" x="4" y="2" rx="2"></rect><line x1="8" x2="16" y1="6" y2="6"></line><line x1="16" x2="16" y1="14" y2="18"></line><path d="M16 10h.01"></path><path d="M12 10h.01"></path><path d="M8 10h.01"></path><path d="M12 14h.01"></path><path d="M8 14h.01"></path><path d="M12 18h.01"></path><path d="M8 18h.01"></path></svg><span class="label">Rental Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-ccw icon"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"></path><path d="M16 16h5v5"></path></svg><span class="label">BRRR Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield icon"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg><span class="label">REP Status Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search icon"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><span class="label">Audit Scan</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-timer icon"><line x1="10" x2="14" y1="2" y2="2"></line><line x1="12" x2="15" y1="14" y2="11"></line><circle cx="12" cy="14" r="8"></circle></svg><span class="label">
476Hours Tracker</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-repeat icon"><path d="m17 2 4 4-4 4"></path><path d="M3 11v-1a4 4 0 0 1 4-4h14"></path><path d="m7 22-4-4 4-4"></path><path d="M21 13v1a4 4 0 0 1-4 4H3"></path></svg><span class="label">1031 Exchange Timer</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calculator icon"><rect width="16" height="20" x="4" y="2" rx="2"></rect><line x1="8" x2="16" y1="6" y2="6"></line><line x1="16" x2="16" y1="14" y2="18"></line><path d="M16 10h.01"></path><path d="M12 10h.01"></path><path d="M8 10h.01"></path><path d="M12 14h.01"></path><path d="M8 14h.01"></path><path d="M12 18h.01"></path><path d="M8 18h.01"></path></svg><span class="label">Rental Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-ccw icon"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"></path><path d="M16 16h5v5"></path></svg><span class="label">BRRR Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield icon"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg><span class="label">REP Status Calculator</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search icon"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><span class="label">Audit Scan</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-timer icon"><line x1="10" x2="14" y1="2" y2="2"></line><line x1="12" x2="15" y1="14" y2="11"></line><circle cx="12" cy="14" r="8"></circle></svg><span class="label">Hours Tracker</span></div><div class="marquee-card"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-repeat icon"><path d="m17 2 4 4-4 4"></path><path d="M3 11v-1a4 4 0 0 1 4-4h14"></path><path d="m7 22-4-4 4-4"></path><path d="M21 13v1a4 4 0 0 1-4 4H3"></path></svg><span class="label">1031 Exchange Timer</span></div></div></div></section></div></div></main><section class="relative overflow-hidden border-b-[3px] border-[#44958C] bg-[#FDF8EC]"><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex left-[5%] top-10 -rotate-6 bg-sky-100">ð </span><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex right-[6%] top-12 rotate-6 bg-amber-100">ð</span><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex left-[9%] bottom-24 -rotate-3 bg-teal-100">â±ï¸</span><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex right-[8%] bottom-28 rotate-3 bg-rose-100">ð
</span><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex left-[16%] top-24 rotate-2 bg-emerald-100">ð¡ï¸</span><span aria-hidden="true" class="absolute z-0 hidden h-14 w-14 items-center justify-center rounded-2xl text-[26px] shadow-sm ring-1 ring-black/5 md:flex right-[17%] top-28 -rotate-2 bg-violet-100">ð</span><div class="lm-container relative z-10"><div class="mx-auto max-w-2xl px-6 py-16 text-center sm:py-20"><p class="text-[13px] font-semibold uppercase tracking-[0.18em] text-[#44958C]">Built for real estate professionals</p><h2 class="mt-4 font-['Playfair_Display'] text-4xl font-bold leading-tight tracking-tight text-gray-900 sm:text-5xl">A thoughtful tool for serious <span class="relative inline-block whitespace-nowrap"><span aria-hidden="true" class="absolute inset-x-0 bottom-1 h-[0.32em] rounded-sm bg-yellow-300/80"></span><span class="relative">REP clarity</span></span>.</h2><p class="mx-auto mt-5 max-w-xl text-lg leading-relaxed text-gray-600">Join thousands of real estate professionals who track hours effortlessly, stay audit-ready, and protect their REP status with confidence.</p><form class="mx-auto mt-9 max-w-lg"><div class="flex flex-col gap-2 rounded-[2rem] border border-gray-200 bg-white p-2 shadow-md shadow-amber-900/5 sm:flex-row sm:items-center sm:rounded-full"><input type="email" class="flex w-full border-input py-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 sm:h-10 text-base sm:text-sm sm:rounded-md touch-manipulation h-12 flex-1 rounded-full border-0 bg-transparent px-4 text-gray-900 placeholder-gray-400 shadow-none focus-visible:ring-0" placeholder="Enter your email" required="" value=""><button class="inline-flex items-center gap-2 whitespace-nowrap text-sm r
476ing-offset-background duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 touch-manipulation active:scale-[0.97] active:opacity-90 py-2 sm:h-10 h-12 w-full shrink-0 justify-center rounded-full bg-[#44958C] px-6 font-medium text-white transition-colors hover:bg-[#3A7F76] sm:w-auto" type="submit">Get Started Free<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right ml-2 h-4 w-4"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></button></div><p class="mt-4 text-sm text-gray-500">14-day free trial · <span class="font-medium text-gray-700 underline decoration-yellow-400 decoration-2 underline-offset-4">No credit card required</span> · Cancel anytime</p></form></div></div></section><footer class="bg-white border-t mt-12 sm:mt-16 spacing-responsive-lg safe-area-bottom"><div class="container-mobile container-safe"><div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-6 gap-8 lg:gap-12"><div class="lg:col-span-1 max-w-md"><div class="flex items-center mb-3 sm:mb-4"><img src="/repsshield-logo-main.png" alt="REPSShield Logo" class="h-6 w-6 sm:h-8 sm:w-8 mr-2 sm:mr-3"><span class="text-responsive-base sm:text-xl font-semibold" style="color: var(--color-text);">REPSShield</span></div><p class="text-gray-600 dark:text-gray-300 mb-3 sm:mb-4 text-responsive-xs">Professional time tracking for Real Estate Professional status qualification. IRS-compliant, audit-ready, AI-powered.</p></div><div><h3 class="text-responsive-sm font-semibold mb-3 sm:mb-4" style="color: var(--color-text);">Features</h3><div class="space-y-1 sm:space-y-2"><a href="/features/time-tracking" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Time Tracking</a><a href="/features/material-participation" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Material Participation</a><a href="/features/audit-ready-reporting" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Audit Reports</a><a href="/features/goal-progress-tracker" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Goal Tracker</a><a href="/features/multi-property-support" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Multi Property</a><a href="/features/premium-features" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">AI Features</a></div></div><div><h3 class="text-responsive-sm font-semibold mb-3 sm:mb-4" style="color: var(--color-text);">Tools</h3><div class="space-y-1 sm:space-y-2"><a href="/tools/rental-calculator" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Rental Calculator</a><a href="/tools/brrr-calculator" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">BRRR Calculator</a><a href="/tools/rep-status-calculator" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">REP Status Calculator</a><a href="/tools/rep-status-audit-scan" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Audit Scan</a><a href="/tools/rep-hours-tracker" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Hours Tracker</a><a href="/tools/1031-exchange-timer" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">1031 Exchange Timer</a></div></div><div><h3 class="text-responsive-sm font-semibold mb-3 sm:mb-4" style="color: var(--color-text);">Evaluate</h3><div class="space-y-1 sm:space-y-2"><a href="/repstracker-alternative" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">REPSTracker Alternative</a></div></div><div><h3 class="text-responsive-sm font-semibold mb-3 sm:mb-4" style="color: var(--color-text);">Company</h3><div class="space-y-1 sm:space-y-2"><a href="/about" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">About</a><a href="/pricing" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Pricing</a><a href="/why-reps-shield" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Why REPSShield?</a><a href="/changelog" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Change Log</a><a href="/docs/api" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Developer API</a><a href="mailto:[email protected]" class="block text-gray-600 hover:text-blue-600 text-responsive-xs touch-target">Email</a></div></div></div>
476<div class="border-t mt-6 sm:mt-8 pt-6 sm:pt-8 text-center text-gray-500 text-responsive-xs"><p class="px-4">© 2025 REPSShield. All rights reserved. | <a href="/privacy" class="hover:text-blue-600 touch-target">Privacy Policy</a> | <a href="/terms" class="hover:text-blue-600 touch-target">Terms of Service</a></p></div></div></footer></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events: none; visibility: visible; opacity: 1; display: block;"><ol tabindex="-1" class="fixed top-0 z-[11000] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div> 477 478 479 480 <!-- Performance Optimized React Pre-Initialization --> 481
481<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/static/1.435.3/surveys.js"></script>
481<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/array/phc_x5APwUeWZHhqtjerPtcWNqvv2PQN5EsWdYHsqXj9tgwx/config.js"></script>
481<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/static/1.435.3/dead-clicks-autocapture.js"></script>
481<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/static/1.435.3/posthog-recorder.js"></script>
481<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/static/1.435.3/web-vitals-with-attribution.js"></script>
481<script defer=""> 482 // Optimize: Defer execution until DOM is parsed 483 document.addEventListener("DOMContentLoaded", function () { 484 // Environment detection 485 const isDevUrl = !window.parent || window.parent === window; 486 const isPreview = window.parent && window.parent !== window; 487 488 489 490 // Create React namespace with complete hooks implementation IMMEDIATELY 491 window.React = { 492 // Core hooks that the plugin tries to access 493 useState: function (initialState) { 494 495 let state = initialState; 496 const setState = (newState) => { 497 state = 498 typeof newState === "function" ? newState(state) : newState; 499 }; 500 return [state, setState]; 501 }, 502 503 useEffect: function (effect, deps) { 504 505 try { 506 if (typeof effect === "function") { 507 const cleanup = effect(); 508 if (typeof cleanup === "function") { 509 setTimeout(cleanup, 0); 510 } 511 } 512 } catch (e) { 513 console.warn("IMMEDIATE: useEffect error handled safely:", e); 514 } 515 }, 516 517 useRef: function (initialValue) { 518 519 return { current: initialValue }; 520 }, 521 522 useContext: function (context) { 523 524 return context?._currentValue || null; 525 }, 526 527 useReducer: function (reducer, initialState) { 528 529 let state = initialState; 530 const dispatch = (action) => { 531 try { 532 state = reducer(state, action); 533 } catch (e) { 534 console.warn("IMMEDIATE: useReducer error handled:", e); 535 } 536 }; 537 return [state, dispatch]; 538 }, 539 540 useCallback: function (callback, deps) { 541 542 return callback; 543 }, 544 545 useMemo: function (factory, deps) { 546 547 try { 548 return factory(); 549 } catch (e) { 550 console.warn("IMMEDIATE: useMemo error handled:", e); 551 return null; 552 } 553 }, 554 555 // Additional React properties that might be accessed 556 createElement: function (type, props, ...children) { 557 return { 558 type, 559 props: { 560 ...props, 561 children: children.length === 1 ? children[0] : children, 562 }, 563 key: props?.key || null, 564 ref: props?.ref || null, 565 }; 566 }, 567 568 Component: class Component { 569 constructor(props) { 570 this.props = props; 571 this.state = {}; 572 } 573 setState(partialState) { 574 this.state = { ...this.state, ...partialState }; 575 } 576 render() { 577 return null; 578 } 579 }, 580 581 Fragment: "React.Fragment", 582 version: "18.0.0", 583 }; 584 585 // Ensure React hooks are NEVER null by overriding property access 586 const reactProxy = new Proxy(window.React, { 587 get(target, prop) { 588 if (target[prop]) { 589 return target[prop]; 590 } 591 592 // If a hook is accessed that we haven't defined, provide a safe fallback 593 if (prop.startsWith("use")) { 594 595 return function (...args) { 596 console.warn( 597 `IMMEDIATE: Safe fallback ${prop} called with:`, 598 args 599 ); 600 return prop === "useState" 601 ? [null, () => {}] 602 : prop === "useRef" 603 ? { current: null } 604 : null; 605 }; 606 } 607 608 return target[prop]; 609 }, 610 }); 611 612 window.React = reactProxy; 613 614 // Enhanced global error suppression for plugin errors including wallet extensions 615 window.addEventListener( 616 "error", 617 function (event) { 618 const message = event.message || ""; 619 const filename = event.filename || ""; 620 621 // Suppress React hook null access errors 622 if ( 623 message.includes("Cannot read properties of null") && 624 (message.includes("useEffect") || message.includes("useState")) 625 ) { 626 console.log( 627 "IMMEDIATE: Prevented plugin null access error from displaying" 628 ); 629 event.preventDefault(); 630 event.stopPropagation(); 631 return false;
632 } 633 634 // Suppress browser extension property redefinition errors 635 if ( 636 message.includes("Cannot redefine property") && 637 filename.includes("extension") 638 ) { 639 console.log( 640 "IMMEDIATE: Prevented browser extension error from displaying" 641 ); 642 event.preventDefault(); 643 event.stopPropagation(); 644 return false; 645 } 646 647 // Suppress browser extension injection errors 648 if ( 649 message.includes("TypeError") && 650 filename.includes("extension") 651 ) { 652 console.log( 653 "IMMEDIATE: Prevented browser extension error from displaying" 654 ); 655 event.preventDefault(); 656 event.stopPropagation(); 657 return false; 658 } 659 }, 660 true 661 ); // Use capture phase to catch early 662 663 // Enhanced console.error suppression for plugin and wallet extension errors 664 const originalConsoleError = console.error; 665 console.error = function (...args) { 666 const message = args.join(" "); 667 668 // Suppress plugin runtime errors 669 if ( 670 message.includes("[plugin:runtime-error-plugin]") && 671 message.includes("Cannot read properties of null") 672 ) { 673 console.warn("IMMEDIATE: Suppressed plugin error message"); 674 return; 675 } 676 677 // Suppress browser extension property errors 678 if ( 679 message.includes("Cannot redefine property") && 680 filename.includes("extension") 681 ) { 682 console.warn( 683 "IMMEDIATE: Suppressed browser extension error message" 684 ); 685 return; 686 } 687 688 originalConsoleError.apply(console, args); 689 }; 690 691 // Immediate overlay suppression 692 const suppressOverlaysImmediately = () => { 693 const overlays = document.querySelectorAll( 694 'vite-error-overlay, [data-type="error"], .error-overlay' 695 ); 696 overlays.forEach((overlay) => { 697 if ( 698 overlay.textContent && 699 overlay.textContent.includes("runtime-error-plugin") 700 ) { 701 overlay.style.display = "none !important"; 702 overlay.remove(); 703 } 704 }); 705 706 // Add permanent CSS suppression 707 if (!document.getElementById("immediate-overlay-kill")) { 708 const style = document.createElement("style"); 709 style.id = "immediate-overlay-kill"; 710 style.textContent = ` 711 vite-error-overlay, 712 [data-type="error"], 713 .error-overlay { 714 display: none !important; 715 visibility: hidden !important; 716 opacity: 0 !important; 717 pointer-events: none !important; 718 z-index: -999999 !important; 719 } 720 #root { display: block !important; visibility: visible !important; opacity: 1 !important; } 721 body { pointer-events: auto !important; visibility: visible !important; opacity: 1 !important; } 722 `; 723 document.head.appendChild(style); 724 } 725 }; 726 727 // Run immediately and continuously for first few seconds 728 suppressOverlaysImmediately(); 729 const immediateInterval = setInterval(suppressOverlaysImmediately, 25); 730 731 // Early detection: Stop suppression as soon as React content appears 732 const earlyDetection = setInterval(() => { 733 const hasAppElements = 734 window.__APP_INITIALIZED__ || 735 document.querySelector( 736 '.bg-background, .min-h-screen, #root > div, .text-center, .dashboard-container, [class*="card"], [class*="container"]' 737 ) || 738 (document.querySelector("#root") && 739 document.querySelector("#root").innerHTML.length > 100); 740 if (hasAppElements) { 741 console.log( 742 "IMMEDIATE: Early React app detection - stopping overlay suppression" 743 ); 744 clearInterval(immediateInterval);
745 clearInterval(earlyDetection); 746 } 747 }, 200); // Check every 200ms for early detection 748 749 // Stop after React app loads or timeout (Safari gets special treatment) 750 const isSafari = 751 /Safari/.test(navigator.userAgent) && 752 !/Chrome/.test(navigator.userAgent); 753 const timeoutDuration = isSafari ? 60000 : 45000; // Safari gets 60s, others get 45s 754 755 setTimeout(() => { 756 const hasAppElements = 757 window.__APP_INITIALIZED__ || 758 document.querySelector( 759 '.bg-background, .min-h-screen, #root > div, .text-center, .dashboard-container, [class*="card"], [class*="container"]' 760 ) || 761 (document.querySelector("#root") && 762 document.querySelector("#root").innerHTML.length > 100); 763 764 console.log( 765 "IMMEDIATE: Timeout check - App elements found:", 766 hasAppElements 767 ); 768 console.log( 769 "IMMEDIATE: Available elements:", 770 document.querySelector("#root") 771 ? document.querySelector("#root").innerHTML.length + 772 " chars in root" 773 : "No root element" 774 ); 775 776 if (hasAppElements) { 777 console.log( 778 "IMMEDIATE: React app loaded successfully, stopping overlay suppression" 779 ); 780 clearInterval(immediateInterval); 781 clearInterval(earlyDetection); 782 } else { 783 console.log( 784 "IMMEDIATE: React app failed to load after " + 785 timeoutDuration / 1000 + 786 "s - applying fallback strategy" 787 ); 788 clearInterval(immediateInterval); 789 clearInterval(earlyDetection); 790 791 // For mobile devices, especially Safari and post-OAuth, handle specially 792 const isMobile = /Mobi|Android|iPhone|iPad/i.test( 793 navigator.userAgent 794 ); 795 const isAfterOAuth = 796 document.referrer.includes("/api/auth/") || 797 window.location.search.includes("code=") || 798 sessionStorage.getItem("oauth-in-progress") === "true" || 799 sessionStorage.getItem("oauthFlowInitiated") === "true"; 800 801 // Clear OAuth flags 802 sessionStorage.removeItem("oauth-in-progress"); 803 sessionStorage.removeItem("oauthFlowInitiated"); 804 805 // Safari NEVER goes to static page - always reloads or redirects to login 806 if (isSafari) { 807 console.log( 808 "IMMEDIATE: Safari detected - NEVER redirecting to static page" 809 ); 810 console.log( 811 "IMMEDIATE: Safari fallback - redirecting to login page for fresh auth check" 812 ); 813 window.location.href = "/login"; 814 } else if (isMobile || isAfterOAuth) { 815 console.log( 816 "IMMEDIATE: Mobile/post-OAuth detected - reloading page instead of static redirect" 817 ); 818 console.log( 819 "IMMEDIATE: isMobile:", 820 isMobile, 821 "isAfterOAuth:", 822 isAfterOAuth 823 ); 824 window.location.reload(); 825 } else { 826 console.log( 827 "IMMEDIATE: Desktop device - redirecting to login for auth check" 828 ); 829 window.location.href = "/login"; 830 } 831 } 832 }, timeoutDuration); 833 834 835 836 // Fix canonical URL to reflect current page URL 837 // Always uses the production base and strips trailing slashes so 838 // /blog/slug and /blog/slug/ resolve to the same canonical URL. 839 const canonicalLink = document.getElementById("canonical-link"); 840 if (canonicalLink) { 841 let currentPath = location.pathname; 842 if (currentPath.length > 1 && currentPath.endsWith("/")) { 843 currentPath = currentPath.slice(0, -1); 844 } 845 const correctUrl = `https://repsshield.com${currentPath}`; 846 canonicalLink.setAttribute("href", correctUrl); 847 } 848 }); // End DOMContentLoaded 849 </script>
849 850 851 <!-- Performance Monitoring and Optimization --> 852
852<script> 853 // Critical Web Vitals monitoring 854 const observer = new PerformanceObserver((list) => { 855 for (const entry of list.getEntries()) { 856 if (entry.entryType === "measure") { 857 858 } 859 } 860 }); 861 observer.observe({ entryTypes: ["measure"] }); 862 863 // Lazy load non-critical images 864 if ("IntersectionObserver" in window) { 865 const imageObserver = new IntersectionObserver((entries, observer) => { 866 entries.forEach((entry) => { 867 if (entry.isIntersecting) { 868 const img = entry.target; 869 img.src = img.dataset.src; 870 img.classList.remove("lazy"); 871 imageObserver.unobserve(img); 872 } 873 }); 874 }); 875 876 document.addEventListener("DOMContentLoaded", () => { 877 document.querySelectorAll("img[data-src]").forEach((img) => { 878 imageObserver.observe(img); 879 }); 880 }); 881 } 882 </script>
882 883 884 <!-- Optimized Post-OAuth Analytics Loading --> 885
885<script defer=""> 886 // Performance-optimized analytics loading for post-OAuth scenarios 887 window.deferredAnalyticsLoad = function () { 888 889 890 // Google Tag Manager - Load after dashboard render 891 (function (w, d, s, l, i) { 892 w[l] = w[l] || []; 893 w[l].push({ 894 "gtm.start": new Date().getTime(), 895 event: "gtm.js", 896 }); 897 var f = d.getElementsByTagName(s)[0], 898 j = d.createElement(s), 899 dl = l != "dataLayer" ? "&l=" + l : ""; 900 j.async = true; 901 j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; 902 f.parentNode.insertBefore(j, f); 903 })(window, document, "script", "dataLayer", "GTM-TZZ5448V"); 904 905 // Umami Analytics - Deferred to post-dashboard render using requestIdleCallback 906 function loadUmami() { 907 908 var umamiScript = document.createElement("script"); 909 umamiScript.defer = true; 910 umamiScript.src = "https://cloud.umami.is/script.js"; 911 umamiScript.setAttribute( 912 "data-website-id", 913 "0473b837-662f-4cd9-ada3-b65b89dc1e73" 914 ); 915 umamiScript.onload = function () { 916 917 }; 918 umamiScript.onerror = function () { 919 console.warn("[Analytics] Umami analytics failed to load"); 920 }; 921 document.head.appendChild(umamiScript); 922 } 923 924 // Use requestIdleCallback to load Umami when browser is idle (after dashboard render) 925 if (window.requestIdleCallback) {
926 window.requestIdleCallback(loadUmami, { timeout: 3000 }); 927 } else { 928 setTimeout(loadUmami, 1500); // Fallback with 1.5s delay 929 } 930 }; 931 932 // Global performance optimization for ALL pages 933 window.addEventListener("DOMContentLoaded", function () { 934 // For ALL pages (public and authenticated), defer analytics to improve performance 935 console.log( 936 "[Analytics] Page loaded - deferring analytics for optimal performance" 937 ); 938 939 // Always use maximum delay for public pages performance 940 const isPublicPage = 941 ["/features", "/pricing", "/why-reps-shield", "/about"].includes( 942 window.location.pathname 943 ) || window.location.pathname.startsWith("/features/"); 944 945 if (isPublicPage) { 946 console.log( 947 "[Analytics] Public page detected - maximum deferral for speed" 948 ); 949 // For public marketing pages, defer analytics heavily to maximize page speed 950 if (window.requestIdleCallback) { 951 window.requestIdleCallback(window.deferredAnalyticsLoad, { 952 timeout: 5000, 953 }); 954 } else { 955 setTimeout(window.deferredAnalyticsLoad, 2000); // 2s delay for public pages 956 } 957 } else if ( 958 window.location.pathname === "/" || 959 window.location.hash === "#/" 960 ) { 961 console.log( 962 "[Analytics] Dashboard detected - deferring analytics until after render" 963 ); 964 // Wait for dashboard to be fully rendered before loading analytics 965 function waitForDashboard() { 966 if ( 967 document.querySelector( 968 '[data-testid="dashboard-content"], .dashboard-container, .min-h-screen' 969 ) 970 ) { 971 972 window.deferredAnalyticsLoad(); 973 } else { 974 setTimeout(waitForDashboard, 100); 975 } 976 } 977 setTimeout(waitForDashboard, 500); // Give dashboard time to start rendering 978 } else { 979 // For other pages, load analytics with moderate delay 980 if (window.requestIdleCallback) { 981 window.requestIdleCallback(window.deferredAnalyticsLoad, { 982 timeout: 3000, 983 }); 984 } else { 985 setTimeout(window.deferredAnalyticsLoad, 1000); 986 } 987 } 988 }); 989 </script>
989 990 <!-- This is a replit script which adds a banner on the top of the page when opened in development mode outside the replit environment --> 991 <!-- Commented out to prevent blue debug banner showing in production 992
992<script type="text/javascript" src="https://replit.com/public/js/replit-dev-banner.js"></script>
992 993 --> 994 995 <!-- React App Entry Point - MUST be last to ensure all scripts are loaded first --> 996 997 998
999<script type="text/javascript" id="" charset="">var script=document.createElement("script");script.defer=!0;script.dataset.domain="repsshield.com";script.dataset.api="https://plausible.io/api/event";script.src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.revenue.tagged-events.js";document.getElementsByTagName("head")[0].appendChild(script);</script>
999 1000
1001<script type="text/javascript" id="" charset="">window.plausible=window.plausible||function(){(window.plausible.q=window.plausible.q||[]).push(arguments)};</script>
1001 1002</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.