Home › Construction › WIP calculator
Free tool · Construction finance

Free Construction WIP Schedule Calculator and Excel Template

Paste or upload your job list and see over/under billing, earned revenue and gross profit by job in seconds. Then download a ready-to-use Excel WIP schedule with the formulas built in.

Runs in your browser. Your numbers are never uploadedCost-to-cost percentage of completionWorks with Excel or CSV exports from any accounting system

Showing example jobs. Replace them with yours, or upload your job cost export.

JobContract valueEst. total costCost to dateBilled to dateOriginal est. cost (optional)
Job% completeEarned revenueBilled to dateOver / (under)Est. GP %Left to billFlags

Over / (under) billing by job

Where should we send a copy?

Enter your details and the download starts right away. Your job numbers stay in your browser; only these form details are sent.

How the WIP calculation works

This calculator uses the cost-to-cost method, the most common way contractors measure percentage of completion:

  • % complete = cost to date ÷ estimated total cost
  • Earned revenue = contract value × % complete
  • Over / (under) billing = billed to date − earned revenue
  • Est. gross profit % = (contract value − estimated total cost) ÷ contract value

Add the original estimated cost and it also shows margin fade: how many points of gross profit a job has lost since it was bid.

Over-billing vs. under-billing

Over-billed jobs have invoiced ahead of the work. The excess is a liability on the balance sheet (billings in excess of costs), and it often means one job's cash is funding another.

Under-billed jobs have earned revenue that hasn't been invoiced yet (costs in excess of billings). You are financing the owner, and lenders and sureties watch it closely.

A portfolio total can look fine while individual jobs are far off in both directions, which is why WIP has to be read job by job.

Questions

Is my data uploaded anywhere?

No. The calculations run in your browser and your job numbers are never sent to us or stored. If you request a download, only your name, email and company go through the form.

Which method does it use?

Cost-to-cost percentage of completion, an input method widely used for construction revenue under ASC 606. If your company measures progress differently, the formulas in the Excel file are easy to adjust.

Can I use the Excel file as my monthly WIP schedule?

Yes. It has the formulas built in for at least 40 jobs, plus a totals row. Enter contract value, estimated cost, cost to date and billed to date, and the rest calculates.

What if my numbers come from Sage Intacct or another ERP?

Export the job cost report to Excel or CSV and upload it. The calculator matches common column names automatically. If you want WIP to update itself from the ERP instead of being rebuilt by hand every month, that's what we build.

Tired of rebuilding WIP every month?

We connect Sage Intacct and your other systems to a data warehouse and Power BI, so WIP, job cost and margin by job and project manager update automatically and tie to your general ledger.

