Skip to main content
Blog
Blog

PCI DSS 6.4.3 Script Inventory and Authorization: How to Build the Record

The script inventory and authorization workflow for PCI DSS 6.4.3: what fields each record needs, who signs off, and a sample inventory row to copy.

Jun 18, 2026 7 min read
PCI DSS 6.4.3 Script Inventory and Authorization: How to Build the Record

PCI DSS 6.4.3 asks for three things on every payment page: an inventory of each script, a confirmation that each one is authorized, and assurance that each script's integrity holds. The inventory and the authorization record are where most teams stall. This post is only about those two artifacts — how to build them, what fields each record carries, and how to stop them from drifting out of date the week after the audit.

The control became mandatory on 2025-03-31. A spreadsheet snapshot taken once and forgotten does not satisfy it, because the thing being controlled — third-party JavaScript — changes on its own schedule. A clean inventory is a living record with an owner, a justification, and a version history per script. Get the record structure right first; the tooling decision follows from it.

For the requirement language itself, the buy-vs-build debate, and what auditors look for end to end, read the practical PCI 6.4.3 and 11.6.1 guide and the QSA assessment guide. This page stays narrow on the inventory mechanics.

What scope does the inventory have to cover?

The PCI SSC scopes 6.4.3 to the scripts loaded and executed in the consumer's browser on the payment page — both scripts from the entity's own environment and scripts loaded from third and fourth parties. Read that scope literally before you start listing. Your inventory must capture:

  • First-party / same-origin scripts — your own bundles, served from your domain.
  • Inline scripts — snippets pasted into the HTML template, including tag-manager bootstraps.
  • Third-party scripts — analytics, A/B testing, support widgets, fraud SDKs, payment helpers.
  • Fourth-party scripts — anything a third-party script loads after it runs. These never appear in a vendor contract or a tag manager.

The fourth-party layer is the one teams miss. A single analytics tag can pull in a chain of additional scripts at runtime that no one approved directly. If your inventory starts from a vendor list or a tag-manager export, that chain is invisible. Start from what the browser actually receives on the live payment page.

What fields does each inventory row need?

An inventory row is evidence. It has to answer "what is this, where did it come from, and is it the same thing it was last week" without anyone opening devtools mid-audit. The minimum useful columns:

FieldWhat it recordsWhy a QSA wants it
Script URL / sourceFull URL, or inline for embedded codeIdentifies the asset and its origin domain
Party tierFirst, third, or fourth partyProves fourth-party chains are accounted for
Content hashHash of the payload actually servedAnchors integrity checks to real content, not a filename
First seen / last seenWhen it appeared, when last observedFlags scripts that vanished or appeared without a change record
OwnerNamed accountable personTraces who can justify the script
Business justificationWhy it runs near the payment pageSatisfies the "written justification" clause
Data access noteWhat the script can read on the pageSurfaces anything touching form fields
Authorization statusAuthorized / pending / rejectedThe 6.4.3 authorization confirmation itself
Version historyPrior hashes with timestampsShows the record is maintained, not a snapshot

The two columns that separate real evidence from a checkbox are content hash and version history. A row that lists only a URL proves the script exists. A row that pins the hash of the payload served to the browser, and keeps the prior hashes, proves you can tell when that script changed — which is the bridge between 6.4.3's inventory and 11.6.1's change detection.

What does a single authorization record look like?

Authorization is not a column you tick. It is a decision someone made and can defend. A complete record ties the script to a person, a reason, and a moment in time. Here is one row filled in as a worked example:

FieldValue
Script sourcehttps://cdn.example-analytics.com/v3/tag.js
Party tierThird party
Content hashsha256:8f2a…c91d (payload served 2026-06-15)
OwnerPriya N., Web Platform Lead
Business justificationFunnel analytics for checkout conversion reporting
Data access noteReads page URL and click events; no access to card input fields
Authorization statusAuthorized — approved 2026-06-15
Version historysha256:8f2a…c91d (2026-06-15), sha256:4b07…aa12 (2026-05-02)

Notice the data access note. It does not just say the script is allowed — it states what the script is permitted to touch. When the next version of that tag suddenly starts reading the card input field, the gap between the note and the observed behavior is the alert. A justification without a stated boundary cannot be violated, so it can never trigger anything.

How do you keep the inventory from going stale?

The failure mode is predictable. A team builds a thorough inventory for the audit, passes, and within weeks marketing ships a new tag, a vendor pushes a v3 of their SDK, and a fourth-party dependency swaps domains. None of it lands in the spreadsheet. The inventory is now fiction, and the next assessment exposes it.

A maintainable inventory follows a loop, not a one-time build:

  1. Seed from live captures. Inventory what the browser receives on the production payment page, not a vendor list or a tag-manager export.
  2. Reduce surface. Remove scripts that do not need to run on the payment page. Fewer authorized scripts means fewer records to keep honest.
  3. Authorize before exposure. Assign an owner, write the justification and data-access boundary, and set status before the script ships to the payment path.
  4. Re-authorize on change. When a script's served payload changes hash, the prior authorization no longer covers the new content. Treat each change as a new approval decision.
  5. Schedule a standing review. Run a recurring review so justification text stays accurate as scripts evolve, and so nothing sits in pending indefinitely.

Step four is where manual processes collapse. A modern third-party tag can serve a different payload by user location, browser, or time of day. Catching every hash change by hand across every script on every load is not realistic. That is why the inventory has to be wired to a detection mechanism rather than re-typed by a human each week.

Where cside fits the inventory workflow

cside builds the inventory from the browser layer — it records the scripts that real customers' browsers actually receive, including inline and fourth-party loads that vendor lists and tag-manager exports never show. Each entry carries the source, the served payload, a content hash, and first-seen / last-seen timestamps, so the inventory reflects production rather than a stale snapshot.

On the authorization side, cside stores the owner, justification, and data-access context alongside each script, and flags when a script's served content changes so the prior authorization can be reviewed against the new payload. That turns 6.4.3 from a quarterly spreadsheet into a live record with QSA-ready exports, and feeds the change-detection evidence that 11.6.1 requires. See cside PCI Shield for the platform view.

Further reading on cside

As of 2026-06-18, treat this as operational guidance, not legal advice. Confirm the exact control language with your QSA, counsel, or risk owner.

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks — web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

No. A GTM container export only lists tags GTM manages. It misses inline snippets pasted directly into templates, scripts injected by other scripts (fourth-party loads), and same-origin first-party code. 6.4.3 covers every script that loads and executes on the payment page, regardless of how it got there. Start the inventory from what the browser actually receives, then reconcile GTM against it.

PCI DSS does not name a job title. It requires that a method confirms each script is authorized and that a justification is recorded. In practice an accountable owner approves the entry — usually an engineering or security lead who can defend why the script runs near cardholder data. The record should name a person, not a team inbox, so a QSA can trace the decision.

6.4.3 itself does not set a cadence for the inventory; it requires the inventory to be maintained and accurate. The weekly-or-risk-based cadence comes from 11.6.1's change-detection mechanism. Practically, you re-authorize on every detected change and run a scheduled review so the justification text does not rot while the script keeps shipping new versions.

Monitor and Secure Your Third-Party Scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start free, or try Business with a 14-day trial.

cside dashboard interface showing script monitoring and security analytics
Related Articles
Book a demo