Skip to main content
Closient Data Delivery writes your organization’s scan and page-visit analytics into a destination you own, every night. It is provisioned per organization and requested from the Data Delivery page on the Closient site. This page is the v1 data contract: what is delivered, in what shape, and what you can rely on.

What this is

You choose the destination and supply the connection details. We deliver Parquet or CSV files into object storage, or rows into a Postgres schema. Nothing about the data or its shape changes with the destination. The data delivered is the same daily aggregates that power your Closient analytics dashboard. It is retained by Closient indefinitely, so the first delivery includes your full history back to your first scan.

Delivery

Formats and layout

Object storage (S3, R2, GCS)

Default format is Parquet with Snappy compression. CSV (UTF-8, RFC 4180, header row, ISO 8601 dates) is available as an option per destination.
Hive-style dt= partitioning is used so DuckDB, Spark, Athena, Snowflake external tables and BigQuery external tables read the tree directly. The products table is a full snapshot each night and lives under the same dt= partition so a day is self-contained. The manifest lists every object written for that date with row count, byte size, SHA-256 and the schema version:

Postgres

We write into one schema, closient by default, that you create and grant to the user you give us. Tables are created on first delivery with the primary keys listed under Tables. Each day is applied as an upsert on the primary key inside one transaction per table. A closient._deliveries table records every run with the same fields as the manifest. Requirements: TLS with a certificate we can verify (sslmode=verify-full), network reachability from the egress IP shown in your dashboard, and a user with CREATE on the schema and INSERT, UPDATE, SELECT on its tables. We never touch objects outside that schema.

Tables

Column types are given as Parquet / Postgres.

products: dimension, full snapshot nightly

Primary key: product_id

scans_daily: one row per product per day

Primary key: (date, product_id) A scan is a resolver hit on one of your GS1 Digital Link URLs. Counts are final once the partition stops being rewritten (see Delivery).

scans_daily_breakdown: long table, one row per product, day, dimension, key

Primary key: (date, product_id, dimension, key) Rows exist only for keys with at least one scan. The sum of scans over all keys of one dimension equals total_scans for that product and day except where noted.

page_visits_daily: one row per attribution tuple per day

Primary key: (date, gtin, page_type, source, country, is_bot) A page visit is a render of a Closient hosted page in your organization. A scan that lands on a hosted page produces one scan and one page visit with source = resolve. Visits from search, AI assistants and links are page visits with no matching scan.

Available on request

Hourly grain (scans_hourly, page_visits_hourly) with the same columns keyed on bucket_start instead of date. Hourly data is retained by Closient for a shorter window than daily, so backfill depth is limited.

What is not delivered

Raw scan events, IP addresses, user-agent strings, visitor identifiers, HyperLogLog sketches, and anything that describes an individual visitor. The aggregates above are the privacy-safe layer that Closient itself retains after raw events are purged. If you need per-scan events in real time, use Scan Webhooks, which are a separate feature.

Schema versioning

  • Adding a column, a dimension value, or an enumeration value is not a breaking change and does not change the version. Read by column name, not position, and tolerate unknown enumeration values.
  • Renaming or removing a column, changing a type, or changing a primary key is a breaking change. It ships under a new prefix (closient/v2/, schema closient_v2) and both versions are delivered in parallel for at least 90 days. We announce breaking changes by email 30 days ahead.
  • Every manifest and every _deliveries row carries schema_version.

Destinations and credentials

Credentials you give us are encrypted at rest, visible to no one at Closient in plain text, rotatable by you at any time from the dashboard, and deleted within 24 hours of deactivation. Object-storage destinations are write-only from our side.

Monitoring and failure handling

  • Every run is recorded in the dashboard: date, tables, rows, bytes, duration, outcome.
  • A failed run is retried hourly up to 6 times.
  • An authentication or permission error (expired key, revoked role, rejected password) is emailed to your organization’s technical and billing contacts immediately, because it never self-heals.
  • Any other failure is emailed after 2 consecutive failed nights, so a transient on your side does not page you and staleness stays under 48 hours. Errors are sent as we saw them, redacted of credentials.
  • A missed day is delivered automatically on the next successful run. Nothing is skipped silently.

Activation and billing

  • Provisioned per organization. Activation completes within 10 business days of receiving valid destination details.
  • Billing starts on the day of your first successful delivery, not before.
  • Price: $49 per month per destination. No setup fee.
  • Available on the Business plan.