
Ever pushed a FHIR Bundle into production and watched half the entries silently vanish into the receiver's error log? The gap between "the code shipped" and "the data landed cleanly" is where Bundle validation earns its keep, and it is also where teams most often try to save five minutes by skipping the check.
Skipping structural validation does not remove the errors. It just moves them somewhere much more expensive to fix. For the wider map of how these pieces connect, the FHIR fundamentals hub is the right starting point, but this piece is the specific ledger of what breaks and when.
The Cheap Fixes You Skip First
The first tier of validation problems are the ones a Bundle validator catches in milliseconds. Missing resourceType at the top of an entry. A Bundle.type set to a string the spec does not recognize. A Patient.gender value of "m" instead of "male". Nothing conceptually hard, but every one of them stops the receiver cold.
These are the fixes you make in the editor before you even commit. If you skip validation, you are gambling that no such typo made it in. Once traffic scales past a couple of Bundles a day, the probability of that gamble paying off drops sharply. A quick pass through the site's Bundle validator turns a five-second oversight into a five-second edit, before the payload ever leaves your workstation.

Where the Deep Problems Actually Live
The next tier is where the real cost hides. Structural checks catch things like an Observation.subject that points to a urn:uuid: reference with no matching fullUrl inside the same Bundle. Or an entry that carries a resource with no id, submitted as a transaction where the server would need one to write it back.
These are the errors that look fine to the eye and only trigger when the receiver tries to resolve references. The reader gets a receipt saying half the entries succeeded and half did not, and now someone has to figure out which resources are safe to retry. For reading a FHIR validation error once you have one, there is a whole practice.
The Clinical Layer Nobody Warned You About
Past the wire-level errors sits a category easy to dismiss during development: profile and value-set drift. Your Bundle serializes fine, gets accepted by a permissive server, but the values it carries no longer match the profile the downstream system expects. A LOINC code that has been deprecated. A US Core extension renamed a version ago.
A validator with the right profile package flags these as warnings, not errors. If you never run validation, the drift silently propagates and shows up in a decision-support tool a month later, when a rule stops firing because the code it watched for is no longer arriving.
Cheaper to Validate Than to Explain
Add up the three tiers and the pattern is clear: every unit of validation you skip translates into more time spent explaining what went wrong. A structural check saves you from typos. A profile check saves you from drift. A terminology check saves you from clinical noise.
For the patterns that show up most often when teams start validating, the structural mistakes we see in real-world Bundles is worth reading before you inherit any of them. And if you have had a Bundle sail through dev and bounce at a partner site, the guide to receiver rejection after a local pass will look familiar.
The pattern is always the same. Cheap to check now, expensive to explain later.
Sources
- HL7 FHIR Validation Spec - HL7 FHIR core specification, canonical evergreen reference on structural, cardinality, and terminology validation layers