Administration Guide

ZantIQ Administration Onboarding Guide

A complete reference for setting up, configuring, and operating ZantIQ as a customer administrator — covering both technical integration and business workflow setup.

Two parts Technical Admin Business Admin July 2026

Table of Contents

Part A — Technical Administration IT / Ops
  1. Tenant & Account Architecture
  2. Single Sign-On (SSO) Configuration
  3. Connector Setup & API Credentials
  4. Field Mapping Configuration
  5. Sync Cadence & Monitoring
  6. Webhook & API Integration
  7. Data Security & Retention
Part B — Business Administration CS / RevOps
  1. User & Role Management
  2. Managing Customers
  3. Contracts & Ingestion Workflow
  4. Commitments & Compliance Tracking
  5. SLA Performance Monitoring
  6. Alerts & Notifications
  7. Renewals & Health Scores
Part A

Technical Administration

Covers tenant setup, SSO, connector credential configuration, field mapping architecture, sync monitoring, API access, and data security. Intended for IT administrators and DevOps/operations engineers.

A1

Tenant & Account Architecture

Understanding how ZantIQ structures your organisation's data.

Data model overview
ZantIQ uses a hierarchical multi-tenant model.
LayerDescriptionKey properties
TenantYour company's isolated ZantIQ workspace. All data is logically separated at tenant level.Unique tenant_id, plan, billing, SSO config
UsersPeople with access to your tenant. Each user has one role.Email, role (Admin / Manager / Viewer), SSO identity
CustomersYour end customers — the accounts you have contracts with.customer_id, name, plan, CSM, Salesforce ID, health tier
ConnectorsIntegrations to external systems. Can be scoped to a specific customer or tenant-wide.connector_id, system, status, is_source, field_map
ContractsPDF/DOCX documents uploaded and parsed by ZantIQ's extraction engine.Type, status, value, signed date, ingestion status, confidence score
CommitmentsIndividual obligations extracted from contracts (SLAs, seat counts, uptime, etc.).Type, status (compliant / breach / missing / mismatch), customer link
Data isolation & residency

All tenant data is logically isolated. ZantIQ does not share data between tenants. Database rows are scoped by tenant_id at every layer and enforced via Row-Level Security (RLS) policies on the backend. If your organisation requires data residency in a specific geography (EU, APAC), contact your ZantIQ account team to discuss dedicated hosting.

A2

Single Sign-On (SSO) Configuration

Connect ZantIQ to your identity provider so users log in with their corporate credentials.

Supported identity providers
ZantIQ supports SAML 2.0 and OIDC. The following providers are tested and documented.
ProviderProtocolNotes
OktaSAML 2.0 / OIDCUse the ZantIQ app tile from the Okta Integration Network
Azure Active DirectorySAML 2.0Enterprise Application → custom app, then paste ZantIQ metadata URL
Google WorkspaceSAML 2.0Custom SAML app in Admin Console → Apps → Web & Mobile Apps
OneLoginSAML 2.0ZantIQ SAML application template available
Generic OIDCOIDCAny OIDC-compliant IdP; requires client_id, client_secret, discovery URL
Enabling SSO
1

Navigate to Settings → Security → SSO

Only Admins can access SSO configuration. You will need your IdP's metadata URL or XML, and ZantIQ's SP metadata to paste into your IdP.

2

Retrieve ZantIQ SP metadata

Copy the ACS URL and Entity ID from the SSO setup page. These are the values you paste into your identity provider to register ZantIQ as a service provider.

ACS URL: https://app.zantiq.ai/auth/saml/callback Entity ID: https://app.zantiq.ai NameID: email (persistent)
3

Configure attribute mapping

ZantIQ requires the following SAML attributes to be sent in the assertion:

Attribute nameValueRequired?
emailUser's work emailYes
first_nameGiven nameYes
last_nameFamily nameYes
roleadmin / manager / viewerOptional (defaults to viewer)
4

Paste your IdP metadata and test

Paste your IdP's metadata URL or XML into the ZantIQ SSO form and click Test SSO. ZantIQ will perform a test login flow and confirm the attributes received. Once the test passes, click Enable SSO.

5

Enforce SSO (optional)

Toggle "Require SSO for all users" to block password-based login. Ensure at least one Admin account is confirmed working via SSO before enforcing.

Lockout risk: If you enforce SSO before confirming it works with your IdP, Admin users may be locked out. Always test SSO first and keep at least one non-SSO Admin session active during the transition.
A3

Connector Setup & API Credentials

Technical requirements for each supported integration, including required API scopes.

Integration categories
ZantIQ ships with 72 connectors across 14 categories.

CRM

  • Salesforce
  • HubSpot CRM
  • Microsoft Dynamics 365
  • Zoho CRM
  • Pipedrive
  • Attio
  • Copper
  • Freshsales
  • NetSuite CRM
  • Monday.com CRM

Support & Ticketing

  • Zendesk
  • Jira
  • Linear
  • Pylon
  • Intercom
  • Freshdesk
  • Freshservice
  • HubSpot Service Hub
  • Salesforce Service Cloud
  • ServiceNow

Customer Success

  • Vitally
  • Gainsight
  • ChurnZero
  • Planhat
  • Totango
  • Catalyst
  • Custify
  • ClientSuccess
  • Hook
  • Salesforce Success Cloud

Contract Lifecycle (CLM)

  • DocuSign
  • Ironclad
  • Salesforce CPQ
  • Coupa
  • SAP Ariba

Knowledge Base

  • Notion
  • Confluence
  • Coda
  • ClickUp Docs
  • Slite
  • Nuclino
  • Slab
  • Obsidian
  • SharePoint
  • Google Drive

