This is a ready-to-use register. It is the first document an auditor asks for when the subject turns to homegrown analytics, and not having one is itself a finding, because it means nobody knows how many tools produce GxP numbers or who owns them. Replace every <<FILL: ...>> placeholder, keep one row per tool, set your own document numbers and dates, and route the register through your normal document control. Field definitions, the discovery process for unregistered tools, and a filled specimen follow. This content is educational reference, not legal or regulatory advice; verify each cited regulation against the current source before you rely on it.
Register control header
| Field | Entry |
|---|---|
| Register title | GxP Analytics Tool Inventory |
| Register number | <<FILL: register ID, e.g. REG-CSV-009>> |
| Version | <<FILL: version>> |
| Effective date | <<FILL: date>> |
| Register custodian | <<FILL: role, e.g. CSV Lead>> |
| Governing procedure | <<FILL: SOP-ID>> (validation and control of GxP scripts, notebooks, and low-code analytics) |
| Update trigger | New tool registration, risk reclassification, release of a new validated version, change record closure, periodic review completion, decommissioning, discovery sweep |
| Review frequency | <<FILL: frequency, e.g. quarterly reconciliation, with a full discovery sweep every 6 months>> |
How to use this register
- One row per tool, one tool ID per row. A tool is one unit of released logic. A dashboard with fourteen measures is one row, not fourteen. A repository containing three separately released scripts is three rows.
- Register before use, not after. The register entry is created when the tool is proposed for GxP use, with status Draft. It is not a record of what was validated; it is a record of what exists.
- Register non-GxP tools too. A row that says “assessed, not GxP, must not be used for a GxP decision without reclassification” is the evidence that the decision was made rather than avoided.
- Never delete a row. Decommissioned tools stay on the register with a decommission date, because the results they produced are still in the retention period.
- The register is the schedule. The next-review-due column drives the periodic review workload. If it is not on the register, it does not get reviewed.
Because the field set is wide, this template splits the register into two linked tables sharing the tool ID. Keep them as two sheets of one controlled file, or as one table if your document system handles the width.
Part A: identity and intended use
| Field | Definition | Allowed values or format |
|---|---|---|
| Tool ID | Unique, permanent identifier. Never reused after decommissioning. | <<FILL: convention, e.g. ANL-nnnn>> |
| Tool name | Short descriptive name a reader can recognise without opening the code. | Free text |
| Tool type | The technology category, which drives which controls apply. | Script / Notebook / Dashboard / Query / Macro workbook / Pipeline job |
| Language or platform | What it is written in or built on. | Free text, for example Python, R, SQL, a business-intelligence platform, a spreadsheet application |
| Owner | The accountable role or person who runs it in production and raises changes. | Name and role |
| Author | Who wrote the released logic. Recorded separately from owner because independence is judged against the author. | Name and role, or “multiple, see repository history” |
| Business process | The GxP process the tool serves. | For example stability, continued process verification, environmental monitoring, release testing, batch disposition, complaint trending |
| GxP decision supported | The specific decision or conclusion the output feeds, in one sentence. | Free text. “Reporting” is not a decision; say what is decided. |
| Output status | Whether the tool produces the authoritative record or presents a record held elsewhere. | Record of origin / View of a validated source |
| Source system of record | Where the input data authoritatively lives. | System name and ID |
| Writes back to source | Whether the tool modifies the source data. Should be No. | Yes / No. Any Yes requires a documented justification reference. |
Part B: control state and lifecycle
| Field | Definition | Allowed values or format |
|---|---|---|
| Risk class | The classification from the risk classification form. | A (High) / B (Medium) / C (Low, GxP) / Non-GxP |
| Risk classification reference | The approved classification record. | Record ID and approval date |
| Validated version tag | The version control tag approved for GxP use, plus the commit identifier it points to. | For example v1.2-validated at a3f19c4 |
| Code location | Repository and path, or the controlled location for binary project files. | Repository or path |
| Environment reference | The pinned environment identifier: manifest file, package snapshot, or container image digest. | Free text plus digest where applicable |
| Execution location | Where the validated version runs. | Named server, workspace, or platform. “Analyst workstation” is a finding for class A and B. |
| Specification reference | The approved specification. | Document ID and version |
| Code review reference | The signed independent code review for the current validated version. | Record ID and date |
| Test evidence reference | The executed test protocol or automated test run record. | Document ID and date |
| Release statement reference | The approved statement that the tool is fit for intended use. | Document ID and date |
| Validation status | Where the tool sits in the lifecycle. | Draft / In validation / Released / Change in progress / Suspended / Decommissioned |
| Validation date | Date the current validated version was released for GxP use. | Date |
| Last periodic review | Date the last periodic review was completed. | Date, or “Not yet due” |
| Next review due | Driven by risk class interval from validation or last review. | Date |
| Open change records | Any change in flight against this tool. | Change record IDs, or None |
| Decommission status and date | Whether the tool is retired and when. | Active / Decommissioned on <<date>> / Superseded by <<tool ID>> |
| Retention location of archive | Where the archived code, environment, and evidence sit after decommissioning. | Free text |
| Notes and limitations | Stated limits of validity, known caveats, dependencies on other tools. | Free text |
Discovering shadow tools
A register only reflects reality if you actively look for what is missing. Registration by voluntary self-declaration routinely undercounts, because the people running the highest-risk unregistered tools are usually the ones most convinced their tool is too small to matter. Run all five of the following at the frequency set in the header and record what each one found.
| Method | What it looks for | Typical finding |
|---|---|---|
| Repository scan | Repositories, branches, and project files in the version control estate that contain analysis code but have no tool ID in the register | Code that was version-controlled but never validated |
| Scheduled job and orchestration review | Every scheduled task, cron entry, pipeline, and platform-scheduled refresh that runs against a GxP source, reconciled against the register | Jobs still running for tools everyone believed were retired |
| Analytics platform workspace review | Every published dashboard, dataflow, semantic model, and shared workbook on the business-intelligence platform, and who it is shared with | Dashboards published to a whole department with no owner and no measure specification |
| Source system access and query log review | Which service accounts and named users read GxP source data, and what tool sits behind each one | An undeclared account extracting release data into a spreadsheet |
| Departmental attestation | Each function head confirms in writing that every GxP analytics tool used by their function is registered, listing any additions | Macro-enabled workbooks that nobody thought of as software |
Additional prompts that reliably surface shadow tools: ask where each number in the quality metrics pack comes from and follow it back; ask what happens if the person who produces a recurring report is on leave; and read the file paths embedded in recently issued reports.
When a shadow tool is found in GxP use:
- Register it immediately with status Draft and a note that it was found by discovery, not declared.
- Classify it. If it is class A or B, suspend GxP use of its output until at least the code review and calculation verification are complete, or document the interim controls that make continued use defensible.
- Assess whether results already produced require verification, under
<<FILL: SOP-ID for data integrity investigation>>. - Record the discovery in the sweep record so the trend in shadow-tool count over time is visible to management review.
Register maintenance rules
- The custodian reconciles the register against version control tags at
<<FILL: frequency>>. A production tool whose running version does not match its registered tag is suspended until reconciled. - A tool with status Released and a next-review-due date in the past is escalated to
<<FILL: role>>within<<FILL: number>>working days. - Reclassification upward from C to B, or B to A, requires the deliverable set for the new class before continued GxP use.
- Owner departure triggers reassignment within
<<FILL: number>>working days. An orphaned class A tool is suspended. - The register itself is a controlled record and is retained for the life of the program.
Register: Part A (blank rows)
| Tool ID | Tool name | Type | Language or platform | Owner | Author | Business process | GxP decision supported | Output status | Source system of record | Writes back |
|---|---|---|---|---|---|---|---|---|---|---|
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> |
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> |
Register: Part B (blank rows)
| Tool ID | Risk class | Validated version tag | Code location | Environment reference | Execution location | Spec ref | Code review ref | Test evidence ref | Release ref | Status | Validation date | Last review | Next review due | Decommission status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> |
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> |
Filled specimen
Seven rows spanning every risk class, including one non-GxP tool, one tool with a change in flight, one suspended shadow tool found by discovery, and one decommissioned tool. Names, identifiers, and dates are illustrative.
Specimen Part A
| Tool ID | Tool name | Type | Language or platform | Owner | Author | Business process | GxP decision supported | Output status | Source system of record | Writes back |
|---|---|---|---|---|---|---|---|---|---|---|
| ANL-0007 | Stability slope and shelf-life bound | Script | Python 3.11 | K. Osei, Stability Lead | K. Osei | Stability | Sets the potency trend and shelf-life confidence bound reported in the annual product review | Record of origin | LIMS-01 | No |
| ANL-0012 | CPV control limit generator | Notebook | R 4.3, Quarto | M. Larsen, Process Statistician | M. Larsen | Continued process verification | Establishes the control limits used to judge whether a drug substance batch is in a state of control | Record of origin | Historian-02 and LIMS-01 | No |
| ANL-0021 | Release results dashboard | Dashboard | Business-intelligence platform | S. Prakash, QC Manager | S. Prakash and D. Whitfield | Release testing | Reviewed by the QA lead before batch disposition to confirm all release tests are complete and within specification | View of a validated source | LIMS-01 | No |
| ANL-0034 | Cell dose calculation workbook | Macro workbook | Spreadsheet with macros | J. Boateng, MSAT Lead | J. Boateng | Cell therapy manufacturing | Converts viable cell count to the volume dispensed for the patient dose, transcribed into the batch record | Record of origin | MES-03 | No |
| ANL-0040 | EM excursion trending query | Query | SQL | R. Ilyas, Micro Supervisor | R. Ilyas | Environmental monitoring | Produces the monthly excursion rate reviewed at the contamination control forum; no action taken on the query output alone | View of a validated source | EM-LIMS-04 | No |
| ANL-0048 | Yield exploration notebook | Notebook | Python 3.11, Jupyter | A. Ferreira, Process Engineer | A. Ferreira | Process development | None. Exploratory only. Output must not be used for a GxP decision without reclassification | View of a validated source | Historian-02 | No |
| ANL-0002 | Legacy stability slope macro | Macro workbook | Spreadsheet with macros | K. Osei, Stability Lead | Unknown, predates repository | Stability | Superseded by ANL-0007 | Record of origin | LIMS-01 | No |
Specimen Part B
| Tool ID | Risk class | Validated version tag | Environment reference | Execution location | Spec ref | Code review ref | Test evidence ref | Release ref | Status | Validation date | Last review | Next review due | Decommission status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ANL-0007 | A | v1.0-validated at a3f19c4 | requirements.txt, image digest sha256:9c1d4b... | Analytics server ANSRV-01 | SPEC-ANL-0007 v1.0 | CR-ANL-0007-001, 30 Apr 2026 | VP-ANL-0007, 05 May 2026 | RS-ANL-0007 v1.0 | Released | 12 May 2026 | Not yet due | 12 May 2027 | Active |
| ANL-0012 | A | v2.1-validated at 77be0d1 | renv.lock, image digest sha256:4e77aa... | Analytics server ANSRV-01 | SPEC-ANL-0012 v2.0 | CR-ANL-0012-004, 11 Feb 2026 | VP-ANL-0012 rev 2, 19 Feb 2026 | RS-ANL-0012 v2.1 | Change in progress (CC-2026-0501, outlier rule update) | 26 Feb 2026 | Not yet due | 26 Feb 2027 | Active |
| ANL-0021 | B | v1.4-validated at c02e5f8 | Platform workspace QC-PROD, gateway GW-02 | Business-intelligence service, workspace QC-PROD | SPEC-ANL-0021 v1.3 (14 measures specified) | CR-ANL-0021-006, 08 Jun 2026 | VP-ANL-0021, 15 Jun 2026 | RS-ANL-0021 v1.4 | Released | 22 Jun 2026 | Not yet due | 22 Jun 2028 | Active |
| ANL-0034 | A (small tool, escalated on patient reach) | v3.0-validated at 1de44a9 | Locked template, spreadsheet build <<FILL>>, macro signing certificate CERT-11 | Controlled template library, MSAT area | SPEC-ANL-0034 v3.0 | CR-ANL-0034-002, 03 Mar 2026 | VP-ANL-0034, 10 Mar 2026 | RS-ANL-0034 v3.0 | Released | 16 Mar 2026 | Not yet due | 16 Mar 2027 | Active |
| ANL-0040 | C | v1.1-validated at b8a3771 | SQL on EM-LIMS-04 read-only replica | Reporting replica RPT-02 | SPEC-ANL-0040 v1.1 | CR-ANL-0040-001, 21 Jan 2026 | Verification note VN-ANL-0040, 22 Jan 2026 | RS-ANL-0040 v1.1 | Released | 27 Jan 2026 | Not yet due | 27 Jan 2029 | Active |
| ANL-0048 | Non-GxP | Not applicable | Local project environment | Analytics server ANSRV-02, sandbox workspace | Not applicable | Not applicable | Not applicable | Not applicable | Released as non-GxP | 03 Jul 2026 | Confirmed at Jul 2026 sweep | Next sweep | Active. Limitation: output carries a non-GxP watermark and must not be pasted into a controlled document |
| ANL-0002 | A (at retirement) | v4.2-validated at f5c1092 | Archived spreadsheet build and macro, archive ARC-2026-0117 | Withdrawn | SPEC-ANL-0002 v4.0 | CR-ANL-0002-009, 2023 | VP-ANL-0002 rev 4 | RS-ANL-0002 v4.2 | Decommissioned | 2023 | 04 Feb 2026 | Not applicable | Decommissioned 12 May 2026, superseded by ANL-0007. Archive retained to 2043 per stability record retention |
Specimen discovery sweep result
| Sweep date | Method | Tools found unregistered | Action |
|---|---|---|---|
| 06 Jul 2026 | Repository scan | 2 | Both registered. One (a potency unit-conversion helper imported by ANL-0007) reclassified as part of ANL-0007 rather than a separate tool |
| 06 Jul 2026 | Scheduled job review | 1 | A nightly refresh still running for decommissioned ANL-0002. Job disabled the same day; no output had been consumed since 12 May 2026, confirmed from the report distribution list |
| 06 Jul 2026 | Platform workspace review | 3 | Two personal-workspace copies of ANL-0021 deleted and users redirected to the published version. One departmental dashboard trending release cycle time registered as ANL-0052, classified C |
| 06 Jul 2026 | Source access log review | 1 | An undeclared service account extracting stability data to a shared folder. Traced to a macro workbook, registered as ANL-0053, suspended pending classification and code review |
| 06 Jul 2026 | Departmental attestation | 0 additional | All four function heads attested. Micro attested with a note that ANL-0040 output is reviewed but never actioned alone, supporting its class C |
Shadow-tool count found by sweep: 7 in January 2026, 7 in July 2026. Flat rather than falling, which was escalated to management review with a proposal to add a repository template and a registration step to the analytics onboarding path.
Common inspection findings this register prevents
- The opening request for a list of GxP scripts and dashboards cannot be answered, and the list produced during the inspection is visibly assembled that week.
- A tool producing a number in a regulatory document is not on any list, so no classification, review, or test evidence exists for it.
- A dashboard reviewed before batch disposition has no named owner, and the person who built it left the company.
- Two versions of the same dashboard exist, one published and one in a personal workspace, and different people are looking at different numbers.
- A scheduled job is still refreshing and distributing output from a tool the organization believes was retired.
- Periodic reviews are overdue for tools nobody realised were still in production, because the review schedule was never linked to an inventory.
- A tool is described as validated but the version running cannot be matched to any tagged, released version.
- Exploratory output was pasted into a controlled document because nothing on the record said it was non-GxP.
How to adapt this register
- Set your tool ID convention and never reuse an ID. Sequential is sufficient; embedding the department or year in the ID creates rework when either changes.
- If you already maintain a computerized system inventory, decide deliberately whether these tools become rows in it or live in a separate register. A separate register is usually cleaner because the field set differs, but the two must cross-reference so a system upgrade surfaces the tools that read from it.
- Add a column for the upstream system identifier if you want a system upgrade to immediately show which analytics tools are exposed to the schema change. This is the single most useful extra column in practice.
- Set the reconciliation and sweep frequencies to what you will actually do. Two real sweeps a year beat four scheduled sweeps and one performed.
- Track shadow-tool count found per sweep as a metric and take it to management review. A count that does not fall means the controlled path is still harder than the uncontrolled one.
- If your document system cannot handle the width, keep Part A and Part B as two sheets of one controlled workbook joined on tool ID, and control the workbook itself under the same rules this register applies to macro workbooks.
- Reference this register by number in the governing SOP, the change control procedure, and the periodic review procedure, so that each one drives updates back into it.