[{"data":1,"prerenderedAt":374},["ShallowReactive",2],{"article-blog_en-\u002Fblog\u002Fbid-comparison-table":3,"tag-counts-blog_en":372},{"id":4,"title":5,"author":6,"body":7,"category":355,"cover":356,"coverAlt":357,"date":358,"description":359,"draft":360,"extension":361,"meta":362,"navigation":363,"path":364,"seo":365,"stem":366,"tags":367,"updated":370,"__hash__":371},"blog_en\u002Fblog\u002Fbid-comparison-table.md","How to Compare Contractor Bids: the Columns, the Traps, and Filling the Table from PDFs","mira-holt",{"type":8,"value":9,"toc":347},"minimark",[10,14,17,20,23,27,32,44,47,241,244,248,251,257,263,269,275,281,285,288,294,300,306,313,317,325,334,338,341,344],[11,12,13],"p",{},"After the opening and before the award, somebody builds the comparison table: one row per bidder, price and schedule and warranty and qualifications in fixed columns, so you can see at a glance who is high and who is low.",[11,15,16],{},"That table is also the record you defend later. When someone at the evaluation meeting asks \"why is this one ranked second,\" and someone on an audit asks \"where did this number come from,\" the answer is the table. So it has to do two things: the columns have to be the right ones, and every number has to be traceable back to a page in a document.",[11,18,19],{},"There are plenty of templates online, but a template only gives you the header. Do this once and you learn where the time actually goes: the bidders don't state things in the same terms, so a number copied correctly can still be compared wrongly — and the proposals are PDFs, some of them scans, with the fields scattered across forty pages.",[11,21,22],{},"This piece covers three things: which columns the table needs, which fields are easiest to compare wrongly, and how to get the numbers out of the PDFs without retyping them. One note on scope: this is about the comparison table itself, not about how to design your evaluation criteria. That is a separate question.",[24,25],"figure-bid-table",{"caption":26},"A filled comparison table: six proposals, one row per bidder.",[28,29,31],"h2",{"id":30},"_1-the-columns","1. The columns",[11,33,34,35,39,40,43],{},"More columns is not better. Each column should do exactly one of two jobs: ",[36,37,38],"strong",{},"compare"," (price, duration) or ",[36,41,42],{},"disqualify"," (a short bond, an exception). A column that does neither only dilutes attention.",[11,45,46],{},"By that rule, a complete table is about thirteen columns in four groups:",[48,49,50,69],"table",{},[51,52,53],"thead",{},[54,55,56,60,63,66],"tr",{},[57,58,59],"th",{},"Group",[57,61,62],{},"Column",[57,64,65],{},"Type",[57,67,68],{},"What goes in it",[70,71,72,87,100,112,126,139,153,166,178,190,203,215,229],"tbody",{},[54,73,74,78,81,84],{},[75,76,77],"td",{},"Price",[75,79,80],{},"Total Bid Price",[75,82,83],{},"currency",[75,85,86],{},"The lump sum from the bid letter; the tax basis goes in the header",[54,88,89,91,94,97],{},[75,90,77],{},[75,92,93],{},"Discount",[75,95,96],{},"percent",[75,98,99],{},"A discount already reflected in the total",[54,101,102,104,107,109],{},[75,103,77],{},[75,105,106],{},"Bid Bond",[75,108,83],{},[75,110,111],{},"The security actually posted, read against the RFP's requirement",[54,113,114,117,120,123],{},[75,115,116],{},"Performance",[75,118,119],{},"Duration",[75,121,122],{},"number (days)",[75,124,125],{},"Header states calendar vs working days and the start trigger",[54,127,128,130,133,136],{},[75,129,116],{},[75,131,132],{},"Warranty",[75,134,135],{},"number (months)",[75,137,138],{},"Header states whether it runs from delivery or final acceptance",[54,140,141,144,147,150],{},[75,142,143],{},"Qualification",[75,145,146],{},"Vendor",[75,148,149],{},"text",[75,151,152],{},"Legal entity name, never a nickname",[54,154,155,157,160,163],{},[75,156,143],{},[75,158,159],{},"License Class",[75,161,162],{},"enum",[75,164,165],{},"Exactly as the certificate states it",[54,167,168,170,173,175],{},[75,169,143],{},[75,171,172],{},"Signatory",[75,174,149],{},[75,176,177],{},"Whoever executed the bid letter",[54,179,180,182,185,187],{},[75,181,143],{},[75,183,184],{},"Annual Revenue",[75,186,83],{},[75,188,189],{},"The financial gate, from the financial appendix",[54,191,192,194,197,200],{},[75,193,143],{},[75,195,196],{},"Bid Date",[75,198,199],{},"date",[75,201,202],{},"From the cover sheet and signature block",[54,204,205,207,210,212],{},[75,206,143],{},[75,208,209],{},"Contact",[75,211,149],{},[75,213,214],{},"You will need it for clarifications",[54,216,217,220,223,226],{},[75,218,219],{},"Responsiveness",[75,221,222],{},"Responsive",[75,224,225],{},"yes\u002Fno",[75,227,228],{},"Did they take exception to any RFP terms",[54,230,231,233,236,238],{},[75,232,219],{},[75,234,235],{},"Exceptions",[75,237,149],{},[75,239,240],{},"The deviations, in the bidder's own words",[11,242,243],{},"The last two columns are the ones most often left out, and the ones most likely to matter. One bidder is cheapest but took exception to the payment terms; another is three percent higher and fully responsive. Those two cannot be compared on price alone — the exception has to be evaluated first. If the table doesn't carry these two columns, someone ends up flipping through originals in the middle of the evaluation meeting.",[28,245,247],{"id":246},"_2-the-five-fields-where-comparisons-go-wrong","2. The five fields where comparisons go wrong",[11,249,250],{},"Once the header is fixed, the real traps begin. Bidders write things in their own terms, and five fields cause most of the damage. Fix the convention for each before you fill anything.",[11,252,253,256],{},[36,254,255],{},"The total price: with tax or without."," Some bid letters state a tax-inclusive total, some exclude tax, some give both. Mixed in one column, the difference is the tax rate itself — enough to change the ranking. Write the convention into the column header (\"Total Bid Price, incl. tax\"), and convert the odd ones before they go in.",[11,258,259,262],{},[36,260,261],{},"The discount: already deducted or not."," A common phrasing is \"$1,286,000, reflecting a 3.5% discount.\" That 3.5% has already been taken off. If whoever fills the table misses the wording and applies the discount again, that bidder just got $45,000 cheaper out of thin air. Read the sentence, not the number.",[11,264,265,268],{},[36,266,267],{},"Duration: calendar days or working days, and from when."," 210 calendar days and 210 working days are nearly three months apart. The start trigger matters too — some count from the notice of award, some from the notice to proceed. If either dimension differs, the duration column cannot be ranked.",[11,270,271,274],{},[36,272,273],{},"Warranty: from which date."," From delivery, or from final acceptance? On a project with a commissioning period, those two dates can be months apart. Same treatment as duration: the convention goes in the header.",[11,276,277,280],{},[36,278,279],{},"The bond: a gate, not a number."," The RFP asks for $250,000; a bidder posts $200,000. It happens more often than you'd expect. This column is for screening — flag the shortfall — not for comparing sizes. So it only means anything read next to the requirement, never alone.",[28,282,284],{"id":283},"_3-getting-the-numbers-out-of-the-pdfs","3. Getting the numbers out of the PDFs",[11,286,287],{},"Columns and conventions settled, what remains is manual labor. Filling six proposals by hand is slow in three specific places.",[11,289,290,293],{},[36,291,292],{},"Every field lives on a different page."," The total is in the bid letter, the license is in the qualification documents, the revenue is in the financial appendix, the exceptions are scattered through the technical volume. One row means five or six trips through a forty-page document; six rows means thirty-odd.",[11,295,296,299],{},[36,297,298],{},"Scans can't be copied."," The moment one or two bidders submitted a stamped scan, copy-paste stops working, and you're retyping from the screen — which is also where the transcription errors come from.",[11,301,302,305],{},[36,303,304],{},"Checking is slower than filling."," The numbers aren't done when they're copied. At evaluation time you have to say which document and which page each number came from, and if you didn't note it at the time, you flip through everything again. Many people simply reserve a day for the checking pass. It regularly costs more than the filling did.",[11,307,308,309,312],{},"A tool can take the first two. Whether it takes the third depends on one thing: does it give you ",[36,310,311],{},"provenance"," — the source of each value? If it hands you a table but can't say which sentence each number was read from, you're flipping through the originals yourself, and nothing was saved.",[314,315],"figure-demo",{"caption":316},"Click-to-source: every cell keeps the words it was read from.",[11,318,319,320,324],{},"Docabra's answer is to keep the source on every cell. Click a cell and the PDF opens at the right page, the words it was read from highlighted — we call this ",[321,322,323],"em",{},"click-to-source",", and scanned documents behave the same as digital ones. Checking stops being \"read everything again\" and becomes \"spot-check a few cells.\" If a column's convention was wrong, you fix the column's description and re-run.",[11,326,327,328,333],{},"There's a working example here: ",[329,330,332],"a",{"href":331},"\u002Fworkbench?template=bid-comparison","six real proposals for a traffic-signal project, already tabulated",". Two of them are scans. Click any cell to see where it came from. No signup.",[28,335,337],{"id":336},"_4-the-order-of-work","4. The order of work",[11,339,340],{},"Do it in this order: fix the columns, fix the conventions, then fill, then check. And when you check, don't sample from the top — sweep the blanks and the obvious outliers first. A blank cell means one of two things: the bidder genuinely didn't provide that field, or a page didn't survive reading. Both are things you want to know before the table goes out.",[11,342,343],{},"The other way around — copying numbers first and discovering at bidder five that the first four stated durations on different bases — means the first four rows were wasted.",[11,345,346],{},"That's the whole method. The table is simple; the discipline is in the conventions and the checking.",{"title":348,"searchDepth":349,"depth":349,"links":350},"",2,[351,352,353,354],{"id":30,"depth":349,"text":31},{"id":246,"depth":349,"text":247},{"id":283,"depth":349,"text":284},{"id":336,"depth":349,"text":337},"guides","\u002Fcovers\u002Fbid-comparison-table.jpg","Gouache illustration of two hands comparing printed proposals side by side with a magnifying glass.","2026-08-05","What a bid comparison table actually needs, the five fields where bids get compared wrong, and how to fill the table from a stack of proposal PDFs without retyping them.",false,"md",{},true,"\u002Fblog\u002Fbid-comparison-table",{"title":5,"description":359},"blog\u002Fbid-comparison-table",[368,369],"bid-tabulation","pdf-to-excel",null,"SGe02uEwi5xQtVK1Qsc2_fgSquDkkTSOJ3x2-YuozTQ",{"bid-tabulation":373,"pdf-to-excel":349,"bid-evaluation":373},3,1786355080591]