FDA PRO guidance treats a patient-reported outcome instrument as validated evidence. Any change to the wording, the response set, the skip logic, or the scoring rule is a change to the evidence trail, and the regulator expects a version identifier that a reviewer can follow from a QuestionnaireResponse in the trial dataset back to the exact instrument that produced it. FHIR Questionnaire has the machinery for this, but only if the trial team wires it correctly from the first canonical publish.
Below is the version-management workflow that holds up under FDA PRO review, expressed in FHIR Questionnaire terms. For the SDC and forms reference, the surrounding stack is documented elsewhere.
Pin Version, Status, and Canonical URL From the First Publish
Three Questionnaire elements carry the regulatory weight and have to be set correctly at the first publish. The canonical URL identifies the instrument across every study that uses it. The version element carries the semantic version. The status element gates whether the runtime will accept new responses against it.
Questionnaire.url. Fixed for the lifetime of the instrument. Convention is a stable domain that the sponsor controls, plus a stable slug (https://sponsor.example/fhir/Questionnaire/promis-29). Do not rewrite it across amendments.Questionnaire.version. Semantic, three-part (2.1.0), and monotonic. Bump the major on breaking item changes, minor on additive changes, patch on rule fixes.Questionnaire.status. Move fromdrafttoactiveat the moment the instrument is locked for the protocol version, and toretiredwhen the amended protocol supersedes it. Never mutate an active Questionnaire in place.
The Questionnaire.copyright and Questionnaire.experimental elements are used less often for PRO, but the reviewer will look at them if either is missing on a scored instrument.
Persist the Version on Every QuestionnaireResponse
The QuestionnaireResponse carries a questionnaire reference. For traceability, pin the canonical URL plus the version, using the canonical-reference form https://sponsor.example/fhir/Questionnaire/promis-29|2.1.0. That single string is what a downstream reviewer follows from a subject's response back to the exact instrument version that produced it.
SDC's ExtractDefinition is the standard mechanism; whether the extraction is built in-house or lives inside an engine like Formbox, the extraction contract that produces the downstream Observation carries the version identifier forward on the Observation's derivedFrom reference. That is the piece a monitoring extract or a submission dataset uses to demonstrate that every observation in the trial is traceable to a specific instrument version.
Trial teams that want to walk this end to end before touching a production runtime can prototype the Questionnaire and QuestionnaireResponse in the browser at form-builder.aidbox.app, which consumes standard FHIR JSON and shows the canonical-reference behavior directly.
Ship the Amendment Without Breaking History
When a protocol amendment changes a PRO item, publish a new Questionnaire version rather than editing the existing one. The old version stays in the FHIR store at status active until the last patient on the old protocol completes, then moves to retired. A Provenance record captures the transition so a reviewer can trace which amendment triggered the version bump. The new version publishes with a bumped version element and a stable url. Runtime routing sends new responses to the new version; historical responses keep pointing at the old.
Two operational pieces support this pattern:
- Version routing in the Questionnaire runtime, keyed on protocol arm and enrollment date.
- Retirement policy in the study data manager's SOPs, so a retired Questionnaire is not silently reactivated by a template-copy operation.
The reference for the surrounding Questionnaire orchestration lives in the FHIR Questionnaire orchestration 2026 reference guide; the multi-site trial research context sits in Best SDC form engines for multi-site trial research in 2026. A working version scheme fades into the regulatory package; a broken one shows up as a data query at CSR lock.
