DEV Community

life
life

Posted on

Entry-time certificate data is a row with four reachable parties

A certificate of compliance is usually kept as a PDF in a shared folder. The folder is organized well, the file is named after the SKU, and a person can find it in about forty seconds. Then the entry is filed and the requirement turns out to be data rather than a document, and the forty seconds becomes a shipment sitting where it is not supposed to sit.

16 CFR part 1110, as amended by the Commission's final rule at 90 FR 1800 published 8 January 2025 and effective 8 July 2026, requires that for imported finished products the certificate data elements go into ACE as part of the entry filing, using CPSC's PGA Message Set, and that for goods imported by mail the same data sit in CPSC's Product Registry before the goods arrive. Each certificate accompanies the product or shipment and describes one product only. It has to reach every distributor and retailer, and it has to be produced for inspection on demand, since the rule reads immediately as within 24 hours.

The engineering consequence is that the certificate stops being an artifact and becomes a projection over rows you should already have had.

The rows

create table certificate (
  certificate_id   text primary key,
  product_id       text not null unique,     -- one product per certificate
  certifier_id     text not null,            -- 1110.11(3)
  record_keeper_id text not null,            -- 1110.11(4), may be a staffed position
  manufacture_id   text not null,            -- 1110.11(5)
  manufactured_on  date not null,            -- 1110.11(5), to at least month and year
  attested_by      text not null,            -- 1110.11(7)
  attested_at      timestamptz not null,
  status           text not null check (status in ('draft','ready','filed','superseded'))
);

create table certificate_rule (
  certificate_id text not null references certificate,
  rule_citation  text not null,              -- each rule listed separately, 1110.11(2)
  primary key (certificate_id, rule_citation)
);

create table party_contact (
  party_id     text primary key,
  kind         text not null check (kind in ('certifier','record_keeper','manufacturer','lab')),
  name         text not null,
  street       text not null,
  city         text not null,
  region       text not null,
  country      text not null,
  email        text not null,
  phone        text not null,
  position_only boolean not null default false,  -- a record keeper may be a title
  always_staffed boolean not null default true
);

create table test_record (
  certificate_id text not null references certificate,
  lab_party_id   text not null references party_contact,
  tested_on      date not null,              -- the most recent test date
  tested_place   text not null,
  report_ref     text not null
);

create table product_identifier (
  product_id text not null,
  kind  text not null check (kind in ('gtin','model','registered','serial','sku','upc','alternate')),
  value text not null,
  primary key (product_id, kind, value)
);
Enter fullscreen mode Exit fullscreen mode

Six tables for one document, and five of them trace straight to the content list in 1110.11. The identifier table encodes that the certificate must carry at least one unique identifier from a defined set, with a description sufficient to match the goods. The rule table encodes that citations are listed separately rather than collapsed into a free-text summary. The party table encodes that four organizations have to be reachable by name, street address, city, region, country, email and telephone inside one certificate, and that two of them are tied to dates. The sixth table is not a 1110.11 element at all. It is the retrieval log behind the 24-hour request.

The state machine is where the deadline lives

create view certificate_readiness as
  select c.certificate_id, c.product_id,
         case
           when not exists (select 1 from certificate_rule r where r.certificate_id = c.certificate_id)
             then 'no_rule_citation'
           when (select count(*) from party_contact p
                 where p.party_id in (c.certifier_id, c.record_keeper_id, c.manufacture_id)) < 3
             then 'parties_unreachable'
           when exists (select 1 from party_contact p
                 where p.party_id = c.record_keeper_id
                   and p.position_only and not p.always_staffed)
             then 'record_keeper_position_unstaffed'
           when not exists (select 1 from test_record t where t.certificate_id = c.certificate_id)
             then 'no_test_record'
           when not exists (select 1 from product_identifier i where i.product_id = c.product_id)
             then 'no_unique_identifier'
           else 'ready'
         end as state
  from certificate c;
Enter fullscreen mode Exit fullscreen mode

Anything that is not ready cannot be filed at entry, which turns a paperwork gap into an entry problem. The useful move is to make the entry event refuse to start until the projection is clean, and to treat a draft certificate as an absence rather than a placeholder.

type Entry = { mode: 'ocean' | 'air' | 'mail'; deMinimis: boolean; productId: string };

export function channel(e: Entry, state: string): 'ace_at_entry' | 'registry_before_arrival' | 'block' {
  if (state !== 'ready') return 'block';
  if (e.mode === 'mail') return 'registry_before_arrival';
  return 'ace_at_entry';
}
Enter fullscreen mode Exit fullscreen mode

The deMinimis flag is carried into the decision because the rule's reach includes shipments claiming the small-value exemption, and mail entries are routed to the registry ahead of arrival instead of to the entry filing. A system that models only the container-load case has an unhandled branch precisely in the channel this rule calls out by name.

Twenty-four hours is a retrieval contract

The availability requirement is a service-level objective with a clock that starts when an agency asks. Practically that means the certificate bundle has to be reconstructible for a shipment that already left, which is why the rows above are keyed and dated rather than overwritten.

create table certificate_bundle_log (
  bundle_id      text primary key,
  certificate_id text not null references certificate,
  shipment_ref   text not null,
  built_at       timestamptz not null,
  built_by       text not null,
  recipient_kind text not null check (recipient_kind in ('cpsc','cbp','distributor','retailer'))
);
Enter fullscreen mode Exit fullscreen mode

The superseded status exists because a certificate describing last season's configuration is not corrected by editing it. When a factory, a lab or a composition changes, a new certificate is issued and the old row keeps its dates so that the shipment that already moved still has an answer attached to it. Editing a certificate in place destroys the only evidence that the goods in transit matched a document at the time they were filed.

What this is and is not. It is a schema-shaped reading of published requirements, and it is not a compliance opinion: whether a specific product needs a certificate, which rule citations apply, and whether a given document is valid are questions for the party that owns the obligation and the bodies that examine it. FulfillNexa by SBT (fulfillnexa.com) moves seller goods from three Chinese sites, 13,000 square meters in Suzhou, 8,000 in Dongguan and 3,000 in Shenzhen, and we do not issue, sign or hold a certificate belonging to a brand. The narrower point is this. A pick list built against a ready projection and a pick list built against a folder of PDFs look identical on a floor, and behave differently the day a document request arrives with a clock on it.

Top comments (0)