Privacy & the PII firewall

How FunnelLedger handles your data.

FunnelLedger is a HubSpot forensic toolkit. It audits whether your lifecycle-stage labels are supported by evidence — using lifecycle history, timestamps, source / conversion / activity labels, deal and ticket context, property metadata, and HubSpot Contact IDs. It does not read names, emails, phone numbers, notes, message bodies, or free-text customer content. No names, emails, or phone numbers are needed for upload. PII-like values are ignored or suppressed and never rendered in reports. The architecture — not a post-hoc scrub — is what enforces these claims.

Version 2.0 · 2026-05-30 · This page is a technical privacy explanation, not legal advice. Final legal wording should be reviewed by privacy counsel before commercial launch.

On this page
  1. What FunnelLedger does — and does not do
  2. Two ingestion paths
  3. What FunnelLedger reads
  4. What FunnelLedger never reads or retains
  5. The PII firewall (three layers)
  6. AI: where it is used, and where it is not
  7. HubSpot writes
  8. Retention & deletion
  9. Subprocessors
  10. Per-scan privacy manifest
  11. Legal posture
  12. Contact us
section 1

What FunnelLedger does — and does not do

In one screen: FunnelLedger reads the structural evidence behind your HubSpot lifecycle stages and returns a read-only report. It is not an auto-cleanup tool, and it does not change your CRM on its own.

What it does

What it does not do

The only write FunnelLedger can make to HubSpot is creating a static list from a cohort you explicitly approve (an approved Segment Action), with the required scopes. Everything else is read-only. Each of these statements is explained in detail below.

section 2

Two ingestion paths

FunnelLedger has two ways to read your data. The same privacy contract holds for both; the difference is how the data reaches us.

Upload mode

You upload HubSpot exports

No HubSpot connection is required. You export property-history CSVs from HubSpot and upload them. No names, emails, or phone numbers are needed for upload. PII-like values in the files are ignored or suppressed at ingestion and never rendered in the report. You control exactly which columns ever leave your portal.

Connected mode

You connect HubSpot via OAuth

FunnelLedger reads approved HubSpot data through OAuth. Reads are restricted to an enumerated allowlist of evidence properties; directly-identifying fields are never on the request list. The connection is read-only except for the Segment Actions you explicitly approve (see section 7).

The privacy difference. In upload mode, identifying data never has to leave HubSpot at all — the filtering happens at ingestion, and you choose the files. In connected mode, FunnelLedger reads from HubSpot directly but only requests the allowlisted evidence properties, and the same firewall sanitizes and minimizes before anything is stored. Neither path reads or retains raw customer PII.

section 3

What FunnelLedger reads

These are the structural and evidence categories the audit uses. They describe the shape of lifecycle movement, not who the contacts are.

Custom properties are not guessed. Known HubSpot-defined fields are interpreted by a deterministic property-semantics registry; ambiguous HubSpot-defined fields may be checked against official HubSpot documentation only where the registry allows it; custom fields stay deterministic, ambiguous, or operator-confirmed. See section 6.

section 4

What FunnelLedger never reads or retains

This is not a list of values we receive and then decline to display. PII-like values are ignored or suppressed and never rendered. The firewall prevents them from being fetched or ingested in the first place — they never enter our process, never reach our database, and never reach our AI provider.

section 5

The PII firewall (three layers)

The contract above is enforced by a firewall applied in three layers, in series:

The gate is enforced by code, not policy. A future contributor who tries to add a prompt containing a contact's email will see the gate refuse the call — both at runtime and in the test suite.

Verifiable. The firewall is implemented in backend/decay/pii-firewall.js and exercised by hostile-fixture tests in pii-firewall.smoke-test.js. The categorical claims on this page reflect what those tests assert. The full firewall hardening sequence (broader read-allowlist wiring, export-boundary enforcement, AI-boundary tests, and an optional purge-after-report retention mode) is partially shipped and partially planned — see section 8.

section 6

AI: where it is used, and where it is not

FunnelLedger's verdicts are produced by a deterministic verdict engine — threshold-based logic over your portal's evidence. AI does not decide whether a lifecycle stage is supported, stale, missing evidence, or conflicting.

Every AI prompt passes through the PII firewall described in section 5 before it leaves our process.

