{"id":8697,"date":"2026-11-07T14:57:24","date_gmt":"2026-11-07T14:57:24","guid":{"rendered":"https:\/\/blog.filio.io\/?p=8697"},"modified":"2026-11-07T15:03:19","modified_gmt":"2026-11-07T15:03:19","slug":"construction-photo-software-roi","status":"publish","type":"post","link":"https:\/\/blog.filio.io\/construction-photo-software-roi\/","title":{"rendered":"Construction Photo Software ROI: A Break-Even Worksheet"},"content":{"rendered":"\n<div id=\"filio-roi-article\">\n<p>Imagine a construction software vendor claims its tool could save your team 20 hours each month. That sounds promising, but how much of that time translates into financial value? Before presenting the investment to your CFO, you need a transparent way to separate productivity gains, costs and measurable cash benefits.<\/p>\n<p>This construction photo software ROI worksheet helps operations leaders, owners and finance teams answer two questions: does released staff capacity justify the recurring cost, and can independently supported cash benefits recover the implementation investment? Those calculations use different evidence.<\/p>\n<p><strong>Every number below is illustrative. None is a Filio subscription price, customer result, industry average or G2 ROI benchmark. Replace the inputs with your own observations, cost records and documented assumptions.<\/strong><\/p>\n<h2 id=\"separate-released-capacity-avoided-expenditure-and-cash\">Separate released capacity, avoided expenditure and cash<\/h2>\n<p><strong>Released staff capacity<\/strong> is less labor needed to complete comparable work. An employee may use the time for inspections, quality checks or other tasks while payroll stays unchanged. Multiplying hours by a loaded hourly rate values that capacity; it does not prove a cash saving.<\/p>\n<p><strong>Avoided operational expenditure<\/strong> is spending that would otherwise have occurred. A documented avoided re-inspection fee can leave cash available in the business. A benefit does not require money to arrive in the bank: preventing a supported cash outflow also matters.<\/p>\n<p><strong>Realizable cash benefit<\/strong> is an incremental cash inflow or avoided outflow attributable to the change, supported by evidence of the baseline, amount and timing. Distinguish a substantiated forecast from a saving already achieved. Record the budget owner who validates it.<\/p>\n<p>These are not three amounts to add together. An avoided expense that qualifies as a cash benefit belongs in the cash calculation once. Do not add its value again, or add the labor-capacity proxy to the same payroll saving. HM Treasury\u2019s <a href=\"https:\/\/www.gov.uk\/government\/publications\/the-government-efficiency-framework\/the-government-efficiency-framework--2\" target=\"_blank\" rel=\"noopener\">efficiency guidance<\/a> similarly distinguishes spending reductions from increased capacity without a spending reduction.<\/p>\n<h2 id=\"build-the-task-worksheet-from-comparable-observations\">Build the task worksheet from comparable observations<\/h2>\n<p>Time the work your team actually performs: capturing construction site photos, retrieving a specific record and assembling a report. Use comparable task definitions, roles, project complexity and output quality before and after. Count staff minutes, not simply elapsed time when several people participate.<\/p>\n<p>Copy the worksheet below, then replace each example. Record the measurement dates, observer, sample size and supporting log. The source labels below are illustrative placeholders, not customer research.<\/p>\n<figure id=\"g2cs02-worksheet\" class=\"wp-block-image size-full\" style=\"margin:32px auto\">\n<picture>\n<source media=\"(max-width:767px)\" type=\"image\/webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-worksheet-mobile.webp 780w\" sizes=\"(max-width:449px) calc(100vw - 60px), 390px\" width=\"780\" height=\"1583\">\n<img loading=\"lazy\" class=\"wp-image-8698\" src=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-worksheet-desktop.webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-worksheet-desktop.webp 1440w\" sizes=\"auto, (max-width:1024px) calc(100vw - 60px), 720px\" width=\"1440\" height=\"1021\" alt=\"Four worksheet inputs: monthly task counts, before-and-after minutes, recurring and one-time costs, and separately documented cash evidence.\" loading=\"lazy\" decoding=\"async\">\n<\/picture>\n<figcaption>Start with comparable tasks and traceable inputs. Keep cash-benefit evidence separate from the value of released staff time.<\/figcaption>\n<\/figure>\n<p id=\"filio-roi-table-1-hint\" class=\"filio-roi-table-hint\" hidden>Scroll horizontally to compare all six columns.<\/p>\n<div id=\"filio-roi-region-1\" class=\"filio-roi-table\" role=\"region\" aria-labelledby=\"filio-roi-table-1-caption\" data-scroll-hint=\"filio-roi-table-1-hint\" tabindex=\"0\">\n<table id=\"filio-roi-table-1\">\n<caption id=\"filio-roi-table-1-caption\">Illustrative task worksheet. Replace the values and observation records with your own.<\/caption>\n<thead><tr>\n<th scope=\"col\">Task \/ participant role<\/th>\n<th scope=\"col\">Monthly count n<\/th>\n<th scope=\"col\">Before: min\/task<\/th>\n<th scope=\"col\">After: min\/task<\/th>\n<th scope=\"col\">Released hours\/month<\/th>\n<th scope=\"col\">Example source \/ period<\/th>\n<\/tr><\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">Photo capture + tagging \/ field user<\/th>\n<td>120<\/td>\n<td>4<\/td>\n<td>1.5<\/td>\n<td>5.0<\/td>\n<td>Field log \/ 2-week sample<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">Photo retrieval \/ project manager<\/th>\n<td>6<\/td>\n<td>25<\/td>\n<td>5<\/td>\n<td>2.0<\/td>\n<td>PM timesheet \/ 1-month sample<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">Report assembly \/ office administrator<\/th>\n<td>10<\/td>\n<td>45<\/td>\n<td>12<\/td>\n<td>5.5<\/td>\n<td>Admin timesheet \/ 1-month sample<\/td>\n<\/tr>\n<\/tbody>\n<tfoot>\n<tr>\n<th scope=\"row\">Total released capacity<\/th>\n<td>\u2014<\/td>\n<td>\u2014<\/td>\n<td>\u2014<\/td>\n<td>12.5<\/td>\n<td>Illustrative monthly equivalent<\/td>\n<\/tr>\n<\/tfoot>\n<\/table>\n<\/div>\n<h3 id=\"calculate-net-staff-hours\">Calculate net staff hours<\/h3>\n<p><strong>H = \u03a3[n \u00d7 (before minutes \u2212 after minutes)] \u00f7 60<\/strong><\/p>\n<p>Here, n means comparable completed tasks per month. Multiplying tasks\/month by minutes\/task gives minutes\/month; dividing by 60 gives staff hours\/month.<\/p>\n<p>The rows produce 120 \u00d7 2.5 = 300 minutes, 6 \u00d7 20 = 120 minutes, and 10 \u00d7 33 = 330 minutes. Together, that is <strong>750 minutes, or 12.5 hours\/month<\/strong>. This task example is separate from the 4-, 12- and 20-hour sensitivities below.<\/p>\n<p>If a task takes longer after the change, retain the negative difference. Include new recurring administrative work rather than selecting only faster tasks. Avoid counting the same retrieval minutes again inside report assembly.<\/p>\n<p>A two-week timing sample is not a full month of observed activity. Document how you convert sample frequency to a monthly count, and identify forecasts as forecasts. Maintain the same output standard: a faster report with missing required information is not an equivalent result.<\/p>\n<h2 id=\"include-the-full-cost-baseline\">Include the full cost baseline<\/h2>\n<p>Use three clearly labeled inputs for this example:<\/p>\n<ul>\n<li><strong>w = $45\/hour:<\/strong> loaded labor cost used to value staff capacity.<\/li>\n<li><strong>C = $300\/month:<\/strong> all modeled recurring software and operational expenditure, counted once for the workflow.<\/li>\n<li><strong>I = $1,200 once:<\/strong> all modeled implementation and training expenditure, assumed paid upfront for the cash-payback example.<\/li>\n<\/ul>\n<p>Build your own cost list from the applicable quote and operating requirements. Include software seats, required storage, device or data costs, administration, support and continuing training where they create incremental costs. Record setup, migration and initial training separately from ongoing costs.<\/p>\n<p>An existing salaried employee\u2019s training time has an opportunity cost, but it is not automatically an additional cash outlay. Track it separately if spending does not change. The cash example assumes the full $1,200 is incremental expenditure; replace that assumption with your actual cost split.<\/p>\n<p>Do not repeat the shared $300 or $1,200 against every task row. Normalize annual prices for a monthly capacity comparison, but preserve actual payment dates in a cash forecast. If roles have different loaded rates, value each row at its own rate.<\/p>\n<h2 id=\"calculate-capacity-equivalent-break-even\">Calculate capacity-equivalent break-even<\/h2>\n<p><strong>Capacity value = H \u00d7 w<\/strong><\/p>\n<p><strong>Monthly capacity-equivalent net = (H \u00d7 w) \u2212 C<\/strong><\/p>\n<p><strong>Capacity-equivalent break-even hours = C \u00f7 w<\/strong>, provided w is greater than zero.<\/p>\n<p>With $300\/month and $45\/hour, the threshold is <strong>300 \u00f7 45 = 6.67 hours\/month<\/strong>, rounded. This compares the cost-valued capacity with recurring expenditure. It does not establish payroll savings or recover the one-time implementation cost.<\/p>\n<p>The task worksheet\u2019s 12.5 hours produces <strong>$562.50\/month in capacity value<\/strong> and <strong>$262.50\/month in capacity-equivalent net value<\/strong>. These amounts remain capacity measures.<\/p>\n<p>Use the following independent sensitivity cases to test different levels of released time. They are not alternative totals calculated from the sample task rows.<\/p>\n<figure id=\"g2cs02-break-even\" class=\"wp-block-image size-full\" style=\"margin:32px auto\">\n<picture>\n<source media=\"(max-width:767px)\" type=\"image\/webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-break-even-mobile.webp 780w\" sizes=\"(max-width:449px) calc(100vw - 60px), 390px\" width=\"780\" height=\"1471\">\n<img loading=\"lazy\" class=\"wp-image-8701\" src=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-break-even-desktop.webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-break-even-desktop.webp 1440w\" sizes=\"auto, (max-width:1024px) calc(100vw - 60px), 720px\" width=\"1440\" height=\"1230\" alt=\"Illustrative capacity chart: at 45 dollars per hour and 300 dollars monthly cost, break-even is 6.67 hours. Four, twelve and twenty hours produce 180, 540 and 900 dollars in capacity value.\" loading=\"lazy\" decoding=\"async\">\n<\/picture>\n<figcaption>Illustrative capacity model: the recurring-cost threshold is 6.67 hours per month. The 4-, 12- and 20-hour cases are independent sensitivities.<\/figcaption>\n<\/figure>\n<p id=\"filio-roi-table-2-hint\" class=\"filio-roi-table-hint\" hidden>Scroll horizontally to compare all four columns.<\/p>\n<div id=\"filio-roi-region-2\" class=\"filio-roi-table\" role=\"region\" aria-labelledby=\"filio-roi-table-2-caption\" data-scroll-hint=\"filio-roi-table-2-hint\" tabindex=\"0\">\n<table id=\"filio-roi-table-2\">\n<caption id=\"filio-roi-table-2-caption\">Independent capacity scenarios at $45\/hour and $300\/month. These values represent capacity, not cash.<\/caption>\n<thead><tr>\n<th scope=\"col\">Released capacity: hours\/month<\/th>\n<th scope=\"col\">Capacity value at $45\/hour<\/th>\n<th scope=\"col\">Recurring cost\/month<\/th>\n<th scope=\"col\">Capacity-equivalent net\/month<\/th>\n<\/tr><\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">4<\/th>\n<td>$180<\/td>\n<td>$300<\/td>\n<td>\u2212$120<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">12<\/th>\n<td>$540<\/td>\n<td>$300<\/td>\n<td>$240<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">20<\/th>\n<td>$900<\/td>\n<td>$300<\/td>\n<td>$600<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Four hours falls below the capacity threshold; twelve and twenty exceed it. A positive result indicates that the labor-cost proxy exceeds recurring cost, not that cash has been recovered. It is also not an ROI percentage.<\/p>\n<h2 id=\"calculate-cash-based-payback-separately\">Calculate cash-based payback separately<\/h2>\n<p>Let <strong>F<\/strong> represent separately supported gross cash benefits in dollars\/month. The amount must come from cash evidence, not H \u00d7 w.<\/p>\n<p><strong>Net monthly cash benefit = F \u2212 C<\/strong><\/p>\n<p><strong>Simple payback in months = I \u00f7 (F \u2212 C)<\/strong>, only when F \u2212 C is positive.<\/p>\n<p>ACCA\u2019s <a href=\"https:\/\/www.accaglobal.com\/gb\/en\/student\/exam-support-resources\/foundation-level-study-resources\/ffm\/ffm-technical-articles\/discounted-payback.html\" target=\"_blank\" rel=\"noopener\">payback guidance<\/a> uses relevant cash flows, including cash cost savings, and emphasizes their timing. The shortcut below assumes $1,200 paid upfront, benefits and costs recurring from month one, and no changes during the stated period.<\/p>\n<p id=\"filio-roi-table-3-hint\" class=\"filio-roi-table-hint\" hidden>Scroll horizontally to compare all four columns.<\/p>\n<div id=\"filio-roi-region-3\" class=\"filio-roi-table\" role=\"region\" aria-labelledby=\"filio-roi-table-3-caption\" data-scroll-hint=\"filio-roi-table-3-hint\" tabindex=\"0\">\n<table id=\"filio-roi-table-3\">\n<caption id=\"filio-roi-table-3-caption\">Independent cash scenarios: $1,200 upfront, $300\/month recurring costs and constant monthly cash benefits.<\/caption>\n<thead><tr>\n<th scope=\"col\">Assumed supported cash benefit\/month<\/th>\n<th scope=\"col\">Recurring cash cost\/month<\/th>\n<th scope=\"col\">Net cash benefit\/month<\/th>\n<th scope=\"col\">Simple payback on $1,200<\/th>\n<\/tr><\/thead>\n<tbody>\n<tr>\n<th scope=\"row\">$500<\/th>\n<td>$300<\/td>\n<td>$200<\/td>\n<td>6 months<\/td>\n<\/tr>\n<tr>\n<th scope=\"row\">$350<\/th>\n<td>$300<\/td>\n<td>$50<\/td>\n<td>24 months<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>The calculations are <strong>$1,200 \u00f7 $200 = 6 months<\/strong> and <strong>$1,200 \u00f7 $50 = 24 months<\/strong>. Neither uses the 4-, 12-, 20- or 12.5-hour figures.<\/p>\n<p>For avoided expenditure, evidence could include the prior or quoted fee, the event that would have required payment, why it was avoided and finance approval. A single avoided $500 fee is not $500 of recurring monthly benefit. Confirm repeatability rather than multiplying one event across a year.<\/p>\n<p>If you include additional cash revenue, substantiate the demand and collection timing, and include associated delivery costs once in C. A signed change order alone does not prove the entire amount is incremental cash benefit.<\/p>\n<h3 id=\"when-payback-is-not-established\">When payback is not established<\/h3>\n<p>At F = $300\/month, net cash benefit is zero; below $300, it is negative. With a positive initial cost, this constant-flow model does not recover the investment under either condition.<\/p>\n<p>If cash benefit is unmeasured, label it <strong>unknown<\/strong>. A zero-benefit stress test can be useful, but unknown and measured zero are different.<\/p>\n<p>For changing or delayed flows, calculate a monthly cumulative balance: <strong>\u2212I + \u03a3(F\u2098 \u2212 C\u2098)<\/strong>. Payback occurs when it reaches zero or becomes positive; if that does not happen within the evaluation horizon, report that the investment is not recovered within that period. Simple payback ignores discounting and does not measure total lifetime profitability.<\/p>\n<figure id=\"g2cs02-capacity-cash\" class=\"wp-block-image size-full\" style=\"margin:32px auto\">\n<picture>\n<source media=\"(max-width:767px)\" type=\"image\/webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-capacity-cash-mobile.webp 780w\" sizes=\"(max-width:449px) calc(100vw - 60px), 390px\" width=\"780\" height=\"1581\">\n<img loading=\"lazy\" class=\"wp-image-8703\" src=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-capacity-cash-desktop.webp\" srcset=\"https:\/\/blog.filio.io\/wp-content\/uploads\/sites\/6\/2026\/11\/G2-CS-FALL26-02-capacity-cash-desktop.webp 1440w\" sizes=\"auto, (max-width:1024px) calc(100vw - 60px), 660px\" width=\"1440\" height=\"1021\" alt=\"Decision framework separates released capacity from documented cash benefits. Positive net cash supports simple payback; zero, negative or unknown net cash does not establish payback.\" loading=\"lazy\" decoding=\"async\">\n<\/picture>\n<figcaption>A financial payback case needs supported cash flows and positive net cash; released capacity alone does not establish it.<\/figcaption>\n<\/figure>\n<h2 id=\"test-assumptions-and-track-what-is-realized\">Test assumptions and track what is realized<\/h2>\n<p>The $350 case is a sensitivity, not a guaranteed floor or a typical result. Its 24-month payback has not recovered the initial investment by the end of year one.<\/p>\n<p>Test lower task volumes, slower adoption, seasonal workload and additional recurring costs. If forecasting from eligible task volumes, show the assumed adoption percentage explicitly. Do not apply adoption again to counts that already represent observed completed tasks.<\/p>\n<p>Assign owners to the timing log, cost record and cash-benefit evidence. Reconcile forecasts with actual results after rollout, checking that time reductions persist without lowering documentation quality. Document where released capacity went and whether a spending reduction actually occurred.<\/p>\n<p>Keep one evidence record for each cash benefit so an avoided trip, contractor charge or overtime reduction is not counted in multiple categories. Review costs and benefit timing whenever staffing, project mix or subscription requirements change.<\/p>\n<h2 id=\"use-g2-results-evidence-as-context\">Use G2 Results evidence as context<\/h2>\n<p>Filio ranked <strong>#1 in the Results Index for Jobsite Management | Fall 2026<\/strong>, with <strong>Best Results<\/strong> and <strong>Best Estimated ROI<\/strong> recognition in that category. <a href=\"https:\/\/www.filio.io\/blog\/filio-g2-fall-2026-badges\" target=\"_blank\" rel=\"noopener\">Filio\u2019s Fall 2026 evidence page<\/a> records the seasonal context; G2 explains its approach in its <a href=\"https:\/\/documentation.g2.com\/docs\/research-scoring-methodologies\" target=\"_blank\" rel=\"noopener\">research scoring methodology<\/a>.<\/p>\n<p>These are category- and season-specific signals. They do not supply this worksheet\u2019s labor rate, costs, released hours or cash benefits, and they do not guarantee your company\u2019s payback. All numerical examples here are independent editorial illustrations.<\/p>\n<h2 id=\"frequently-asked-questions\">Frequently asked questions<\/h2>\n<h3 id=\"what-is-the-difference-between-capacity-value-and-cash-savings\">What is the difference between capacity value and cash savings?<\/h3>\n<p>Capacity value prices released staff time at a loaded rate. Cash savings require a supported reduction in expenditure, including a documented expense avoided. Time can improve output without reducing spending; do not automatically put its cost-equivalent value into the cash calculation.<\/p>\n<h3 id=\"how-many-hours-per-month-must-photo-software-save-to-break-even\">How many hours per month must photo software save to break even?<\/h3>\n<p>For capacity-equivalent break-even, divide recurring monthly cost by a positive loaded hourly rate. The illustrative $300 \u00f7 $45 calculation gives 6.67 hours\/month. That threshold covers recurring cost in capacity terms; it does not recover implementation expenditure.<\/p>\n<h3 id=\"can-released-hours-be-counted-as-payroll-savings\">Can released hours be counted as payroll savings?<\/h3>\n<p>Only when evidence shows lower payroll expenditure than would otherwise occur, such as reduced paid overtime or a genuinely avoided hire. Lower contractor bills are cash benefits in a different expense category. Reassigning existing salaried staff usually releases capacity while payroll remains unchanged. Use the actual avoidable cost, not automatically the full loaded rate.<\/p>\n<h3 id=\"what-should-i-verify-before-trusting-a-vendors-roi-claim\">What should I verify before trusting a vendor\u2019s ROI claim?<\/h3>\n<p>Check comparable task definitions, observation dates, monthly volumes, adoption, full costs and cash-benefit evidence. Ask which inputs are observed and which are forecasts. Verify category and season for G2 claims, and recalculate payback using your own cash timing.<\/p>\n<h2 id=\"key-takeaways\">Key takeaways<\/h2>\n<ul>\n<li>Measure comparable tasks and keep negative time differences.<\/li>\n<li>Separate capacity value from cash benefits and avoid double counting.<\/li>\n<li>Count shared recurring and implementation costs once.<\/li>\n<li>Use positive net cash benefit for payback, with explicit timing assumptions.<\/li>\n<li>Test weaker outcomes and reconcile forecasts with realized results.<\/li>\n<\/ul>\n<h2 id=\"build-your-business-case-with-filio\">Build your business case with Filio<\/h2>\n<p>Explore Filio\u2019s <a href=\"https:\/\/www.filio.io\/features\/construction-photo-management\" target=\"_blank\" rel=\"noopener\">construction photo management<\/a> and use the <a href=\"https:\/\/www.filio.io\/blog\/visual-field-documentation-software\" target=\"_blank\" rel=\"noopener\">visual field documentation buyer\u2019s guide<\/a> to define the workflow you need.<\/p>\n<p>Bring a representative capture, retrieval and reporting task to a <a href=\"https:\/\/www.filio.io\/contact-us\" target=\"_blank\" rel=\"noopener\">Filio demo<\/a>. Ask to work through the steps your team would measure and confirm the applicable costs and requirements. Take the completed worksheet back to operations and finance, resolve unsupported assumptions, and base the decision on evidence from your own work.<\/p>\n<\/div>\n<style id=\"filio-roi-figure-sizing\">\nbody.postid-8697 #filio-roi-article :is(#g2cs02-worksheet,#g2cs02-break-even,#g2cs02-capacity-cash){width:100%;max-width:720px;margin-inline:auto!important}\nbody.postid-8697 #filio-roi-article #g2cs02-capacity-cash{max-width:660px}\nbody.postid-8697 #filio-roi-article :is(#g2cs02-worksheet,#g2cs02-break-even,#g2cs02-capacity-cash) picture{display:block}\nbody.postid-8697 #filio-roi-article :is(#g2cs02-worksheet,#g2cs02-break-even,#g2cs02-capacity-cash) img{display:block;width:100%;max-width:100%;height:auto}\n@media(max-width:767px){body.postid-8697 #filio-roi-article :is(#g2cs02-worksheet,#g2cs02-break-even,#g2cs02-capacity-cash){max-width:390px}}\n<\/style>\n<style>\nbody.postid-8697 .elementor-widget-table-of-contents.elementor-sticky--active:not(.elementor-sticky__spacer){top:var(--filio-roi-clearance,200px)!important;max-height:calc(100vh - var(--filio-roi-clearance,200px) - 16px);overflow-y:auto}\nbody.postid-8697 #filio-roi-article h2[id],body.postid-8697 #filio-roi-article h3[id]{scroll-margin-top:var(--filio-roi-clearance,200px)}\nbody.postid-8697 #filio-roi-article .filio-roi-table:focus-visible{outline:2px solid #27272a;outline-offset:4px}\nbody.postid-8697 .filio-roi-toc-synced .elementor-toc__list-wrapper .elementor-toc__list-wrapper{display:none!important;height:auto!important;overflow:visible!important}\nbody.postid-8697 .filio-roi-toc-synced li.filio-roi-toc-branch>.elementor-toc__list-wrapper{display:block!important}\n<\/style>\n<style id=\"filio-roi-table-styles\">\nbody.postid-8697 #filio-roi-article .filio-roi-table{max-width:100%;overflow-x:auto}\nbody.postid-8697 #filio-roi-article .filio-roi-table table{width:100%;min-width:560px;border-collapse:collapse}\nbody.postid-8697 #filio-roi-article #filio-roi-table-1{min-width:760px}\nbody.postid-8697 #filio-roi-article .filio-roi-table :is(th,td){vertical-align:top;padding:12px;border:1px solid #d4d4d8}\nbody.postid-8697 #filio-roi-article .filio-roi-table th{text-align:left}\nbody.postid-8697 #filio-roi-article .filio-roi-table caption{text-align:left;font-size:14px;line-height:1.5;padding-bottom:10px}\nbody.postid-8697 #filio-roi-article .filio-roi-table-hint{font-size:14px;line-height:1.5;margin-bottom:8px}\nbody.postid-8697 #filio-roi-article .filio-roi-table-hint[hidden]{display:none!important}\n<\/style>\n<script>\n(function(){\nfunction init(){\nvar root=document.getElementById('filio-roi-article');if(!root||!document.body.classList.contains('postid-8697')||root.dataset.roiNavigationReady)return;root.dataset.roiNavigationReady='true';\n\nvar roiTableRegions=Array.prototype.slice.call(root.querySelectorAll('.filio-roi-table[data-scroll-hint]'));\nfunction syncRoiScrollHints(){\nroiTableRegions.forEach(function(region){\nvar hint=document.getElementById(region.getAttribute('data-scroll-hint'));\nif(!hint||!root.contains(hint))return;\nvar overflows=region.scrollWidth>region.clientWidth;\nhint.hidden=!overflows;\nhint.style.display=overflows?'':'none';\nif(overflows)region.setAttribute('aria-describedby',hint.id);\nelse region.removeAttribute('aria-describedby');\n});\n}\nif(window.ResizeObserver){\nvar roiTableObserver=new ResizeObserver(syncRoiScrollHints);\nroiTableRegions.forEach(function(region){roiTableObserver.observe(region);var table=region.querySelector('table');if(table)roiTableObserver.observe(table);});\n}\nwindow.addEventListener('resize',syncRoiScrollHints);\nwindow.addEventListener('load',syncRoiScrollHints);\nsyncRoiScrollHints();\n\nfunction clearance(){var header=document.querySelector('header'),bar=document.getElementById('wpadminbar');var top=Math.max(header?header.getBoundingClientRect().bottom:0,bar?bar.getBoundingClientRect().bottom:0,0)+16;document.documentElement.style.setProperty('--filio-roi-clearance',top+'px');return top;}\nfunction move(target,smooth){var top=clearance();target.setAttribute('tabindex','-1');target.focus({preventScroll:true});window.scrollTo({top:Math.max(0,window.scrollY+target.getBoundingClientRect().top-top),behavior:smooth?(window.matchMedia('(prefers-reduced-motion:reduce)').matches?'instant':'smooth'):'instant'});}\ndocument.querySelectorAll('.elementor-widget-table-of-contents:not(.elementor-sticky__spacer)').forEach(function(toc){\ntoc.addEventListener('click',function(e){var a=e.target.closest('a[href*=\"#\"]');if(!a)return;var url=new URL(a.href,location.href);if(url.origin!==location.origin||url.pathname!==location.pathname||!url.hash)return;var target=document.getElementById(decodeURIComponent(url.hash.slice(1)));if(!target||!root.contains(target))return;e.preventDefault();e.stopImmediatePropagation();history.pushState(null,'',url.hash);move(target,true);},true);\n});\nvar headings=Array.prototype.slice.call(root.querySelectorAll('h2[id],h3[id]')),tocs=Array.prototype.slice.call(document.querySelectorAll('.elementor-widget-table-of-contents:not(.elementor-sticky__spacer)')),pending=false;\nfunction syncToc(){pending=false;var line=clearance()+4,current=null;headings.forEach(function(h){if(h.getBoundingClientRect().top<=line)current=h.id;});tocs.forEach(function(toc){if(!toc.querySelector('a[href*=\"#\"]'))return;if(!toc.classList.contains('filio-roi-toc-synced'))toc.classList.add('filio-roi-toc-synced');toc.querySelectorAll('li.filio-roi-toc-branch').forEach(function(li){if(!current||!li.querySelector('a[href=\"#'+current+'\"]'))li.classList.remove('filio-roi-toc-branch');});toc.querySelectorAll('a[href*=\"#\"]').forEach(function(a){var active=current?a.hash==='#'+current:false;if(a.classList.contains('elementor-item-active')!==active)a.classList.toggle('elementor-item-active',active);if(active){if(a.getAttribute('aria-current')!=='location')a.setAttribute('aria-current','location');var li=a.closest('li');while(li){if(!toc.contains(li))break;if(!li.classList.contains('filio-roi-toc-branch'))li.classList.add('filio-roi-toc-branch');li=li.parentElement.closest('li');}}else if(a.hasAttribute('aria-current'))a.removeAttribute('aria-current');});});}\nfunction queueSync(){if(!pending){pending=true;requestAnimationFrame(syncToc);}}\ntocs.forEach(function(toc){new MutationObserver(queueSync).observe(toc,{childList:true,subtree:true,attributes:true,attributeFilter:['class','style']});});\nwindow.addEventListener('scroll',queueSync,{passive:true});window.addEventListener('resize',queueSync);window.addEventListener('load',queueSync);root.querySelectorAll('img').forEach(function(img){img.addEventListener('load',queueSync);});queueSync();\n\nif(document.fonts){if(document.fonts.ready){document.fonts.ready.then(function(){syncRoiScrollHints();queueSync();});}}\n\nfunction fragment(){if(!location.hash)return;var target=document.getElementById(decodeURIComponent(location.hash.slice(1)));if(target){if(root.contains(target))move(target,false);}}\nwindow.addEventListener('popstate',fragment);window.addEventListener('hashchange',fragment);window.addEventListener('resize',clearance);window.addEventListener('load',function(){clearance();fragment();});clearance();\n}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Build a construction photo software business case using observed admin time, full costs and a break-even worksheet that separates capacity from cash savings.<\/p>\n","protected":false},"author":2,"featured_media":8699,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38],"tags":[],"class_list":["post-8697","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-construction"],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/posts\/8697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/comments?post=8697"}],"version-history":[{"count":3,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/posts\/8697\/revisions"}],"predecessor-version":[{"id":8708,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/posts\/8697\/revisions\/8708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/media\/8699"}],"wp:attachment":[{"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/media?parent=8697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/categories?post=8697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.filio.io\/wp-json\/wp\/v2\/tags?post=8697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}