HomeInsightsGuide

Finding the requirement when the notice does not contain it

49 of 291 federal notices in four NAICS codes state their requirement nowhere in the notice text. Where it actually lives, and what stays invisible.

A bid decision usually gets made off the notice. Somebody reads the description field, forms a view, and either the requirement goes into a pipeline or it does not. That works until the description field is empty, or says see attached, or explains that the amendment extends the due date.

Northmark measured how often that happens. Across 291 federal notices in four NAICS codes — 541511, 541512, 541519 and 541611 — over a 91-day window: 49 of 291, one in six, stated their requirement nowhere in the notice text. Attachments were pulled for all 49, producing 182 files, and readable requirement text was recovered for 45 of them.

Four were not recoverable at all. The interesting number is not the 45. It is the 49: cluster on notice bodies alone and one notice in six is invisible to you, and you will never see the ones you missed, because a notice that does not describe itself also does not appear in a keyword search for the thing it is buying.

Three shapes of a notice that does not describe itself

In the 291-notice sample, 265 returned a non-empty body and 26 served no body at all. The 26 are the easy case: an empty field is unambiguous. The expensive case is the 24 that returned text.

  • No body. The description endpoint returns nothing. Twenty-five in this sample. Whatever the requirement is, it is in the attachments or it is nowhere.
  • A pointer. The body exists and refers somewhere else: see attached, refer to the attached statement of work. Short, grammatical, and it will pass any check that tests for a non-empty string.
  • A body about the notice. The most expensive shape, because it reads like content. The purpose of this amendment is to extend the due date. This requirement has been cancelled. The text is about the procurement action, not about the work, and a keyword classifier will happily assign it a topic.

Telling a pointer from a body

Length is the first cut and it is cruder than it looks, so it is worth stating what the thresholds are actually for. In this work two were used, for two different purposes.

  • 400 characters — below this, treat the body as absent and go to the attachments. It is a routing threshold, not a judgment about quality.
  • 2,500 characters — below this, do not use the notice as evidence about what buyers ask for. A one-line body cannot be evidence of absence, and any percentage computed against a corpus that includes them is measuring the corpus rather than the market.

Length alone still admits the third shape. A cancellation notice or an amendment can run past 400 characters comfortably. The cheap second test is a phrase set matched on the opening of the body — the purpose of this amendment, this requirement has been cancelled, the due date is extended, see attached — because notices about the procurement action announce themselves in the first sentence almost without exception.

The thing not to do is infer the requirement from the title. Titles are written to be searchable, not descriptive, and two notices titled IT Support Services can be a software development task order and a printer maintenance renewal.

What the attachments give back, and what they cost

For the 49 notices with no usable body, 182 attachment files were pulled and converted to text — roughly four files per notice. That produced readable requirement text for 45. The conversion is ordinary: PDF and DOCX to text, then the same length and phrase tests applied to the result.

The cost is not the conversion, it is the fan-out. Four files per notice, most of which are not the statement of work: the pricing sheet, the wage determination, the instructions to offerors, a representations and certifications form. On a per-notice basis it is the difference between one request and five, and on a rate-limited source that is the constraint that decides whether the method runs daily or weekly.

Two practical notes. Sort candidate files by name before fetching — the file called PWS, SOW or SOO is the one that pays, and pulling it first often makes the rest unnecessary. And keep the extracted text next to the notice, not in a cache, because the reason to have pulled it is that somebody will ask six weeks later what the requirement actually said.

What stays invisible

Four of the 49 did not yield requirement text even with the attachments in hand. The categories are predictable and worth stating, because a method that does not name its blind spots gets trusted past its range.

  • Requirements inside a .zip archive. The link is a container; the conversion step sees a binary it cannot read.
  • Requirements behind a gated portal. A notice that routes to PIEE or to a GWAC portal is describing a document that needs credentials. No amount of parsing reaches it.
  • Scanned documents without a text layer. Recoverable with optical character recognition, at a cost, and with an error rate that has to be carried forward into whatever is computed on top.

Also outside the range of this measurement entirely: state and local demand, and any requirement coded outside the four NAICS the sample was drawn on.

Two filters that silently delete a third of the data

Both of these were found the same way — a number that looked plausible, checked against a second number that should have agreed with it and did not.

A notice-type filter dropped 30% of the corpus. A control run with the type parameter applied returned 404 notices where the unfiltered query returned 576. Nothing errored. The filter is a legitimate parameter and the missing 172 were simply absent, which is the property that makes it dangerous: a query that silently narrows produces a smaller answer that looks like the same answer.

A short substring matched loosely reported a term four times too often. Counting how many notices name an ATO, a match on the bare string ato without a word boundary returned 110 of 334 — 32.9% — and it was firing on operator, coordinator, laboratory and mandatory. The real count on a word boundary is 9. The tell was two rows down in the same table: authorization to operate, spelled out, scored zero, which cannot be true if the abbreviation appears in a third of notices.

The general rule both cases teach: every count needs a second count that must agree with it. A number with no corroborating number is a number nobody has checked, and the confidently-wrong ones always come from a short string matched loosely or a filter applied quietly.

A related and less dramatic trap: where text columns are truncated for performance — here, to 8,000 characters so that dozens of substring passes finish inside a statement timeout — every resulting count is a floor and never a ceiling. A term that lives only on page 40 of a PDF is undercounted, and the error runs one way. Say which direction the error runs whenever a truncated count is reported.

What a decision made off notice text alone is missing

The obvious loss is the one in six that is invisible. The less obvious loss is selection bias in everything that remains, and it runs in a consistent direction.

A notice with a rich body is more often an early-stage market research action, where the buyer is still describing the problem. A notice that points at an attachment is more often further along, with a statement of work already written. Read only the bodies and the picture skews toward requirements that are less defined than the population actually is — which is precisely backwards for a firm deciding where a defined scope exists.

The same logic applies on the buying side. A notice whose description field says see attached is asking every reader to spend an extra step before they know whether the requirement is theirs, and the readers most likely to spend it are the ones already tracking the program. If a market research notice is meant to reach firms that are not already known, the requirement belongs in the notice text.

← All insights

Ask about anything in this guide.

The methods here are the ones we use. If one of them is wrong for your program, that is worth a conversation.

(406) 518-7280 Contact us