section 7

HubSpot writes

FunnelLedger is read-only on HubSpot by default. To be exact:

The single exception is an approved Segment Action: creating a HubSpot static list from a cohort you explicitly approve. It requires per-action consent and the verified crm.lists.write and crm.lists.read scopes. Every list creation is audit-logged with the list ID, name, and contact count. You can revoke list-creation consent at any time; lists already in your HubSpot remain under your control.

This is the only write surface. If you never approve a Segment Action, FunnelLedger never writes anything to your HubSpot portal.

section 8

Retention & deletion

FunnelLedger retains only what is needed to re-render your audit and to honor the audit log: HubSpot Contact IDs, lifecycle-stage transitions, deal and ticket counts, categorized activity signals, and the deterministic verdicts computed for each scan. We do not retain names, emails, phones, addresses, notes, email bodies, or free-text customer content. An optional purge-after-report retention mode is planned but is not the current default.

Tenant delete · 24-hour SLA

You can delete your tenant from FunnelLedger at any time. The deletion is a single transaction that cascades across every table holding tenant-scoped rows. Operationally it completes in milliseconds; the 24-hour SLA is the legal-side ceiling, not the operational target.

When you trigger a tenant delete, FunnelLedger:

What the deletion does not touch. Your HubSpot portal's contacts, lifecycle stages, deals, tickets, workflows, and OAuth tokens. The tenant delete removes only FunnelLedger-side data; your CRM is unchanged. To remove FunnelLedger's access entirely, revoke the integration from inside HubSpot — that is a separate action you control.

How to request a tenant delete

Email support@funnelledger.com with the HubSpot portal ID and a confirmation. We will reply with the deletion receipt (the forensic audit row contents) within one business day.

section 9

Subprocessors

The subprocessor that receives any portion of scan-derived data is listed below.

Subprocessor Purpose Data flow Region
Anthropic
DPA · Privacy Policy
AI provider. Paraphrases the intro paragraph and industry-context summary from deterministic scan aggregates. Receives only aggregate scan outputs (verdict counts, top findings, top actions, industry context). Never receives Contact IDs, names, emails, phones, or any free-text customer content. Every prompt passes through the PII firewall before transmission. United States

TODO — needs confirmation before commercial launch. FunnelLedger also relies on an infrastructure hosting provider and a payment processor for checkout. These are not yet documented as privacy subprocessors with confirmed data-handling terms in our source materials, so they are intentionally not described here. Privacy counsel should confirm the complete subprocessor list — including hosting and payment — and the data each one touches, before this page is published. We will not claim "no other subprocessors" until that review is complete.

If we add or change a subprocessor, we will update this page and notify pilot customers by email at least 14 days before the change takes effect.

section 10

Per-scan privacy manifest

Every scan emits a structured privacy manifest recording what it saw and did not see. The manifest is persisted alongside the scan and rendered in the report itself, so you or any reviewer can confirm the contract was honored on that specific scan — not just as a marketing claim.

An example manifest:

{
  "identity_blind": true,
  "pii_minimized": true,
  "contact_identifier_policy": "hubspot_contact_id_only",
  "llm_contact_level_data_sent": false,
  "hubspot_property_writes": false,
  "lifecyclestage_writes": false,
  "blocked_property_count": 42, // custom + canonical fields refused
  "blocked_categories": [
    "identity", "contactability", "free_text", "sensitive_data"
  ],
  "allowed_categories": [
    "lifecycle_history", "timestamps",
    "categorized_touchpoints", "business_context"
  ]
}

The manifest is the most concrete artifact we can give a security reviewer or DPO. It is generated per scan, persisted, and rendered inside the report.

section 12

Contact us

For privacy questions, deletion requests, subprocessor inquiries, or to request the technical inventory behind the claims on this page:

For data-protection authority complaints, the relevant authority depends on your jurisdiction: in the EU / EEA, the supervisory authority where your business is established; in the UK, the Information Commissioner's Office; in California, the California Privacy Protection Agency.

Last reviewed: 2026-05-30. Canonical claim language is maintained in our internal WEBSITE_COPY.md and PRIVACY_FIREWALL_MILESTONE.md. This page is a technical privacy explanation, not legal advice, and is pending privacy-counsel review before commercial launch.