Monitoring & Alerts

  • Datadog
  • PagerDuty
  • Grafana
  • Jaeger
  • Slack

Product Analytics

  • Amplitude
  • Heap
  • Mixpanel
  • PostHog

Data Warehouse

  • BigQuery
  • Snowflake

Data Pipeline & Reverse ETL

  • dbt Cloud
  • Fivetran
  • Census
  • Hightouch

Customer Data Platform

  • Segment
  • RudderStack

Billing & Payments

  • Stripe
  • Chargebee
  • Braintree
  • Zuora

Business Intelligence

  • Looker
  • Tableau

Dev & Project Mgmt

  • GitHub
  • Asana

HRIS

  • BambooHR
  • Workday
Per-system credential requirements
The most commonly connected systems and what ZantIQ needs to access them.
SystemAuth methodRequired scopes / permissions
SalesforceOAuth 2.0 Connected Appapi, refresh_token, offline_access. Read access to Account, Contract, Opportunity objects.
JiraAPI Token (Cloud) or OAuth 2.0Read: Projects, Issues, SLA Policies. Service Management: read:jira-work, read:jira-user.
VitallyAPI KeyFull API key from Vitally Settings → Integrations → API. Read/write access to Accounts and Traits.
ZendeskAPI Token + emailAdmin role recommended. Required: Tickets (read), Organizations (read/write), SLA Policies (read).
HubSpotPrivate App TokenCRM scopes: crm.objects.contacts.read, crm.objects.deals.read, crm.schemas.contacts.read.
SlackOAuth Bot Tokenchannels:read, chat:write, users:read. Install the ZantIQ Slack App from the Slack App Directory.
SnowflakeService Account + Key PairDedicated service account with USAGE on relevant database/schema. ZantIQ uses read-only queries.
StripeRestricted API KeyPermissions: Customers (read), Subscriptions (read), Invoices (read). Never share your full Secret Key.
DocuSignOAuth 2.0 (JWT Grant)Integration Key + RSA private key from DocuSign Apps & Keys. Scopes: signature, impersonation. ZantIQ pulls completed envelopes and extracts obligations automatically.
IroncladAPI KeyGenerated from Ironclad Settings → API & Webhooks. Provide your Ironclad subdomain (e.g., acme.ironcladapp.com). Read access to Workflows and Executed agreements.
Product Analytics
AmplitudeAPI Key + Secret Key (HTTP Basic)Generated from Amplitude Settings → Projects → API Keys. Uses the Analytics API — read-only. Required scopes: view users/events for the project(s) you connect.
HeapApp ID + API KeyBearer-token auth. From Heap Account → Manage → Projects, copy the App ID and mint an API key with account-details read.
MixpanelService Account (username + secret)Create a service account in Mixpanel Project Settings → Service Accounts. Provide the Project ID. Uses the Query API (read-only).
PostHogPersonal API KeyBearer-token auth. From PostHog Settings → Personal API Keys. Provide the Project ID and host (default https://us.posthog.com). Read scopes: event:read, feature_flag:read, person:read.
Data Warehouse & Pipelines
BigQueryOAuth 2.0 (Google)Provide the GCP project ID. IAM: roles/bigquery.metadataViewer and, if using the optional usage query, roles/bigquery.jobUser plus data-viewer on any dataset the query reads. ZantIQ never runs mutations.
SnowflakeOAuth 2.0 or Key-Pair (JWT)Provide account identifier (e.g. myorg-myacct) and warehouse. Recommended: a dedicated ZANTIQ_READER role with USAGE on warehouses and SELECT on any object your usage query reads.
dbt CloudService TokenGenerated from dbt Cloud Account Settings → Service Tokens. Permission set: "Read-only" — sufficient to read job run history and status.
FivetranAPI Key + Secret (HTTP Basic)Generated from Fivetran Account → Settings → API Config. Reads groups and connector status only — no mutations.
CensusWorkspace API KeyFrom Census Settings → API. Read-only sync + run history.
HightouchPersonal Access TokenFrom Hightouch Settings → API & Webhooks. Read scope on syncs + runs.
Customer Data Platform
SegmentPublic API Personal Access TokenGenerated from Segment Workspace → Access Management → Personal Access Tokens. Read scope on sources, destinations, and tracking plans.
RudderStackWorkspace Access TokenGenerated from RudderStack Cloud → Settings → API Access. Read sources, destinations, and connections.
Billing & Payments
ChargebeeAPI Key (HTTP Basic)Provide the Chargebee site name (e.g., acme-test). Read scopes: Customers, Subscriptions, Invoices. Never share your full Master Key.
BraintreePublic Key + Private KeyProvide Merchant ID and choose sandbox or production. Uses the GraphQL API. Permissions: read Customers, Subscriptions, Transactions.
ZuoraOAuth 2.0 (Client Credentials)Provide the API host (e.g., https://rest.zuora.com). Recommended role: "API Read-Only" plus read on Subscriptions and Accounts.
Business Intelligence
LookerAPI 4.0 access tokenProvide the Looker host URL. Generate a client_id + client_secret in Admin → Users → API Keys and exchange them for an access token. Optional: folder_id to scope reads to a customer folder.
TableauPersonal Access TokenFrom Tableau Server / Cloud → Account Settings. Provide host, site_id, and (optionally) project_id. Read scope on Workbooks and Views.
Dev / PM / HR
GitHubFine-grained Personal Access TokenProvide owner and repo. Repository permissions: Contents: read, Deployments: read, Issues: read, Pull requests: read.
AsanaPersonal Access TokenFrom Asana Developer Console → Personal Access Tokens. Provide workspace_gid. Scopes: default (read access to projects and tasks in that workspace).
BambooHRAPI KeyProvide the company subdomain (e.g., acme for acme.bamboohr.com). Reads employee directory only.
WorkdayOAuth 2.0Provide host and tenant. Uses Workday's REST v1 API. Recommended: an integration-system user (ISU) with read-only permissions on Workers and Organizations.
Security best practice: Always use the minimum permission set required. Create a dedicated service account or API key for ZantIQ rather than using a personal account. ZantIQ stores credentials encrypted (AES-256) and never exposes them in logs or UI.
Connector status meanings
StatusMeaningAction
ConnectedCredentials valid, last sync successful.None required.
SyncingA sync is currently in progress.Wait for completion (usually <60 sec).
ErrorLast sync failed — credentials may have expired or scopes changed.Re-enter credentials and click Sync.
DisconnectedConnector was manually disconnected.Reconnect when ready.
A4

Field Mapping Configuration

How ZantIQ maps contract term fields from the source of truth to downstream systems.

Concepts

Source of Truth

The system that holds the authoritative version of each contract field — typically your CRM (Salesforce or HubSpot). ZantIQ reads from this system and treats it as the "contract truth". Select the source using the Source of Truth dropdown on the Field Mapping page.

Target Systems

All other connected systems (Jira, Zendesk, Vitally, etc.) are potential targets. ZantIQ pushes — or validates — that the source field values match what is configured in each target.

Mapping Rules

Each rule maps one source field to one target field, with an optional Transform expression (JavaScript) that converts values between systems. Rules have a status of Active or Conflict — a conflict means the current target value does not match what the contract specifies.

Creating mapping rules
Use the visual canvas on the Field Mapping page.
1

Select Source of Truth and Target System

Use the two dropdowns below the pipeline header. The canvas updates immediately to show the Source Fields (left panel) and Target Fields (right panel) for the selected pair.

2

Click a source field to begin mapping

The field row highlights in indigo and the canvas shows the instruction "Now click a target field to map". Click a field in the Target Fields panel to complete the mapping. A bezier line is drawn between the two fields.

3

Review the Active Mapping Rules panel

The bottom-left panel lists all rules for the current source→target pair. Each row shows source field → target field → transform expression. Hover a row and click the trash icon to delete a rule.

4

Check the Propagation Status panel

The bottom-right panel shows the sync status and last-sync time for each target system, and flags how many rules have conflicts per system.

Field types: Each field has a type chip — string, number, enum, bool, or date. Mapping across incompatible types (e.g., string → number) will produce a conflict unless the transform expression handles the conversion.
Transform expression reference
Transforms are a sandboxed, allow-listed DSL — no eval. Each rule is a JSON list of steps applied left-to-right. Only the operations below are permitted; anything else is rejected at request time.
OpArgsEffect
identityPass value through unchanged
trimStrip whitespace
toLowerCaseLowercase
toUpperCaseUppercase
replacefrom, toLiteral string replace
substringstart, endSlice by index
concatprefix, suffixPrepend / append literal string
parseInt / parseFloatCoerce numeric
Layer 3 — Push to target (dual-control)
Optional per-tenant feature. Lets admins push the correct value from source into a target system, or manually fix + rescan without a write. Every write is gated by maker/checker approval.
1

Enable Layer 3 for the tenant

Only admins see the Layer 3 Push Config panel at the top of Field Mapping. Toggle push_enabled, list the connectors that accept push in Allowed target connectors, and set a per-connector daily push cap. Layer 3 is off by default.

2

Request a push (Maker)

On a mismatched row, click Push. The 3-step wizard runs a live preview, surfaces server-side warnings (numeric-looking value being replaced, non-empty target about to be overwritten, day-cap approaching), and requires typing PUSH to confirm. Instead of pushing, choose I'll fix it manually + rescan to update the target directly in the vendor UI and then re-verify.

3

Approve (Checker, different admin)

A different admin opens the Push Request Queue. The row is chip-flagged if it is the current user's own request; the API refuses self-approval regardless. On Approve, the server re-reads the live source value and refuses with status stale_source if it has drifted since the request was created.

4

Revert if needed

The Push History timeline shows every push, rescan, and revert. Any successful push has a Request revert button — clicking it creates a new push request that writes the original target value back. A different admin still needs to approve it before the revert lands on the vendor.

Safety rails at a glance: tenant opt-in · connector allowlist · per-connector daily cap · maker ≠ checker (checker must be admin) · sandboxed DSL (no eval) · live source re-read at approve · idempotency key sha256(connector|rule|transformed_value|target_value_now) · one-click revert.
Target connectors with push_data(): Jira, Zendesk, Freshservice, HubSpot Service, Vitally, Gainsight, PagerDuty, Pylon, Linear, Notion, Slack. Notion writes typed page properties (rich_text / number / url / checkbox). Linear uses GraphQL issueUpdate and projectUpdate. Slack push covers channel.topic, channel.purpose, and message.post. Additional connectors are added on request.
Rules Engine — automate the response
Turn every detected breach into an automatic follow-through. Rules fire on obligation and breach events, evaluate a JSON condition tree against the customer + contract context, and dispatch actions to your existing connector stack. Per-rule throttling prevents runaway loops when a resource flips state.
1

Pick the trigger

Current triggers: breach.created, breach.status_changed, breach.resolved. commitment.mismatched and obligation.upcoming ship in v2. Every enabled rule for a matching trigger evaluates in parallel per event.

2

Build the condition tree

Nested AND / OR / NOT groups over leaf comparators (eq, gte, in, contains, is_null, and more). Fields are dot-paths on the resolved context — e.g. customer.plan, breach.type, customer.arr, commitment.contract_value. Missing fields resolve to None and never raise. Depth ≤ 8, ≤ 64 nodes.

3

Pick the actions

Ordered list. Four action types ship in v1: slack.notify (post to a channel), email.send (transactional email), ticket.open (Jira / Linear / Zendesk / Freshservice), health.set (Vitally / Gainsight health score). Templates use {customer.name}-style interpolation from context; missing values render <unknown>.

4

Dry-run before enabling

POST /rules/{id}/test with a real resource_id returns the full condition trace + the interpolated action payloads without dispatching. Verify the tree evaluates the way you expect before flipping enabled=true.

5

Review execution history

Every fire — matched, throttled, no-match, or error — records a RuleExecution row with the trace and per-action outcome. GET /rules/{id}/executions returns the last 50 by default; the audit log also captures every rule create / update / disable.

Safety rails at a glance: tenant-scoped RLS · pydantic validation of every condition + action at create time · per-(rule, resource) throttle window (default 1h, 0–24h range) · action-executor errors captured, never propagated · every execution recorded regardless of outcome · action targets validated against the tenant's own connectors only.
REST surface: /rules list/create · /rules/schema (fields, comparators, action types — drives the builder UI) · /rules/{id} get/patch/delete · /rules/{id}/test dry-run · /rules/{id}/executions history. A no-code builder UI ships in an upcoming release; today rules are configured via the REST API. See the Rules Engine design doc for the full spec.
A4.25

Custom AI Extractors All tiers

Author your own contract-clause extraction prompts alongside the 3 canned platform extractors.

Settings → AI Extractors
Three platform prompts (classifier, commitment extractor, amendment diff) run on every contract ingest and cover response-time SLAs, uptime guarantees, data retention, support tiers, penalty clauses, entitlements, escalation paths, and milestones. When a tenant needs to extract a clause the platform prompts don't cover — notice periods, price escalators, data residency, change-of-control, assignability, custom KPI targets — they author a custom extractor.
1

Declare an output schema

Each extractor declares 1–20 output fields. Each field has a name (lowercase snake_case), a type (string / integer / number / boolean), a description, and a landing rule: Enforce as Commitment creates a Commitment row on every contract (runs through breach detection + rules engine + health score), Reference on Contract lands as passive metadata in Contract.extracted_fields. Mix both in a single extractor.

2

Write the prompt template

Free-form text; must contain the literal {text} placeholder — that's where the contract text is substituted at run time. The service wraps the tenant prompt with a system-authored preamble that forces the LLM to return JSON matching the declared schema. Extras the LLM produces are dropped; missing fields are logged as validation errors.

3

Test before activating

POST /extractors/{id}/test with a contract_id runs the extractor against that contract's stored text and returns the extracted fields plus a landing-rule preview. No Commitments are created and Contract.extracted_fields isn't written. Use this to iterate on the prompt before flipping status to active.

4

Activate + Pause lifecycle

Draft extractors never run. Active extractors fan out during every customer contract ingest, vendor contract ingest, and background ingestion. To edit an active extractor, click Pause (moves to draft) first — this prevents in-flight ingestions from seeing a schema that no longer matches the prompt. After 5 consecutive failures, the extractor is auto-moved to draft with the last error visible on the row.

5

Provenance on every Commitment

Commitments carry an extracted_by_extractor_slug column — system for platform prompts, the tenant's slug for custom extractors, NULL for manually-created rows. Exposed on the API today; UI chip on Commitment rows ships as a follow-up polish.

Frame reminder: this is a contract-clause extractor. It's not a general-purpose LLM tool and not a program-scoring engine. Point it at contract text; extract what the contract says. Framework catalogs (SOC 2 / ISO 27001 / NIST CSF / etc.) are deliberately out of scope. See the in-app Knowledge Base → AI Extractors section for user-facing FAQ.
REST surface: /extractors list/create · /extractors/platform (read-only descriptors of the 3 canned prompts) · /extractors/{id} patch · /extractors/{id}/activate · /extractors/{id}/archive · /extractors/{id}/draft · /extractors/{id}/test. Full guide: docs/custom-extractor-guide.md.
A4.5

Vendor Email Requests Business tier and above

Track your vendors' response times by CC'ing a dedicated ZantIQ inbound address on every request you send them.

Plan requirement: Vendor Email Requests is only available on Business ($2,499/mo) and Enterprise plans. Starter and Pro tenants can see this section in the admin guide for reference, but the feature is not enabled in-console — the sidebar entry appears greyed out and provisioning is blocked at the API. Upgrade from Profile & Plan to enable it. See the pricing page for tier details.

What it does

Every Business+ tenant gets a dedicated inbound address at <slug>@vendor-comms.zantiq.app. When you email a vendor and CC this address, ZantIQ:

  • Attributes the thread to the right vendor Party (by matching the reply's From domain against the vendor's domain field).
  • Optionally links the thread to a specific contract (by subject keyword) and commitment (by body/value keyword).
  • Measures first-response time from send → first vendor reply.
  • Feeds those response times into the Vendor Analytics scorecard.
  • Stores every message + attachment (RCA docs, invoices, screenshots) for 12 months, KMS-encrypted at rest.

Setup — 5 minutes

  1. Sign in as tenant admin. Open Settings & Admin → Vendor Email Requests in the sidebar.
  2. Pick a slug (4-31 chars, lowercase alphanumeric + internal hyphens). Reserved words like admin, support, postmaster aren't allowed. This is permanent — pick something that still makes sense in 12 months.
  3. Click Provision alias. Your dedicated address appears — copy it and paste into your team's SOPs.
  4. Open every vendor at /vendors/<vendor> and make sure the Domain field is populated (e.g. aws.amazon.com). Attribution won't work without it — the funnel matches inbound replies by domain.

How attribution works — the 5-step funnel

When ZantIQ receives an inbound message on your alias (via the Postmark inbound webhook), it runs a 5-step attribution funnel to figure out which tenant / vendor / contract / commitment / thread the message belongs to. Steps 1–2 gate the whole thing: if the tenant or vendor can't be resolved, later steps are skipped and the message lands in the Unmatched Queue. Code lives at services/vendor_email/attribution.py.

Step What we match on Data source If no match
1 — Tenant Local part of the alias address (the <slug> before @vendor-comms.zantiq.app) in To: or Cc: vendor_email_aliases.slug Message discarded (nothing to attribute)
2 — Vendor From-header domain against the vendor's registered Party.domain parties WHERE party_type='vendor' AND status='active' AND domain=?, tenant-scoped Tagged unknown_sender, lands in Unmatched Queue
3 — Contract Contract label appearing in the subject line (≥8 chars, case-insensitive substring) contracts.label for the resolved vendor Contract left NULL — vendor attribution still stands
4 — Commitment Commitment name / contract value keyword in subject or body commitments for the resolved contract Commitment left NULL — contract + vendor still stand
5 — Thread stitching RFC 5322 In-Reply-To / References headers, then subject + vendor fallback vendor_email_threads.message_id_header New thread created

How the vendor gets identified — the important detail

Step 2 is where "which vendor" gets answered. Every inbound message goes through this lookup:

  1. Extract the domain of the sender's From address. Example: an email from [email protected] yields aws.amazon.com.
  2. Query parties where tenant_id = you, party_type = 'vendor', status = 'active', and domain = 'aws.amazon.com'.
  3. If a row matches, the thread gets linked to that vendor and the message is tagged attribution_status = 'attributed'.
  4. If nothing matches, the message is tagged attribution_status = 'unknown_sender' and shows up in the Unmatched Queue for manual triage.

The disambiguation you asked about — "how do you know which vendor if there's more than one" — comes from the fact that each vendor's Party.domain is unique per tenant (in practice; the DB doesn't enforce it, see edge case #5 below). A message from @datadoghq.com maps to your Datadog party; a message from @twilio.com maps to your Twilio party. Never ambiguous as long as each vendor has its own corporate domain registered.

Attribution status vocabulary

Each stored VendorEmailMessage row carries an attribution_status that reflects how the funnel handled it:

Status Meaning Where it renders
attributed Step 2 matched a vendor. Steps 3–5 may or may not have added contract / commitment / thread linkage. Vendor detail page → Email Threads tab
needs_attribution Message received but the funnel hasn't run yet (transient) or vendor lookup deferred (rare). Should auto-clear within seconds; if it sticks, check Postmark webhook health
unknown_sender Step 2 couldn't match the From-domain to any active vendor party. Message is preserved, just unlinked. Unmatched Queue admin page
manually_attributed An admin clicked "Attribute to this vendor" in the Unmatched Queue. Vendor detail page → Email Threads tab (same as attributed)

Edge cases and gotchas

  1. Your first outbound message. When your CSM emails the vendor with the alias in CC, the From header is your CSM ([email protected]), not the vendor. Step 2 doesn't match on that outbound copy. It stays as needs_attribution until the vendor replies — the reply attributes the thread, and step 5's In-Reply-To header stitches the outbound message onto the same thread. Response-time metrics start ticking from the outbound send time once the thread is bound.
  2. Replies from subdomains. Vendor's registered domain is acme.com but the reply arrives from support.acme.com. Exact-match fails, message lands in the Unmatched Queue. Fix: either update the vendor's Party.domain to the subdomain that actually sends, or use the Unmatched Queue's manual-attribute action to bind the message; it flags as manually_attributed. A follow-up feature (party_aliases table) would let one vendor own multiple domains — flag if you hit this often.
  3. Shared free-email domains (gmail.com, outlook.com, proton.me). Do not register these as any vendor's Party.domain. Every rando from Gmail would match the first vendor that owned the domain. Contractors on personal email are a manual-attribute case every time — inconvenient but safer than the misattribution alternative.
  4. Someone at the vendor uses a personal address. Same fix as #3 — Unmatched Queue → one-click attribute to the right vendor. Consider asking the vendor to reply from their corporate address going forward; the SLA scorecard only counts responses that get attributed automatically.
  5. Two of your vendors legitimately share a domain (parent + subsidiary, or a company that runs multiple brands off the same corporate email). The current query .limit(1)s the result, so the alphabetically-first vendor wins. Not currently handled well. If you hit this, ping engineering to consider a per-contact "primary email" tiebreaker or the party_aliases feature.
  6. Vendor with no Party.domain set. Every message from that vendor lands in the Unmatched Queue forever. Fix at setup time — audit /parties?party_type=vendor&domain=null as part of Vendor Email Requests onboarding.
  7. BCC instead of CC. BCC'd messages don't preserve the alias in the header we can see. Step 1 (tenant) fails, message is dropped. Always CC.

The Unmatched Queue — safety valve

Anything with attribution_status other than attributed or manually_attributed surfaces in the Unmatched Queue admin page (linked from the sidebar under Vendor Email Requests). Each row shows subject + From + first line of the body. Two actions: Attribute to vendor (pick a vendor from the dropdown; flags as manually_attributed and moves the thread to the vendor's Email Threads tab) or Discard (spam or unrelated). You never lose a message — the funnel prefers "unmatched + preserved" over "attributed to the wrong vendor + hidden."

Daily use

Cc: [email protected]  ← the alias
Subject: URGENT — data feed missing since 09:00 UTC
…body…

Rules of thumb:

  • CC, don't BCC. ZantIQ needs to see the alias in the CC header to attribute the thread. BCC'd copies are invisible.
  • Keep the vendor's real address in To:. The alias goes in CC. Never make the alias the primary recipient — vendors need to see who they're replying to.
  • Reference the contract in the subject. Including the contract label ("Re: 2025 Enterprise Agreement — data feed…") lets the funnel step 3 attach the thread to the right contract and commitment automatically.

Where to see the threads

Every vendor detail page (/vendors/<vendor>) has an Email Threads section. Each thread row shows subject, message count, first-response time, and links out to the full conversation view. Threads that couldn't be attributed automatically appear in the Unmatched Queue for manual review.

What we manage on your behalf

Vendor Email Requests is a fully managed feature — the price is included in Business ($2,499/mo) and Enterprise. You never touch DNS or a mail server. On our side we run:

  • The dedicated vendor-comms.zantiq.app apex + MX records
  • SPF / DKIM / DMARC records + monitoring for spoofing
  • Postmark inbound streams with HMAC-verified webhook delivery
  • Malware scanning on every attachment (infected files quarantined, not silently dropped)
  • KMS envelope-encryption of message body + attachments at rest
  • 12-month retention with a nightly purge job (Enterprise can extend to 7 years for HIPAA-adjacent workloads)
  • Deliverability incident on-call — if Postmark degrades, we cutover; you never see it

Limits

  • Business: 5,000 tracked inbound messages/month. Overage is billed at $10 per additional 5,000.
  • Enterprise: unlimited tracked messages. Global tier gets a dedicated sending IP (for future v2 outbound reply-back).
  • Individual attachment cap: 25 MB. Per-thread total cap: 50 MB.
Full ops runbook: for the internal-facing setup + deliverability incident response playbook, see docs/vendor-email-alias-runbook.md. Ops engineers on-call should keep it open during any deliverability incident.
A5

Sync Cadence & Monitoring

Understanding when ZantIQ syncs data and how to monitor integration health.

Sync frequency
Sync typeFrequencyTrigger
Scheduled background syncEvery 15 minutesAutomatic
Manual syncOn demandClick "Sync" on Connectors page
Webhook-triggered syncReal-time (<5 sec)Incoming webhook event from the source system
Post-ingestion syncImmediately after contract ingestionAutomatic after extraction completes
Sync Log

Navigate to Sync Log in the left sidebar to view a full audit trail of every sync operation. Each entry shows:

  • Timestamp (UTC) of the sync
  • Connector system and customer scope
  • Sync outcome (success / partial / failed)
  • Number of fields read and written
  • Error message (for failed syncs)
Filter the Sync Log by connector, date range, or outcome to quickly diagnose recurring failures. Export to CSV for audit reporting.
A6

Webhook & API Integration

Integrate ZantIQ into your internal tooling via REST API and outbound webhooks.

API authentication
ZantIQ exposes a REST API secured with Bearer tokens. Generate tokens in Settings → API Keys.
# Example: List customers curl -X GET https://api.zantiq.ai/v1/customers \ -H "Authorization: Bearer <your-api-key>" \ -H "Content-Type: application/json"
API keys carry full Admin-level permissions. Store them in a secrets manager (e.g., AWS Secrets Manager, HashiCorp Vault) — never commit them to source code or include them in logs.
Outbound webhooks
ZantIQ can POST event payloads to any HTTPS endpoint when key events occur.
EventTrigger
commitment.breachA commitment status changes to breach
commitment.resolvedA breach is cleared and status returns to compliant
connector.errorA connector sync fails
contract.ingestedA contract finishes extraction
field_map.conflictA mapping rule detects a conflict between source and target

Configure webhook endpoints in Settings → Webhooks. Each webhook delivery includes an X-ZantIQ-Signature header (HMAC-SHA256) for request verification.

A7

Data Security & Retention

How ZantIQ handles data security, encryption, and retention policies.

Security summary
ControlDetails
Encryption at restAES-256. All data including connector credentials, contracts, and field values.
Encryption in transitTLS 1.3 minimum for all API and browser traffic.
Credential storageAPI keys and OAuth tokens are stored encrypted and never exposed in UI, logs, or API responses.
Audit logAll admin actions (user changes, connector connects/disconnects, field map edits) are logged with timestamp, user, and IP address.
Data retentionContract files: 7 years (configurable). Sync logs: 90 days. Audit logs: 2 years.
GDPR / data deletionCustomer data can be deleted on request via Settings → Data → Delete Customer. This removes all associated contracts, commitments, and sync history.
AI & data privacyZantIQ does not use customer contract data to train AI models. Vertex AI is used for inference only; no data is retained by the model provider.
SOC 2 (in progress)ZantIQ is designed for SOC 2 Type II compliance. Security controls documentation available upon request at [email protected].

Part B

Business Administration

Covers user and role management, customer and contract workflows, compliance monitoring, SLA performance, alerts, and customer health management. Intended for Customer Success Managers, RevOps leads, and business-side platform administrators.

B1

User & Role Management

Controlling who can access ZantIQ and what they can do.

Role definitions
RoleTypical userKey permissions
AdminVP of CS, Ops Lead, IT AdminEverything — connectors, field mapping, Layer 3 push config, user management, billing, API keys, SSO, webhook configuration, data deletion. Layer 3 pushes require a different admin to approve than the one who requested — the system enforces maker/checker on the server side, so at least two admins are needed for any target write.
ManagerCS Manager, RevOps ManagerFull read/write on customers, contracts, commitments, compliance, SLA pages. Cannot manage connectors, field mapping, billing, or SSO.
ViewerCSM, AE, ExecutiveRead-only access to dashboard, customers, contracts, compliance, and SLA reports. Cannot create, edit, or delete any records.
Inviting users
1

Go to Settings → Team

The Team page shows all active users, pending invitations, and a list of recently deactivated accounts.

2

Click "Invite User"

Enter the invitee's work email address. Select a role. Optionally set a CSM assignment so this user is pre-linked to specific customer accounts.

3

Bulk invite via CSV

For onboarding a team, click "Import CSV". Format: email,first_name,last_name,role. Each person receives an individual invite email.

4

Deactivate users who leave

When a team member leaves, click the three-dot menu on their row → Deactivate. This immediately revokes their access. Their historical activity (audit logs, comments) is preserved.

B2

Managing Customers

How customers are created, organised, and viewed in ZantIQ.

Customer page overview

The Customers page lists all accounts. Each row shows the customer name, plan tier, MRR, compliance score, health tier badge (Compliant / Review / At Risk), assigned CSM, and creation date.

Filtering & search

Use the search bar to filter by customer name. Use the tier buttons — All, Compliant, Review, At Risk — to focus on customers that need attention.

Customer detail view

Click any customer row to open their detail page. The detail view contains tabbed sections: Overview, Contracts, Compliance, and Connectors.

Health tiers

Compliant health score ≥ 90% · Review 70–89% · At Risk <70%. These tiers drive alert priority and QBR preparation workflows.

How customers are created

Customers are created automatically when a contract is ingested (ZantIQ extracts the customer name from the PDF) or via Salesforce sync (each Salesforce Account becomes a ZantIQ customer). You can also create customers manually from Customers → New Customer.

If your Salesforce is connected, customers created there will automatically appear in ZantIQ within one sync cycle (~15 minutes). The Salesforce Account ID is stored as sf_account_id and used to match records across systems.
B3

Contracts & Ingestion Workflow

How to upload, extract, and manage contracts in ZantIQ.

Contract types supported
  • MSA — Master Service Agreement
  • SOW — Statement of Work
  • NDA — Non-Disclosure Agreement
  • Order Form — Subscription order
  • Amendment — Contract modification
Ingestion workflow
1

Upload the document

Click Ingest Contract on the Contracts page. Drag and drop or browse for a PDF or DOCX file. Maximum 50 MB.

2

Automatic extraction runs

ZantIQ's AI engine parses the document (15–60 seconds). It extracts: contract type, customer name, contract value, start and end dates, SLA tiers, response and resolution time commitments, seat counts, uptime guarantees, penalty caps, and escalation paths.

3

Review confidence score

The Extraction Confidence column shows how confident ZantIQ is in its extraction (0–100%).

  • 85%+ — Ready to use. Commitments are auto-activated.
  • 70–84% — Review recommended before activating enforcement.
  • <70% — Manual review required.
4

Commitments are auto-created

Navigate to Commitments to see every obligation extracted from the contract as a separate row — type, contract value, actual value (pulled from connected systems), and compliance status.

Filtering contracts

The Contracts page has filter tabs at the top: All, MSA, SOW, Active, Expired. Use these to quickly find contracts by type or lifecycle status. The Ingestion Status column shows whether extraction is pending, complete, or failed.

B4

Commitments & Compliance Tracking

Monitoring whether your organisation is meeting its contractual obligations.

Commitment statuses
StatusMeaningTypical cause
CompliantContract term is being met in all connected systems.
BreachContracted term is actively being violated.Jira SLA timer exceeded; uptime below contracted level.
MismatchWhat's in the system doesn't match what's in the contract.Zendesk SLA policy set to 2h but contract says 1h.
MissingNo data found for this commitment in connected systems.SLA policy not configured in the ticketing system.
IncompletePartial data found — some target systems have values, others don't.Jira configured but Zendesk SLA missing.
LateA time-bound commitment has passed its deadline.Renewal date passed without action.
UnknownCannot determine status — connector data insufficient.No connectors configured for this customer yet.
Compliance page

Customer filter

Use the Customer dropdown in the top-right to focus on a single customer. Selecting "All Customers" shows aggregate compliance across your entire book of business.

Compliance Score donut chart

Shows the percentage of commitments that are compliant for the selected customer. The centre number is the headline compliance rate.

Status Breakdown bar chart

Shows commitment count by status (Compliant, Breach, Mismatch, Missing, etc.) to identify which problem types are most prevalent.

Non-Compliant Commitments table

A sortable table of every commitment that is not Compliant. Columns: commitment name, customer, type, contract value, actual value, status, and source system. Use this as your weekly action list.

B5

SLA Performance Monitoring

Tracking response time and resolution SLA attainment across your customer base.

SLA Performance page

Customer dropdown

Select a specific customer or view all customers in aggregate. The stat cards, charts, and source breakdown table all update to reflect the selection.

SLA Attainment chart

A grouped bar chart showing Met % vs. Breached % for each priority tier (P1, P2, P3). P1 issues are your most urgent — a Breach here typically triggers financial penalties per contract terms.

Response Time chart

A side-by-side bar chart comparing Actual response times versus the Contracted target for each priority tier. Bars above the target line indicate underperformance.

Overall SLA Health stat cards

Four headline metrics at the top: Met, Breached, At Risk, and Mean Response Time. These update live as ticket data flows from Jira, Zendesk, or Pylon.

QBR preparation: Filter SLA Performance by customer, take screenshots of the attainment and response time charts, and paste them directly into your QBR deck. The chart colours (green = met, rose = breached) are designed to be client-facing.
B6

Alerts & Notifications

How ZantIQ surfaces breaches and how to route them to your team.

Alert types
Alert typeTriggerWhere it appears
SLA BreachA commitment status changes to breachDashboard Active Alerts · Alerts page · Email · Slack (if configured)
Field ConflictA field mapping detects a mismatch between source and targetDashboard Enforcement Intelligence · Field Mapping conflicts counter
Connector ErrorA connector sync failsConnectors page status badge · Email to Admins
Renewal DueA contract renewal date is within the configured notice periodRenewals page · Email digest
Configuring Slack notifications
1

Connect the Slack integration

Go to Connectors → click Connect on the Slack tile. Authorise the ZantIQ Slack App to access your workspace. ZantIQ will request channels:read and chat:write scopes.

2

Set notification channels

Go to Settings → Notifications → Slack. Configure a default channel for breach alerts (e.g., #cs-alerts). Optionally, set per-customer channels so that TechCorp alerts go to #cs-techcorp.

3

Set email notification recipients

Go to Settings → Notifications → Email. Add email addresses to receive daily digest reports and real-time breach alerts. The assigned CSM for a customer is automatically copied on breach alerts for their accounts.

B7

Renewals & Health Scores

Managing contract renewals and tracking customer health over time.

Renewals page

The Renewals page shows all contracts approaching their end date, sorted by renewal date ascending. Use this page for renewal pipeline management and at-risk identification.

Notice period configuration

Go to Settings → Renewals to set your default notice periods (e.g., 90 days, 60 days, 30 days). Contracts entering each threshold receive a notification.

Renewal status tracking

Mark renewals as In Progress, Won, or Churned to maintain your renewal pipeline within ZantIQ alongside your CRM.

Health Scores

The Health Scores page provides a per-customer composite score (0–100%) calculated from:

  • SLA attainment — percentage of SLA commitments met in the period
  • Compliance rate — percentage of commitments with Compliant status
  • Connector coverage — how many contracted systems are connected and syncing
  • Open breaches — active breach count weighted by severity
Health score thresholds: 90%+ = Compliant (green), 70–89% = Review (amber), <70% = At Risk (red). These thresholds can be customised in Settings → Health Score → Thresholds.
Utilization & Exposure

Two additional analytics pages are available to business admins:

Utilization

Tracks contracted seat counts against actual active users, contracted storage against usage, and other consumption-based commitments. Useful for identifying customers approaching or exceeding contracted limits.

Exposure

Quantifies the financial exposure from active breaches — summing penalty caps, credit obligations, and at-risk renewal value. Feeds directly from breach data and contract penalty clauses extracted during ingestion.

B8

AI Agents & Daily Run Limits

How ZantIQ's on-demand AI agents work and what counts against your daily quota.

What is an AI Agent Run?

ZantIQ operates two distinct classes of AI workloads. Automated weekly scans — re-extraction of contract text, embeddings refresh, and anomaly detection — run in the background on a fixed schedule and do not consume any daily quota. On-demand agent runs are manually triggered by a user and each count as one run against the plan's daily limit:

  • Breach Intelligence Brief — triggered from a breach detail page to generate a full AI-authored brief (root cause, exposure, remediation path)
  • Renewal Brief — triggered from a contract page to generate a renewal-readiness summary with risk flags and upsell signals
Daily Run Limits by Plan
PlanOn-Demand Agent Runs / DayReset
Starter25Midnight UTC
Pro50
Business200
Enterprise (Scale / Global)500
Enterprise+Unlimited
Remaining runs for the current UTC day are visible on every user's Profile & Plan page. Programmatic consumers can read usage.agent_invocations_today and limits.agent_daily_limit from the GET /api/v1/billing/subscription endpoint. When the limit is reached, the API returns HTTP 429; the counter resets automatically at midnight UTC — no manual action required.
Automated weekly AI scans (re-extraction, embeddings, anomaly detection) are never charged against the daily run limit. Only manual brief generation counts. If your team is hitting the limit regularly, contact [email protected] to discuss a plan upgrade.

Quick Reference — All Pages

A summary of every page in ZantIQ and what it is used for.

PagePurposeAudience
DashboardPlatform overview: stat cards, enforcement intelligence, active alerts, customer previewAll roles
CustomersCustomer list with health score, compliance tier, CSM assignment; detail drilldownAll roles
ContractsContract list, type/status filters, ingestion trigger, confidence scoresManager, Admin
Contracts → IngestUpload and extract a new contract PDF or DOCXManager, Admin
CommitmentsAll extracted obligations with compliance status, contract vs actual valuesManager, Admin
ComplianceCompliance score donut, status breakdown chart, non-compliant commitment table (per customer)All roles
SLA PerformanceSLA attainment and response time charts by priority tier, per customer filterAll roles
ConnectorsConnect, sync, and manage external system integrations (72 systems across 14 categories)Admin
Field MappingVisual canvas to map source fields to target system fields; manage mapping rules and conflictsAdmin
AlertsAll active breach and mismatch alerts with financial exposureManager, Admin
AmendmentsTrack contract amendments and mid-term changes to obligationsManager, Admin
Health ScoresComposite health score per customer with trend historyAll roles
RenewalsUpcoming renewal pipeline sorted by date, with status trackingManager, Admin
TrendsHistorical compliance and SLA performance trend chartsAll roles
ExposureFinancial exposure from active breaches and penalty clausesManager, Admin
UtilizationSeat count and consumption-based commitment trackingManager, Admin
CreditsCustomer credit obligations from SLA breachesManager, Admin
Sync LogFull audit trail of connector sync operationsAdmin
AgentsAI agent configuration for automated monitoring and escalation; on-demand brief generation consumes the plan's daily run limit (Starter 25/day · Pro 50/day · Business 200/day · Enterprise 500/day · Enterprise+ unlimited — resets midnight UTC)Admin