See how it works
'; var fr=document.createElement('iframe'); fr.style.cssText='position:fixed;right:0;bottom:0;width:0;height:0;border:0'; document.body.appendChild(fr); var doc=fr.contentWindow.document; doc.open(); doc.write(h); doc.close(); setTimeout(function(){ try{ fr.contentWindow.focus(); fr.contentWindow.print(); }catch(e){} setTimeout(function(){ if(fr.parentNode) fr.parentNode.removeChild(fr); },60000); },400); } var unlocked=false; try{ unlocked=localStorage.getItem('ndw_wip_ok')==='1'; }catch(e){} var pending=null, formBuilt=false; function act(a){ g('event','wip_tool_download',{type:a}); if(a==='x') xlsx(false); else if(a==='b') xlsx(true); else pdf(); } function want(a){ if(unlocked){ act(a); return; } pending=a; var gt=$('wt-gate'); gt.style.display='block'; gt.scrollIntoView({behavior:'smooth',block:'center'}); buildForm(); } $('wt-dl-x').addEventListener('click',function(){want('x');}); $('wt-dl-p').addEventListener('click',function(){want('p');}); $('wt-dl-b').addEventListener('click',function(){want('b');}); var FORM_CSS='body,input,select,textarea,label{font-family:"Open Sans",Arial,sans-serif!important}'+ '.hs_recaptcha{position:absolute!important;left:-9999px!important;width:1px!important;height:1px!important;overflow:hidden!important;opacity:0!important;pointer-events:none!important;margin:0!important}'+ '.hs-button{width:100%!important;box-sizing:border-box!important;display:block!important;background:#1F63DB!important;border:0!important;border-radius:8px!important;padding:14px 20px!important;font-size:16px!important;font-weight:700!important;color:#fff!important;cursor:pointer}'+ '.hs-button:hover{filter:brightness(1.05)}'; FORM_CSS+="form.hs-form{display:grid!important;grid-template-columns:1fr 1fr;column-gap:12px;row-gap:12px;max-width:none!important}form.hs-form fieldset{display:contents!important}form.hs-form .hs-form-field{grid-column:1/-1;order:5;margin:0!important;width:auto!important;float:none!important;min-width:0}form.hs-form .hs_firstname{order:1;grid-column:auto}form.hs-form .hs_company{order:2;grid-column:auto}form.hs-form .hs_email{order:3;grid-column:1/-1}form.hs-form .hs_erp_system_web{order:4;grid-column:1/-1}form.hs-form .hs_submit,form.hs-form .hs_error_rollup,form.hs-form .legal-consent-container,form.hs-form .hs-richtext{order:9;grid-column:1/-1}form.hs-form .hs-form-field>label{font-size:12.5px!important;font-weight:600!important;color:#1E2F52!important;margin:0 0 4px!important;line-height:1.3!important;display:block}form.hs-form .hs-form-required{color:#d93025!important;margin-left:2px}form.hs-form .input{margin:0!important}form.hs-form .hs-input{width:100%!important;box-sizing:border-box!important;height:40px!important;min-height:0!important;padding:0 12px!important;font-size:14.5px!important;line-height:normal!important;border:1px solid #C9D3E3!important;border-radius:8px!important;background:#fff!important;color:#03245D!important;box-shadow:none!important}form.hs-form select.hs-input{padding-right:28px!important;color:#5a6a87!important}form.hs-form .hs-input:focus{outline:none!important;border-color:#2873FC!important;box-shadow:0 0 0 3px rgba(40,115,252,.15)!important}form.hs-form .hs-input::placeholder{color:#8a97b0}form.hs-form .hs-error-msgs{margin:4px 0 0!important;padding:0!important;list-style:none}form.hs-form .hs-error-msg{font-size:12px!important;color:#d93025!important}form.hs-form .hs_submit{margin-top:4px!important}form.hs-form .actions{margin:0!important;padding:0!important}form.hs-form .hs-button{height:46px!important;padding:0 20px!important;line-height:46px!important;border-radius:8px!important;font-size:15.5px!important;font-weight:700!important;margin:0!important}@media(max-width:340px){form.hs-form{grid-template-columns:1fr}}"; function showDone(vals){ var q='embed=true'; if(vals.firstname) q+='&firstName='+encodeURIComponent(vals.firstname); if(vals.email) q+='&email='+encodeURIComponent(vals.email); var el=$('wt-done'); el.innerHTML='

Your download has started.

The download buttons above now work without the form. Want WIP, job cost and margin by job updated automatically from Sage Intacct instead of rebuilt every month? Pick a time for a free 30-minute review with a senior consultant.

'; el.style.display='block'; var s=document.createElement('script'); s.src='https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js'; el.appendChild(s); } function buildForm(){ if(formBuilt) return; if(!window.hbspt||!hbspt.forms){ if(!window.__wtHs){ window.__wtHs=1; var s=document.createElement('script'); s.src='https://js-na2.hsforms.net/forms/embed/v2.js'; s.charset='utf-8'; document.head.appendChild(s); } setTimeout(buildForm,300); return; } formBuilt=true; var vals={}; hbspt.forms.create({ portalId:"241980978", formId:"a5df4662-8775-4951-b660-07255821c17b", region:"na2", target:'#hs-wip-form', inlineMessage:'Thanks! Your download is starting.', onFormReady:function(form){ try{ var el=form&&(form.jquery?form[0]:form); var doc=el?el.ownerDocument:null; if(doc&&!doc.getElementById('ndw-rc')){ var st=doc.createElement('style'); st.id='ndw-rc'; st.textContent=FORM_CSS; doc.head.appendChild(st); } var sb=doc&&doc.querySelector('input[type=submit],button[type=submit]'); if(sb){ if(sb.tagName==='INPUT') sb.value='Download now'; else sb.textContent='Download now'; } }catch(e){} }, onBeforeFormSubmit:function(f,arr){ (arr||[]).forEach(function(x){ vals[x.name]=x.value; }); }, onFormSubmitted:function(f,data){ var sv=(data&&data.submissionValues)||{}; vals.firstname=vals.firstname||sv.firstname; vals.email=vals.email||sv.email; unlocked=true; try{ localStorage.setItem('ndw_wip_ok','1'); }catch(e){} if(!window.__ndwLead){ window.__ndwLead=1; if(vals.email) g('set','user_data',{email:String(vals.email).trim().toLowerCase()}); g('event','generate_lead',{event_category:'form',event_label:'wip-tool',form_location:'wip-tool',value:1,currency:'USD'}); } setTimeout(function(){ $('wt-gate').style.display='none'; if(pending){ act(pending); pending=null; } showDone(vals); },600); } }); } window.addEventListener('message',function(e){ try{ if(/(^|\.)hubspot\.com$/.test(new URL(e.origin).hostname)&&e.data&&e.data.meetingBookSucceeded&&!window.__ndwBook){ window.__ndwBook=1; g('event','book_meeting',{value:1,currency:'USD'}); } }catch(err){} }); renderIn(); compute(); })();});