Most bid teams lose margin long before submission — chasing the wrong tenders,
pricing from memory, and finding out what went wrong only after the result letter
arrives. BidNext is a working guide to the five stages that actually decide who wins:
finding the right work, qualifying it honestly, pricing it defensibly, submitting it
cleanly, and learning from every result.
Every tender deserves a bid/no-bid call — not a reflex.
The cheapest way to protect a bid team's win rate is to stop bidding jobs that
never had a real chance. Score strategic fit against realistic win probability
before a single hour goes into pricing. The matrix below is the shape of the
call — the full scoring guide has the weighted criteria behind it.
low win probability
high win probability
high strategic fit
Qualify furtherRight client, weak position — get a pre-bid meeting before committing.
BidStrong fit, strong odds — commit your best estimators.
low strategic fit
No-bidWrong job, long odds — spend the hours elsewhere.
Bid selectivelyGood odds, marginal fit — bid lean, protect the margin.
once it's qualified
Pricing is where bids are actually won or lost.
EstimateNext turns drawings into a priced, source-cited estimate — rates grounded
in real project data, every build-up transparent enough to defend in front of the
client. Built for the team that's already done the hard part of qualifying the job.
BidNext is a publication about tendering, not a software product. It publishes guides on the mechanics of bidding for construction work: finding tenders, qualifying them, pricing them, submitting them and reviewing the result. It is written for contractors, estimators and bid managers who run the tender process week to week.
Who publishes BidNext?
BidNext is published by the EstimateNext team at Softnext Solutions. That team builds EstimateNext, an AI-assisted preconstruction estimating platform focused on the pricing stage of the tender pipeline. BidNext is where they write about the stages around pricing, and the site says it is not software of its own.
What are the five stages that decide who wins a tender?
The five stages are find, qualify, price, submit, and win and learn. In order, that means sourcing live tenders and tracking deadlines, scoring each one bid or no-bid, building the BOQ and defending the rates, answering queries and packing the response, then reviewing the result whether you won or lost.
Why do bid teams lose margin before they even submit?
The site says most bid teams lose margin early by chasing the wrong tenders, pricing from memory, and learning what went wrong only after the result letter arrives. Its answer is to treat the five stages as separate decisions, since one badly made decision at any stage can cost the job.
How do I decide whether a tender is worth bidding?
Score each tender on strategic fit and realistic win probability before spending any hours on pricing. BidNext uses a two-by-two matrix with four outcomes: bid, bid selectively, qualify further, and no-bid. The aim is to stop bidding jobs that never had a real chance, which protects the team's win rate.
What should I do when a tender fits my business but my odds look weak?
Treat it as a qualify-further case rather than an automatic bid. The matrix describes this as the right client with a weak position, and suggests getting a pre-bid meeting before committing. If fit is low and odds are long, the matrix says no-bid and spend the hours elsewhere.
What does EstimateNext do for pricing a bid?
EstimateNext turns drawings into a priced, source-cited estimate. According to BidNext, its rates are grounded in real project data and each build-up is transparent enough to defend in front of the client. The site positions it for teams that have already qualified the job and now need to price it.
Get in touch
Cookie notice We use cookies for essential functionality and analytics. Analytics cookies are only set with your consent. See our Cookie Policy and Privacy Policy.
', …),
// where dollar-quote and dollar-amp are special replace tokens; and it lives in a
// JS template literal that eats backslash escapes. So keep this block free of the
// dollar sign and of backslash escapes: exact-match CTA texts (no regex end-anchor)
// plus a space-only collapse regex.
var cnxCtaTexts = ['book a demo','request a demo','get a demo','book demo','schedule a demo','talk to sales','talk to us','talk to the team','get in touch','contact us','contact sales','contact the team','contact'];
function cnxIsContactCta(el){
if (el.id && el.id.indexOf('cnx-') === 0) return false;
if (el.hasAttribute && el.hasAttribute('data-cnx-contact')) return true;
var raw = ((el.getAttribute && el.getAttribute('href')) || '').toLowerCase();
var hh = raw.split('?')[0].split('#')[0];
if (raw === '#contact' || hh === '/contact' || hh === 'contact' || hh === 'contact.html'
|| (hh.length >= 8 && hh.lastIndexOf('/contact') === hh.length - 8)
|| (hh.length >= 13 && hh.lastIndexOf('/contact.html') === hh.length - 13)) return true;
var t = (el.textContent || '').replace(/ +/g, ' ').trim().toLowerCase();
if (t.length > 24) return false;
for (var k = 0; k < cnxCtaTexts.length; k++) { if (t === cnxCtaTexts[k]) return true; }
return false;
}
document.addEventListener('click', function (e) {
var el = e.target;
while (el && el !== document) {
if (el.tagName === 'A' || el.tagName === 'BUTTON') break;
el = el.parentNode;
}
if (!el || el === document) return;
if (cnxIsContactCta(el)) {
e.preventDefault();
e.stopPropagation();
openModal();
}
}, true);
if (closeBtn) closeBtn.addEventListener('click', closeModal);
if (scrim) scrim.addEventListener('click', function(e){ if(e.target === scrim) closeModal(); });
if (form) form.addEventListener('submit', function(e){
e.preventDefault();
var note = document.getElementById('cnx-note'), err = document.getElementById('cnx-err'), btn = document.getElementById('cnx-submit');
note.style.display='none'; err.style.display='none';
if (form.website_url && form.website_url.value){ note.style.display='block'; return; } // honeypot
var payload = {
name: form.name.value, email: form.email.value, company: form.company.value,
phone: form.phone.value, message: form.message.value,
subscribe_newsletter: form.subscribe_newsletter && form.subscribe_newsletter.checked,
turnstile_token: form.turnstile_token ? form.turnstile_token.value : '',
_token_ts: tsEl ? tsEl.value : tokenTs()
};
if (!payload.name || !payload.email || !payload.company || !payload.phone || !payload.message){ err.textContent='Please fill in all required fields.'; err.style.display='block'; return; }
if (payload.phone.replace(/[^0-9]/g, '').length < 7){ err.textContent='Please enter a valid phone number.'; err.style.display='block'; return; }
btn.disabled = true; btn.textContent = 'Sending…';
post(payload).then(function(d){
if (d && d.success){ form.style.display='none'; note.style.display='block'; }
else { err.textContent = (d && d.message) || 'Something went wrong — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; }
}).catch(function(){ err.textContent='Network error — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; });
});
// --- Progressive enhancement: wire a site's OWN contact form to the CRM ---
// Targets forms that look like contact forms (have an email field AND a
// textarea/message field), aren't ours, and aren't opted out. Field mapping is
// heuristic; company falls back to the entered name so the CRM never rejects.
function pick(f, res){ for (var i=0;i
Cookie notice We use cookies for essential functionality and analytics. Analytics cookies are only set with your consent. See our Cookie Policy and Privacy Policy.