Changelog
New features, improvements, fixes, and security updates — shipped to every workspace automatically.
- NewAIIntegrationsPlatform
Pact speaks MCP — connect Claude, Cursor, or any AI client to your CRM
A native Model Context Protocol server: external AI agents can query accounts, contacts, deals, and pipeline — and fire Pact's AI agents — with consent filtering, audit, and cost attribution enforced on every call.
#2026-06-11-mcp-serverYour AI assistant can now work your CRM directly — at
https://api.pact.place/mcp/:- Nine tools, live today —
query_accounts,query_contacts,query_deals,query_pipeline_health,get_metric_explanation,ask_workspace,list_agents,fire_agent, andread_briefing. - Consent-native — every record passes the same consent gate the product enforces; suppressed or withdrawn subjects are filtered out and the hidden count is reported back to the agent.
- BYOK-respecting — contact PII is read through your tenant's encryption keys, never around them.
- An audit row per call — tool, client, argument digest, latency, result count, and what the consent gate hid.
- Cost-attributed and rate-limited — AI tool spend lands in your usage ledger and is echoed in the response; per-tenant and per-tool limits stop runaway agent loops.
- Native OAuth — standard discovery metadata plus Dynamic Client Registration, so MCP-native clients connect with no pre-shared keys. Scoped
pact_live_*API keys work too.
Setup guides for Claude, Cursor, and custom clients: [/integrations/mcp](/integrations/mcp).
- Nine tools, live today —
- NewAIAutomation
Agent Orchestrator — multi-agent workflows with explicit handoffs
Compose Pact's agent roster into multi-step orchestrations: one agent's structured output feeds the next through a declared handoff contract, with gates and forks between steps — and consent + cost enforcement on every one.
#2026-06-11-agent-orchestratorOne agent is useful; a chain of them is a process — at
/admin/agents → Orchestrator:- Five prebuilt orchestrations — lead → qualified, stalled-deal rescue, account 360 brief, inbox → action (with branched routing), and inbound funnel health.
- Explicit handoff contracts — each step declares exactly which fields of the previous agent's output it consumes; no prompt-soup between agents.
- Gates and forks — a qualification gate stops the chain on a non-fit; a fork routes an inbox item to support or sales by intent.
- Three new roster agents — account qualification (ICP fit from firmographics + engagement), site optimization (first-party tracking stream), and data validation (a measured SQL profile of your data — null rates, duplicates, out-of-range values — not guesses).
- Yours to edit — installing an orchestration materializes a normal workflow, fully editable in the visual builder. Every step stays consent-gated, cost-attributed, and audit-trailed.
- NewAnalyticsPlatform
White-label embedded analytics — your dashboards on your customers' pages
Embed live, white-labeled Pact dashboards in your own product or customer portal with a signed token — viewers need no Pact login, and consent filtering plus per-view audit hold outside your walls.
#2026-06-11-embedded-analyticsPact's dashboards can now live anywhere you need them:
- Signed-token embeds — each embed is authorized by a short-lived signed JWT minted by your backend; no Pact accounts for your viewers.
- White-label — your branding on the embedded surface, not ours.
- The guarantees travel with the data — rows are consent-filtered and every view is audited and metered, exactly as in-app.
- Five starter templates and an in-app configurator at
/admin/embedto compose, brand, and preview an embed before you ship it.
- ImprovedPerformancePlatform
A steadier, faster app shell
The post-login dashboard no longer shifts layout while it loads, and a server-side stability fix keeps long-running sessions fast.
#2026-06-11-dashboard-performance- Layout shift on the dashboard is gone — the welcome hero and KPI strip no longer jump as data arrives; cumulative layout shift on the home and dashboard routes dropped from 0.62 to 0.02 in production measurement.
- Steadier under load — fixed a server-side memory growth pattern that could slow the web app during long sessions, plus a structural watchdog so it can't recur silently.
- NewAutomationConsentAdmin
Visual workflow automation builder — with a consent gate on every send
Build multi-step automations on a visual canvas — triggers, real branching, test runs, and versioning — and every outbound action checks the consent ledger at execution time.
#2026-06-11-workflow-automation-builderZapier-class automation, native to your CRM data — at
/admin/workflows:- Visual canvas with real branching — conditions actually fork execution paths, not just filter a list.
- 4 trigger types and 12 actions spanning records, sequences, notifications, and webhooks.
- Test-run mode — execute a workflow against a sample record and read every step's outcome before you arm it.
- Versioning — published workflows are immutable snapshots; edit a draft, compare, then promote.
- Consent-gated by construction — any step that touches a contact checks the consent ledger at execution time and records a
consent_blockedoutcome instead of silently sending. Automation a DPO can sign off on.
- NewDataAdminIntegrations
Live Salesforce migration — guided, schema-aware, in-product
Connect Salesforce at /admin/migrate and run a guided import that maps accounts, contacts, deals, owners, and consent state — with a dry-run report before anything is written.
#2026-06-11-salesforce-migratorSwitching CRMs is the moment vendors fear and we optimize for — at
/admin/migrate:- Schema-aware mapping — Salesforce Accounts, Contacts, and Opportunities map to Pact's model with owner assignment and field history preserved.
- Dry-run first — a full reconciliation report (counts, collisions, unmapped fields) before a single record is written.
- Consent state carries over — opt-in/opt-out status lands in the consent ledger with provenance, so day-one sends are as compliant as day-100 sends.
- Deduplication built in — existing records match on identity, not blind inserts.
HubSpot, Pipedrive, Close, and Apollo importers are next on the roadmap; the CSV importer covers them today.
- NewSecuritySecurityCompliance
Public Trust Center — compliance status verified from code
A public /trust page where every framework claim (SOC 2, ISO 27001, HIPAA, GDPR, CCPA) is rendered from the live compliance registry — including the ISO 27001 program's 93 Annex-A controls.
#2026-06-11-trust-centerProcurement teams shouldn't have to take a marketing page's word for it —
/trustrenders from the same compliance registry the product enforces:- Code-backed status — each framework's state (compliant / in progress / available) comes from the live trust-center payload, not hand-edited copy.
- ISO 27001:2022 program — 93 Annex-A controls tracked in-product with a risk register and Statement of Applicability.
- SIG-Lite auto-fill — generate vendor-questionnaire answers from the same control data.
- DSAR, BAA, and sub-processor documentation linked from one place.
- NewAISearch
Ask your workspace anything — answers with citations, filtered by consent
The workspace answer engine takes a plain-English question and answers from your tenant's data — every claim cited back to its source records, consent-filtered, and logged to the audit trail.
#2026-06-11-workspace-answer-engineConversational answers over your own CRM data, built the Pact way:
- Citations on every answer — each claim links back to the source records it was derived from; no unsourced assertions.
- Consent-filtered retrieval — records you're not permitted to use never enter the context window.
- Resistant to prompt injection in your data — retrieved content is treated as data, not instructions.
- Audited — every question, answer, and citation set lands in the audit trail.
- Threads: ask a follow-up and the engine keeps the conversation's context.
- NewImprovedCSAIAnalytics
Customer health 2.0 — an ML risk model that shows its work
Health scoring adds an ML churn-risk layer with per-signal contributions — read exactly which signals moved an account's risk, on a gauge built for the renewal call.
#2026-06-11-customer-health-explainable-riskThe transparent weighted health score now has an ML sibling:
- Churn-risk model with per-signal explanations — every score ships with the contribution of each input signal, so "why did this account turn red" has a real answer.
- Risk gauge on account pages and the CS at-risk view — the explanation renders next to the number, not in a data team's notebook.
- The weighted baseline stays — weights you can see and tune live — and both layers are auditable back to source events.
- NewAIProductivityMobile
Voice notes on every record + Magic Compose
Dictate a note on any record and Pact transcribes, cleans, and files it — and Magic Compose rewrites any text field in your brand voice with a reviewable diff before anything is saved.
Two ways to type less and capture more:
- Voice notes — tap the mic on any contact, company, or deal, talk, and Pact transcribes the audio, tidies the filler words, and attaches a clean note to the timeline. Works hands-free in the field on the mobile app.
- Magic Compose — an Apple-Intelligence-style menu on any text field: rewrite, shorten, expand, or change the tone, always in your tenant's brand voice. Changes land as a side-by-side diff you approve or reject — nothing is auto-saved.
Both run on a live model call and respect your AI cost controls.
#2026-06-04-voice-notes-magic-composeTechnical details
1143PR #1143 — voice notes on records + Magic Compose v2
- NewAIAgents
AI Agents that learn from your corrections
Accept, override, or reject what an AI agent proposes — and the agent remembers. A new /agents browser shows every agent, what it did, and how often you trusted it.
The nine-agent framework now closes the loop:
- Override-and-learn — every agent suggestion can be accepted, edited, or rejected, and that feedback is stored per tenant so the agent's next pass reflects how your team actually works.
- Agent browser at
/agents— a directory of every available agent with a detail page showing recent runs, accept/override/reject rates, and where each agent plugs into your workflow. - Admins get an aggregate trust view to spot which agents are pulling their weight and which need tuning.
No black boxes: you can always see what an agent proposed and why before it touches a record.
#2026-06-04-ai-agents-trust-loopTechnical details
1133PR #1133 — agent trust loop (accept/override/reject + learning)1139PR #1139 — tenant /agents browser + detail
- NewIntegrationsDataAdmin
73-connector integration marketplace + connection platform
A public /integrations directory of 73 connectors, plus an admin connection platform with per-connection field mapping, sync schedules, health, and signed custom webhooks.
Connect Pact to the rest of your stack without a services engagement:
- Public marketplace at
/integrations— browse 73 connectors across CRM, marketing, data, billing, and support, each with what it syncs and how to set it up. - Connection platform at
/admin/integrations/connections— configure each connection's field mapping, sync schedule, and direction, and watch its health from one place. - Custom webhooks with HMAC-signed delivery for anything not in the catalogue, reusing the same encrypted credential store as the first-party connectors.
#2026-06-04-integration-marketplaceTechnical details
1173PR #1173 — Integrations Wave H: 73 connectors + connection platform
- Public marketplace at
- NewBillingFinance
First-class invoices, refunds, and ASC 606 revenue recognition
Pact now issues branded invoices and hosted pay pages, handles refunds and chargebacks, and runs an ASC 606 revenue-recognition engine with a CFO month-close and a balanced journal export.
The quote-to-cash chain now runs all the way through the books:
- Invoices — a first-class invoice object with a branded PDF, a hosted
/p/invoicepay page, and a/sales/invoicesboard. Pay routes to Stripe; Pact never auto-debits. - Refunds & chargebacks — issue a refund with contra-revenue and deferred-revenue reversal handled correctly.
- ASC 606 revenue recognition — point-in-time vs. ratable schedules, a CFO month-close, and a balanced double-entry journal CSV your accounting team can import.
Built on the existing CPQ and order lifecycle — order fulfillment is decoupled from financial status, with an append-only order-events ledger.
#2026-06-04-invoices-revenue-recognitionTechnical details
1146PR #1146 — order lifecycle + ASC 606 rev-rec engine1153PR #1153 — first-class invoice object + hosted pay page1155PR #1155 — refunds & chargebacks + reverse recognition
- Invoices — a first-class invoice object with a branded PDF, a hosted
- NewCRMSalesService
CRM depth — leads, multi-pipeline, cases, approvals, team selling, forecasting
A deep wave across the core CRM: a first-class Leads object with scoring and conversion, multi-pipeline deals with configurable stages and gated advance, Cases with SLAs and auto-routing, multi-step approvals, team selling with compensation and record-level sharing, a forecast command center, and a visual behavioral segment builder with real A/B significance.
Every piece is live and tenant-scoped:
- Leads at
/leads— a first-classLeadobject with lifecycle states, scoring, conversion to account + contact, web-form capture, and round-robin / weighted routing. - Multi-pipeline at
/pipeline— deals are no longer single-pipeline. Define your own pipelines with configurable stages, mandatory entry / exit criteria, gated advance with explicit override audit, per-stage automations, and multi-currency forecast rollup. - Cases (support tickets) at
/cases— case lifecycle with SLAs, auto-routing rules, knowledge-base deflection, and conversion to deal. - Multi-step approvals at
/admin/approvals— branching, multi-step approval processes for discounts, refunds, and any custom object. Builds on the existing single-step framework. - Team selling, compensation, and sharing rules — multi-rep deal participation with per-rep splits, compensation plans (quota and commission), and record-level sharing layered on top of RBAC.
- Forecast command center at
/forecasting— rollup, commit / most-likely / best-case overrides, quota and commission, accuracy tracking, cohort trends, and velocity. - Visual behavioral segment builder at
/segments— live count preview, behavioral predicates (page view, form submit) correlated by contact ID, and campaign A/B tests scored with a real chi-square test (p-value, lift, confidence — tri-state, not a thumbs-up). - Contact 360 — Relationship Strength — a per-contact score on
/accounts/[id]summarizing interaction frequency, recency, and reciprocation across email, calls, meetings, and replies.
Why it matters: the full sales motion now lives in one product — from first lead through close, approvals, support handoff, and forecast — without bolt-on tools.
#2026-06-04-crm-depthTechnical details
1210PR #1210 — Lead management: entity, lifecycle, scoring, conversion, capture, routing1207PR #1207 — Multi-pipeline + configurable stages + gated advance + stage automation1209PR #1209 — Cases + multi-step approval processes1208PR #1208 — RevOps Wave 5: team selling, compensation, sharing rules1206PR #1206 — Forecast command center: rollup, override, quota, commission, accuracy1205PR #1205 — Visual behavioral segment builder + real chi-square A/B significance1201PR #1201 — per-contact Relationship Strength on Contact 360
- Leads at
- NewBillingFinance
E-invoice formats, automated tax, ACH and wire reconciliation, polished quote PDF
Closes the remaining gaps in quote-to-cash: e-invoice generation in Peppol BIS 3.0, UBL 2.1, and CFDI 4.0; automated tax via Avalara and TaxJar; Plaid ACH and wire reconciliation; and a polished quote PDF with archivable filename and audit certificate.
- E-invoice formats — Peppol BIS 3.0, UBL 2.1, and CFDI 4.0 generation with a validation oracle. Submission to AP and PAC providers is human-gated.
- Automated tax — pluggable engine with Avalara and TaxJar adapters, exemption support, and a flat-rate fallback when no provider is configured.
- Plaid ACH and wire reconciliation — encrypted Plaid token storage, an exact-match wire matcher on reference + amount (auto-reconcile when both match, manual queue otherwise), and buyer-initiated Stripe ACH.
- Polished quote PDF — branded header, repeat thead on long quotes, signature block, accept / draft watermark, page numbering, archivable filename, and a print stylesheet that matches the on-screen surface.
#2026-06-04-money-path-completionTechnical details
1164PR #1164 — e-invoice: Peppol BIS 3.0 / UBL 2.1 / CFDI 4.01170PR #1170 — automated tax (Avalara/TaxJar) + Plaid ACH and wire reconciliation1138PR #1138 — polished quote PDF with print-stylesheet parity
- ImprovedNewAI
Today and Coach now run on real Claude, plus a Campaign Builder agent
The daily summary on /home is now a live Claude call, three feature classifications were corrected, the brand-voice retrieval that Magic Compose depends on was rewired, and a new Campaign Builder AI agent drafts and optimizes marketing campaigns end-to-end.
- Today / Coach summary on real Claude — the daily summary on
/homeis a live model call grounded in your own data, not a templated string. Three features that were misclassified as Hybrid were corrected on the public catalogue at/ai-features, which now shows 37 Real, 22 Hybrid, and 0 Not yet AI. - Magic Compose brand-voice retrieval — hoisted into a leaf module so the brand-voice path that was silently dead in Magic Compose is now wired end-to-end. Existing Magic Compose flows benefit automatically.
- Campaign Builder agent — drafts a multi-step campaign (subject lines, body, sends, follow-ups) from a brief and lets you optimize before sending. Lives in
/admin/automationsand on the campaign editor.
Why it matters: every AI feature classified as "Real" actually runs a live model call on every request — and the catalogue is the same registry that powers the in-app honesty badges and a CI gate that blocks any feature shipped as "AI" without a real model call.
#2026-06-04-ai-catalogue-and-todayTechnical details
1136PR #1136 — Today / Coach summary on real Claude + 3 dishonest HYBRID corrections1149PR #1149 — hoist brand-voice retrieval + fix dead path in Magic Compose1163PR #1163 — Campaign Builder AI agent: draft and optimize campaigns
- Today / Coach summary on real Claude — the daily summary on
- NewSecuritySecurityComplianceAdmin
Enterprise SSO and SCIM hardening, signed webhooks, per-tenant rate limits
Break-glass admin recovery, SAML group to role JIT, SP-side request signing, the SCIM enterprise user extension, IdP metadata-URL setup with a Workday-tested guide, HMAC-signed webhooks with secret rotation, per-tenant inbound credentials, and a quota-usage dashboard.
- Break-glass admin recovery — a sealed, audit-logged path back into your tenant when SSO is misconfigured, so you can never lock yourself out.
- SAML group → role JIT — first-time sign-in maps SAML groups to Pact roles automatically.
- SP-side request signing — Pact signs its SAML AuthnRequests so identity providers can verify them.
- SCIM enterprise extension — supports employee number, department, manager, and cost center.
- Metadata-URL setup + Workday-tested guide — paste your IdP's metadata URL and Pact configures the rest. End-to-end tested with Workday.
- HMAC-signed webhooks with rotation — every outbound webhook carries a signature; admins can rotate the signing secret with a grace window so subscribers never miss a beat.
- Per-tenant inbound credentials and quota usage — see exactly which integration is sending what, with rate-limit headroom at a glance.
Why it matters: enterprise admins can stand up SSO, SCIM, and signed webhooks without filing a support ticket, and have full visibility into who's authenticated and what's hitting their tenant.
#2026-06-04-sso-scim-webhooksTechnical details
1137PR #1137 — Enterprise SSO/SCIM hardening: break-glass, SAML JIT, SP signing, Workday1141PR #1141 — merge parallel alembic heads (SSO/SCIM + agent feedback)1144PR #1144 — signed webhooks + secret rotation + per-tenant creds + quota dashboard
- FixedImprovedMobile
Mobile polish — contact view, pipeline, visual builders, and more
Contact view lays out cleanly at 320 px and stops blanking after refresh, the pipeline kanban no longer overlaps cards on tall stages, every visual builder accepts drag-from-palette without crashing, Buyer Lens fits the 4-column channel grid, and pull-to-refresh waits for an intentional gesture.
- Contact detail page — grid columns constrained so long identifiers no longer overflow at 320 px; the What's-happening card body no longer goes blank after refresh;
$5,000kcurrency rollup formats correctly. - Pipeline kanban virtualization —
measureElementis wired correctly, so deal cards no longer overlap on tall stages. - Visual builder drag-from-palette — every visual builder (sequences, journeys, workflows, custom workflows) now accepts a drag without crashing the canvas. Hardened against WebKit, mobile gestures, agent-built canvases, and empty canvases.
- Buyer Lens — pill wrap and a properly responsive 4-column channel grid that no longer cramps at 320 px.
- Pull-to-refresh — gated on scroll position so accidental pulls during reading don't trigger a refetch.
#2026-06-04-mobile-polishTechnical details
1192PR #1192 — contact detail page grid columns constrained1193PR #1193 — contact identifier values no longer overflow at 320 px1190PR #1190 — What's-happening blank body + $5000k currency rollup1204PR #1204 — pipeline deal cards no longer overlap (virtualizer measureElement)1142PR #1142 — P0: drag-from-palette no longer crashes the canvas1145PR #1145 — harden the drag guard: WebKit + mobile + agents + empty canvas1194PR #1194 — Buyer Lens tab layout: pill wrap + 4-col grid1200PR #1200 — scroll-aware pull-to-refresh gate
- Contact detail page — grid columns constrained so long identifiers no longer overflow at 320 px; the What's-happening card body no longer goes blank after refresh;
- ImprovedReliability
Behind-the-scenes reliability work
Faster, more predictable deploys: Vercel builds get the headroom they need, our deploy wrapper refuses unmerged code and pre-flights database migrations, and the security CI gate is tuned to recognize current authorization patterns.
Internal improvements that customers don't see directly but feel as fewer deploy delays and tighter release safety:
- Vercel build headroom — Node heap and twitter-image runtime literals tuned so Vercel builds don't run out of memory partway through.
- Deploy guards — our
deploy.shwrapper refuses to deploy unmergedHEADand pre-flights every pending Postgres migration before the cutover, so a botched release is caught before any user-visible change. - Tighter security CI — the auth-hygiene scanner now recognizes
require_moduleas a valid authorization guard, so the gate flags real issues without false positives that previously blocked unrelated PRs.
#2026-06-04-reliabilityTechnical details
1214PR #1214 — unblock Vercel builds: raise Node heap + inline twitter-image literals1213PR #1213 — deploy.sh guards: refuse unmerged HEAD + pre-flight Postgres migrations1212PR #1212 — auth_hygiene scanner recognizes require_module as an authz guard
- NewHelpAI
In-context help and inline AI on every control
Hover the ⓘ icon next to a control for a plain-language explanation, a Learn more link, and an inline AI answer — without leaving the page.
A new help layer that sits on top of the existing help bubble:
- Hover, click, or keyboard-focus the ⓘ icon to open a glass tooltip with a short description and a deep link to the relevant docs.
- Ask AI inline — the answer streams back in under two seconds, grounded in the specific control you asked about. If the AI doesn't have enough context, it says so instead of guessing.
- Wired into ten real controls today across API keys, notifications, appearance, and the dashboard, and rolling out to more surfaces every week.
- Touch devices get a full-width bottom sheet so the content never clips a screen edge; the controls without a help entry stay clean — no clutter where there's nothing to say.
#2026-06-03-in-context-helpTechnical details
1121PR #1121 — HelpHover primitive + inline AI Q&A on UI controls
- NewAIAdmin
AI feature marketplace — public catalogue and admin cost browser
A public /ai-features catalogue with honest REAL / HYBRID / not-yet-AI classification, and an admin browser at /admin/ai/features with 30-day spend, per-feature detail, and cost-optimization recommendations.
Two surfaces, one source of truth:
- Public catalogue at
/ai-features— every AI feature Pact ships, classified as REAL (a live model call on every request), HYBRID (model plus deterministic logic), or NOT YET AI, with the provider, surfaces, and what it does. No marketing fluff; the same registry powers the in-app honesty badges and a CI gate that blocks any feature shipped as "AI" without a live model call. - Admin browser at
/admin/ai/features— card grid with classification chips, search, filters, and sorts; a tenant-wide 30-day spend hero; and a cost-optimization panel with concrete recommendations (model efficiency, large-context warnings, low-usage flags, cache health). - Per-feature detail page with a curated sample input/output, the last 20 anonymized runs, the system-prompt overlay (and whether you've overridden it), where the feature is used in the product, and tailored recommendations for that feature only.
Why it matters: admins can see exactly what every AI feature does, what it costs, and where to tune it — without filing a ticket or reading code.
#2026-06-03-ai-feature-marketplaceTechnical details
1124PR #1124 — AI feature marketplace: classification, cost, per-feature detail
- Public catalogue at
- NewDashboardsAnalyticsSales
Eight one-tap sales-velocity dashboard templates
Browse a new gallery at /dashboards/new and clone any of eight pre-built dashboards covering sales velocity, deal aging, win rate, rep ramp, activity, customer success, attribution, and the executive scorecard.
A new gallery at /dashboards/new with eight category-grouped templates, each composed over real tenant-scoped data and clonable with one tap:
- Sales velocity — weighted pipeline, win rate, time-to-close trend, win rate by source, forecast by category.
- Deal aging — stale deals (>30 days idle), slipped close dates, aging buckets, average age by stage.
- Win rate by source — by source, industry, deal size, rep, and quarter.
- Rep ramp — deals and activity per rep, win rate by rep, tenure.
- Activity intelligence — activity mix, daily volume, per-rep load, sequence engagement.
- Customer success scorecard — health distribution, NPS trend, at-risk accounts, renewals.
- Marketing attribution — first-touch source pipeline and revenue, channel mix, engagement.
- Executive scorecard — ARR, bookings QTD, win rate, coverage, health, NPS plus trends.
Every template inherits the existing dashboard builder's anomaly badges, AI insight summaries, and threshold alerts.
#2026-06-03-velocity-dashboardsTechnical details
1125PR #1125 — 8 sales-velocity templates + /dashboards/new gallery1126PR #1126 — live prod proof against Fly v648
- NewSecurityComplianceSecurityAdmin
SOC 2 Type II evidence automation and self-serve HIPAA BAA
A new compliance center at /admin/compliance — a SOC 2 readiness scorecard with automated, tamper-evident evidence bundles for auditors, and a self-serve HIPAA Business Associate Addendum at /admin/compliance/baa.
Turns Pact's existing controls — tenant isolation, RBAC, append-only audit log, GDPR deletion, sub-processor management, encryption — into systematic, auditor-ingestible evidence:
- SOC 2 readiness scorecard at
/admin/compliance/soc2— per-criterion coverage across all five SOC 2 Trust Services Criteria, with per-evidence-type freshness. - Automated nightly evidence collection for six evidence types (access review, audit-log retention, vendor/sub-processor schedule, customer data deletion, encryption posture, processing-integrity controls). Manual evidence (change management, vulnerability scans, backup-restore test, incident response, tenant-isolation CI gate) is surfaced as an honest gap list with collection instructions — never fabricated.
- Tamper-evident bundles — SHA-256 hashes over every artifact's exact bytes, a manifest hash over the sorted set, and an optional HMAC-SHA256 signature. Verifiable end-to-end; any byte-level edit is detected.
- One-click monthly bundle + multi-period auditor package, each with an auditor-facing index PDF.
- Self-serve HIPAA BAA at
/admin/compliance/baa— preview the addendum with your covered-entity name pre-filled, download a signed PDF with a matching document hash.
Why it matters: enterprise prospects' auditors can be handed a polished evidence ZIP covering every SOC 2 criterion on the spot — and HIPAA-covered customers can self-serve a BAA without going through legal back-and-forth.
#2026-06-03-soc2-hipaa-evidenceTechnical details
1116PR #1116 — SOC 2 Type II evidence automation + HIPAA BAA generator
- SOC 2 readiness scorecard at
- ImprovedAdminData
One-click purge of demo data, including seeded emails
Admin → Data management at /admin/seed-data now includes a 'Purge seeded emails' button so you can wipe demo contact emails in one click before going live.
Every seeded record now carries an
is_seed_dataflag, and the Admin → Data management surface gained a "Seeded emails" card with a DEMO badge and a one-click purge button (with a type-DELETE confirm and an audit-log entry). Use it as part of your go-live checklist to clear the demo emails the workspace shipped with — your real, customer-entered contact emails are never touched.#2026-06-03-seed-data-purgeTechnical details
1122PR #1122 — seed encrypted contact emails + is_seed_data flag + purge switch
- ImprovedReliability
Behind-the-scenes reliability work
Recurring cleanup of stale preview environments and a daily branch-hygiene sweep — quietly keeping the underlying infrastructure tidy so deploys stay fast and predictable.
Two internal improvements that customers don't see directly but feel as a faster, more reliable platform:
- Recurring preview-environment cleanup — a unified engine reaps closed-PR preview databases, branches, and deploys on a nightly schedule and after every release, with safety rails that never touch open PRs, protected branches, or anything labeled
keep-preview. - Daily branch-hygiene sweep — automated audit of long-stale branches with a rolling tracking issue, so engineering work stays focused and the deploy surface stays clean.
#2026-06-03-reliabilityTechnical details
1119PR #1119 — unified recurring preview-resource cleanup engine1120PR #1120 — preview-cleanup observability tile + control1123PR #1123 — branch + worktree sweep + daily hygiene cron
- Recurring preview-environment cleanup — a unified engine reaps closed-PR preview databases, branches, and deploys on a nightly schedule and after every release, with safety rails that never touch open PRs, protected branches, or anything labeled
- NewOnboarding
Personalized onboarding tours per role
Guided onboarding tours tailored to your role — CRM, Customer Success, Marketing, or Admin — that start automatically on first sign-in and pick up where you left off.
Each persona gets its own walk-through of the surfaces it uses daily, anchored to real screens:
- CRM — accounts, contacts, deals, follow-ups, pipeline.
- Customer Success — health, at-risk accounts, playbooks, workload.
- Marketing — sequences, templates, AI steps, forms, attribution.
- Admin — users, integrations, audit log, AI usage, health.
Tours auto-start on first sign-in, resume if you leave mid-way, and can be replayed any time.
#2026-05-30-persona-toursTechnical details
1034PR #1034 — four-persona first-run tours1035PR #1035 — tour resume + replay1037PR #1037 — persona detection + picker
- ImprovedFixedSearchNavigation
Smarter search and context-aware navigation
Search returns rich, ranked results across every entity, calendar links resolve gracefully, and moving between modules keeps your place.
- Hybrid search — results are ranked across all entities using keyword and semantic matching together, so the right account, contact, or deal surfaces first.
- Graceful calendar links — calendar URLs redirect sensibly instead of dead-ending in a 404.
- Cross-module navigation — jumping from one module to another preserves your context, with a breadcrumb back to where you came from.
#2026-05-30-graceful-uxTechnical details
1036PR #1036 — hybrid search, calendar redirects, return breadcrumb
- NewAI
AI agents you can run on demand or on a schedule
Four AI agents are live — inbox triage, deal coach, customer-success save, and sequence personalizer. Run them ad-hoc or set them to run automatically on a schedule.
- Inbox triage — sorts and prioritizes incoming messages.
- Deal coach — suggests the next best move on an open deal.
- Customer-success save — flags at-risk accounts and drafts a save play.
- Sequence personalizer — tailors outbound steps to each recipient.
Trigger an agent yourself, or schedule it to run on its own.
#2026-05-30-ai-agentsTechnical details
1030PR #1030 — AI agent framework + scheduled runs
- ImprovedSecurityAISecurity
AI answers honestly, with untrusted-input fencing
Every AI feature now declines clearly when it lacks enough context instead of fabricating an answer, and untrusted input is fenced off everywhere.
- AI features return an honest "not enough information" rather than inventing details when context is thin.
- Untrusted input (record content, email bodies, uploads) is fenced from instructions across every AI surface, hardening against prompt injection.
#2026-05-30-ai-honestyTechnical details
998PR #998 — AI prompt-engineering standard + input fencing
- SecurityNewFixedSecurityCompliance
Enterprise security and compliance hardening
SSO-required enforcement now actually blocks password sign-in, plus audit-log retention pruning, a downloadable DPA, a cookie consent banner, and a tenant-aware sub-processor list.
- SSO required is now enforced at sign-in — closing a real gap where password login still worked when SSO was mandated.
- Audit log retention prunes on a schedule per your policy.
- Downloadable DPA — generate and download your Data Processing Addendum as a PDF.
- Cookie consent banner for public surfaces.
- Sub-processor list is tenant-aware and kept current.
#2026-05-30-enterprise-hardeningTechnical details
1032PR #1032 — SSO enforcement, DPA PDF, consent banner, sub-processors
- SecuritySecurity
Security hardening and a tenant-isolation gate
Three critical and three high-severity issues fixed, with a new tenant-isolation check baked into the test suite to prevent regressions.
- Three CRITICAL and three HIGH severity fixes shipped, including cross-tenant access paths.
- A new tenant-isolation gate runs in the test suite, so a route that derives a record from a request body instead of the auth context fails the build.
#2026-05-30-security-hardeningTechnical details
1001PR #1001 — security fixes + tenant-isolation CI gate
- PerformancePerformanceAnalytics
Analytics and dashboards served from a read replica
Analytics and dashboard reads now route to a dedicated read replica, so heavy reporting no longer competes with your day-to-day work.
Read-heavy analytics and dashboard queries are served from a separate database replica. The result is faster reports and a snappier app everywhere, because reporting load no longer contends with interactive reads and writes.
#2026-05-30-replica-readsTechnical details
1031PR #1031 — replica routing for analytics/dashboard reads1033PR #1033 — replica middleware repair
- NewDevelopersAPI
Developer hub at /developers
A new developer hub with quick-starts, SDK code examples, an integration cookbook, and a redesigned webhook subscription console.
The new /developers hub gathers everything you need to build on Pact:
- Quick-starts for API keys, your first call, OAuth, and webhooks.
- Copy-paste SDK examples in curl, TypeScript, and Python.
- An integration cookbook with end-to-end recipes.
- A redesigned webhook console with delivery health and per-subscription stats.
#2026-05-30-developer-hubTechnical details
1029PR #1029 — /developers hub, SDK examples, webhook console
- NewImprovedCalendar
Microsoft 365 calendar setup wizard
Microsoft 365 calendar sync is now configurable through an admin wizard that mirrors the Google setup flow.
Connect Microsoft 365 calendars through a guided admin wizard — the same step-by-step flow already used for Google, so there's one consistent way to set up either provider.
#2026-05-30-ms365-calendar-wizardTechnical details
1028PR #1028 — Microsoft 365 calendar admin wizard
- FixedCalendar
Calendar credentials read from the right place
Calendar OAuth credentials are now read from the correct store — no more dead-end asking you to configure them somewhere inaccessible.
Calendar OAuth credentials now resolve from your workspace's integration credentials, fixing a dead end where setup pointed at a platform store you couldn't reach.
#2026-05-30-calendar-credentials-fixTechnical details
1024PR #1024 — calendar OAuth credential resolver fix
- NewCalendarScheduling
Two-way calendar sync and public booking pages
Two-way Google and Microsoft sync, public booking pages at /book/your-slug, round-robin team booking, and automatic confirmation emails.
- Two-way sync with Google and Microsoft calendars.
- Public booking pages at
/book/<your-slug>so anyone can grab time with you. - Round-robin team booking distributes meetings across a team.
- Confirmation emails are sent automatically on booking.
#2026-05-30-calendar-sync-bookingTechnical details
1002PR #1002 — calendar sync + booking foundation1025PR #1025 — booking seed + not-found handling1026PR #1026 — booking routing1027PR #1027 — public scheduler proxy
- NewAppearance
Choose your ambient background
Pick an ambient theme at /settings/appearance — Aurora, Ocean, Rainfall, Fireplace, Forest, Snowfall, Cosmos, or Minimal — with a mobile override that works.
Set the mood of your workspace from Settings → Appearance. Eight ambient themes — Aurora, Ocean, Rainfall, Fireplace, Forest, Snowfall, Cosmos, and Minimal — each tuned for performance, with a mobile override that actually takes effect on phones.
#2026-05-30-ambient-backgroundsTechnical details
1008PR #1008 — ambient background system + picker1009PR #1009 — mobile override + performance caps
- FixedAppearance
Working light and dark variants for every ambient theme
All eight ambient backgrounds now render correctly in both light and dark mode, instead of washing out or going blank.
Every ambient theme now has a proper light and dark variant. Previously some were eye-searing in light mode or blank in dark mode; each is now tuned for both.
#2026-05-30-light-dark-variantsTechnical details
1020PR #1020 — light/dark variants for all ambient themes
- NewFixedAppearance
Liquid-glass interface, with real blur on iOS Safari
A liquid-glass surface system across the app, and a fix so iOS Safari 17 and earlier get real blur instead of a flat panel.
- A consistent liquid-glass surface system across the app's panels and sheets.
- Fixed a build step that was dropping the
-webkit-blur prefix, so iOS Safari 17 and earlier now get true frosted blur rather than a flat fallback.
#2026-05-30-liquid-glassTechnical details
1003PR #1003 — liquid-glass surface system1006PR #1006 — preserve -webkit-backdrop-filter in built CSS
- ImprovedMobileAppearance
Redesigned mobile interface
Mobile gets a transparency-led redesign — tinted glass cards, a soft veil for legibility, and a coordinated action-button stack so Help and AI no longer overlap.
- Tinted glass cards and a gaussian veil keep content legible over ambient backgrounds.
- The floating action buttons (Help and AI) are now coordinated into one stack instead of colliding.
#2026-05-30-mobile-glassTechnical details
1014PR #1014 — mobile glass cards1018PR #1018 — tinted glass + veil1019PR #1019 — coordinated FAB stack
- FixedMobile
No surprise keyboard on mobile
Mobile pages no longer pop the on-screen keyboard the moment they load — only when you explicitly tap a search field.
Inputs no longer steal focus on page load on touch devices, so the keyboard stays down until you actually tap a field. The command palette still opens the keyboard, because there you asked for it.
#2026-05-30-mobile-no-autofocusTechnical details
1009PR #1009 — disable autofocus on touch1011PR #1011 — keyboard only on explicit tap
- NewImprovedAnalyticsDashboards
Dashboards that animate, ship with demo data, and clean up
Dashboards animate on load, new workspaces start with pre-populated demo dashboards, and admins can wipe the demo data when they're ready.
- Dashboards animate on load — staggered cards, count-up metrics, an anomaly pulse, and a fade-in for insights.
- New workspaces get pre-populated demo dashboards so the product looks alive on day one.
- Admins can wipe demo data from Admin → Data management whenever they like.
#2026-05-30-dashboardsTechnical details
1013PR #1013 — dashboard load animations1016PR #1016 — demo dashboard seeder + is_seed_data flag1017PR #1017 — admin demo-data off-switch
- NewSales
Lead routing, click-to-call, power dialer, and threaded SMS
A sales-operations suite: lead routing, click-to-call and a power dialer, threaded SMS, AI call transcripts, and a mobile dialer.
- Lead routing assigns inbound leads to the right rep.
- Click-to-call and a power dialer for working a list fast.
- Threaded SMS keeps text conversations in one place.
- AI call transcripts capture and summarize calls.
- A mobile dialer for selling on the go.
#2026-05-30-sales-opsTechnical details
999PR #999 — lead routing, dialer, SMS, call transcripts
- NewMarketingForms
Public form sites — drag-and-drop builder with custom-field mapping
Build a hosted lead-capture form in minutes — drag-and-drop builder, starter templates, and one-click mapping from form fields onto custom contact and account fields. Submissions land in your CRM with full consent.
What changed
A new admin surface —
/admin/forms— replaces the old "embed this iframe and pray" workflow.- Drag-and-drop builder — every field type you'd expect (text, email, phone, dropdown, radio, multi-select, consent checkbox, hidden tracking fields) drags onto a live preview. Reorder, duplicate, or delete with a single click.
- Custom-field mapping — fields you've defined under Admin → Custom fields show up directly in the builder. A new lead-capture field can be wired into the form, mapped to the contact column, and live within the same minute.
- Starter templates — common shapes (Contact us, Demo request, Newsletter signup, Event RSVP, Beta access) come pre-built so you don't draw from a blank page.
- Hosted form sites — every form gets a public URL on
pact.place, mobile-first, your branding, no iframe required. Embed it as a link, drop it in a marketing email, or share it on social.
Why it matters
Forms are where customers tell you they want to talk to you. Until this PR, you needed an engineer to ship a form change. Now any marketer can build, publish, and edit a form without leaving Pact — and every submission lands as a contact with consent recorded, so the marketing engine can take it from there.
#2026-05-28-form-sitesTechnical details
ed2c9ed1PR #952 — feat(forms): public form sites with drag-drop builder + custom field mapping + templates
- NewAdminDashboard
Customizable page layouts with cascading scopes
Rearrange the dashboard for the whole tenant, a single role, a group, or one user — with a clean cascade, a one-click reset per scope, and a full audit trail for every change.
What changed
The dashboard now follows a layout owned by you, not Pact.
- Editor at `/admin/page-layouts` — pick the page, pick the scope (default, role, group, user), drag the blocks into the order you want, then save.
- Cascading scopes — when Pact renders the dashboard it walks
user > group > role > tenant > defaultand uses the first layout it finds. Power users can override the org-wide default for themselves; everyone else inherits the layout admins set for them. - Graceful fallback — if your custom layout points at a block that no longer ships (e.g. a removed module), the renderer silently falls back to the next layer instead of throwing.
- Audit log — every layout change is recorded with who, when, and what changed. Roll back from the audit trail without losing other in-flight edits.
What's editable today
Dashboard v1 is the first page on the cascade. More pages (account detail, pipeline, inbox) will follow as we extend the block registry. The contract for adding a new editable page is one entry in
web/src/lib/page-layouts/registry.tsx.Why it matters
Sales leaders, customer-success leads, and product marketers each want a different dashboard. Until now they all looked at the same one and complained. Page layouts ship a real answer instead of "we'll add a toggle eventually."
#2026-05-28-page-layoutsTechnical details
9cb4eefePR #954 — feat(layouts): customizable page layouts cascading scopes + graceful fallback + audit
- NewAdminDeveloper
Interactive schema explorer for admins
A live ERD of every Pact table — 185 nodes, 241 edges — with auto-layout, a side drawer per table, tier filtering, and pinch-zoom on mobile. Sits under Admin → Schema explorer.
What changed
/admin/schema-exploreris a new interactive map of the entire Pact data model.- Auto-layout ERD — every ORM table renders as a card, every foreign key as an edge. The graph (185 nodes, 241 edges in the current snapshot) is computed server-side from
Base.metadata.tablesand served byGET /v1/admin/system/schema-graph. - Side drawer per table — click a node to see its columns, their types, nullability, and the foreign keys leaving and entering the table.
- Tier filtering — toggle the tier chips to focus on just the public surface, the authenticated tier, or the staff/internal tables. Makes it tractable to answer "what does a customer actually see?" in one screen.
- Mobile pinch-zoom — the canvas pans and zooms on touch, so on-call engineers can reason about the model from a phone during an incident.
Why it matters
Until now the schema lived in
models/*.pyand a couple of out-of-date diagrams. Onboarding engineers and customer-facing teams now have a single, always-current ground truth for "what data does Pact actually store, and how is it connected."#2026-05-28-schema-explorerTechnical details
622d9b79PR #947 — feat(admin): interactive schema explorer — auto-layout ERD + drawer + tier filtering + mobile pinch-zoom
- Auto-layout ERD — every ORM table renders as a card, every foreign key as an edge. The graph (185 nodes, 241 edges in the current snapshot) is computed server-side from
- ImprovedAdminMobile
Pact Internal Ops console — card layout, visible actions, mobile-clean
The internal staff console at /pact-admin got a polish pass: mobile-friendly card layout for tenants, action buttons that are actually visible, meaningful empty states instead of blank panels, and a relative-time bug fix that was making rows look stale.
What changed
The Pact Internal Ops console (
/pact-admin, gated tois_pact_staff) was a feature-complete but rough surface. This change makes it usable on the phone and honest in its empty states.- Tenants page (
/pact-admin/tenants) — switched from a too-wide table to a mobile-first card layout. Each tenant card shows the things ops actually scans for (plan, status, last activity, support flag) without horizontal scrolling at 375px. - Visible actions — "Impersonate", "Suspend", and "Open billing" used to hide behind a triple-dot menu that nobody discovered. Primary actions are now buttons; the rare ones stay in the menu.
- Meaningful empty states — Trials, Backups, and Health used to render a blank panel when the underlying list was empty. Each now says what the panel is for and how to add something to it.
- Relative-time fix — the "Last active 2 hours ago" string was misreading the timestamp on
/pact-admin/tenantsand/pact-admin/trials, making every row look stale. The sharedfmtRelative/formatRelativehelper has been fixed and the call sites unified.
Why it matters
The Internal Ops console is the surface our team reaches for during an incident — usually from a phone, away from a desk. A console that requires a laptop is a console that nobody uses.
#2026-05-28-pact-internal-opsTechnical details
7e168d9bPR #955 — fix(staff): Pact Internal Ops + staff surfaces — card layout mobile, visible actions, meaningful empty states, relative-time bug
- Tenants page (
- NewAdminSecurityEnterprise
Enterprise controls: audit log, GDPR export, and rate-limit visibility
A pass over the enterprise hardening surface to close the remaining gaps in the admin audit log, the GDPR self-service export, and the per-tenant rate-limit dashboard.
What's now in admin
This release closes the last small gaps in three enterprise controls that already shipped most of their functionality earlier in the quarter:
- Audit log at
/admin/audit-logand/admin/security/audit-log— searchable, cursor-paginated, with before/after diffs on edited rows, source IP, and CSV / JSONL / XLSX export. A watch subscription will notify you when a row matching your filter lands. - GDPR self-service export — your end users can request a copy of their data from
/v1/me/privacy/export; admins manage requests at/admin/privacy. Each export is delivered as a signed-URL ZIP. Deletions carry a 30-day grace period with an email cancellation token, so a tap of a wrong button doesn't permanently lose someone's data. - Rate-limit visibility at
/admin/security/rate-limits— per-tenant policies, per-API-key sliding-window counters, and the choice ofblock,log_only, orthrottlemode per route, with sampled audit events. Plan-tier defaults are pre-loaded.
Why it matters: customers on enterprise plans now have one admin surface that answers *"who did what?"*, *"can my users get their data?"*, and *"what's hitting my API right now?"* — without needing to file a support ticket.
#2026-05-28-enterprise-controlsTechnical details
a5f2e3d4PR #937 — gap-close on audit log / GDPR export / rate-limit visibility
- Audit log at
- SecurityFixedReliabilitySecurityAPI
Rate-limit outage hardening: fail-open + visible API reference errors
Two changes shipped together after the 2026-05-28 outage: the rate-limit backend now fails open instead of taking auth down, and the API reference surfaces fetch errors loudly instead of spinning forever.
What happened on 2026-05-28
Our Upstash Redis instance hit its monthly request quota at 03:34 UTC. Every Redis command started returning a quota error. The rate-limit dependency propagated that error to FastAPI — which meant every authenticated request, including
/v1/auth/login, returned an HTTP 500. Users were locked out of the app for about fifteen minutes until we switched the counter to an in-memory backend.Fail-open rate limiting
The rate-limit code now wraps every backend call in a guard. If the counter backend errors for any reason — quota, network, missing instance — the request is allowed through (rather than 500-ing), and a degraded-counter metric increments. A WARN line is logged with the error class, count, and route; Sentry tags the request
rate_limit.degraded=true. The next time the counter is unhealthy, on-call gets a notification at the alarm threshold, not an outage at the quota.Normal behavior is unchanged: when Redis is healthy, no warning fires and the counter stays at zero. When the backend genuinely denies a request, callers still get an honest 429.
Loud errors on the API reference
During the outage, the staff and authenticated tier tabs on
/api-referenceshowed an infinite loading spinner instead of an error, because the spec-fetch effect had no timeout or error UI. The fix:- 15-second timeout on the fetch, then a structured error state.
- Four error kinds —
timeout,auth,network,http— each with the right call to action and a "Try again" button that re-runs the fetch without a page refresh. - 401 / 403 prompts you to re-authenticate instead of looking like the docs are broken.
Why it matters: the next time a downstream dependency hiccups, auth stays up and the docs don't lie about it. A full postmortem lives at
docs/incidents/2026-05-28-auth-outage.md.#2026-05-28-rate-limit-resilienceTechnical details
8298ac9aPR #936 — fail-open on Redis errors so quota/network failures don't 500 authb78524efPR #938 — surface API-reference fetch errors visibly instead of infinite spinner
- NewAdminAI
Admin: AI feature inventory and per-feature cost breakdown
Two new admin pages — one for auditing every AI feature in Pact (real vs. hybrid vs. not-yet-AI), and one for breaking AI spend down by feature and by user with a 1/7/30/90-day window.
/admin/ai/inventory
A sortable, color-coded table of all 32 audited AI features Pact ships. For each feature: the feature ID, display name, classification (REAL 14 · HYBRID 17 · NOT YET AI 1), provider, endpoint, and the UI surfaces it appears on. The same registry powers the public "Powered by Claude" honesty badges and a CI gate that fails any PR which lets a feature ship as "AI" without a live model call.
/admin/ai/cost-breakdown
Per-feature AI spend with a nested per-user drill-down. Filter by user and by time window — last 1, 7, 30, 90 days, or all-time. The view reads the raw AI usage ledger directly, so feature totals reconcile exactly with their per-user rows; no rounding, no double counting.
Why it matters: admins can answer two questions on the spot — *"which of my users is driving AI cost?"* and *"how real is each of the AI features we're paying for?"* Both pages are admin-only and recover work from two earlier chips that died mid-merge.
#2026-05-28-admin-ai-inventory-and-costTechnical details
41a264f5PR #935 — AI inventory + per-feature/per-user cost dashboard (recovery)
- NewReliabilityAdmin
Live system status at /status
A public status page with component health, 90-day uptime, an active and historical incident log, and email + RSS subscriptions — plus an admin console for posting and managing incidents.
Public /status
The new
/statuspage shows, for everyone, with no sign-in required:- An overall status banner — operational, degraded, or major outage.
- Seven component health rows (API, Web app, Auth, Marketing engine, Sequence engine, Webhooks, Background workers), each with a 90-day uptime sparkline.
- A live list of active incidents and the rolling 90-day incident history.
- A one-field email subscription, plus an RSS feed for IT or status-monitoring tools.
A background health probe runs every minute, records a row per component, and feeds the sparklines without sitting on a shared web connection.
Admin /admin/status
Pact admins and owners get an incident-management console at
/admin/status:- Report a new incident — name, impact, affected components, opening update.
- Post updates as the incident progresses; mark it resolved when it's over.
- Every mutation writes an audit log entry, and the page is gated by the same role checks the rest of
/adminuses.
Why it matters: customers can stop pinging support to ask "is it just me?" — they can see the truth on
/status. And the next incident gets a clean public timeline instead of a Slack thread no one outside Pact can read.#2026-05-28-status-pageTechnical details
96844146PR #934 — /status + /admin/status — recover from chip crash, ship for real
- NewAPIDocsUX
Unified API reference at /api-reference
Three scattered API doc surfaces collapsed into a single in-app page that auto-detects your highest accessible tier and lets you flip between Public, Authenticated, and Pact staff specs.
One place for the API surface
We had three different ways to browse the API — anonymous
/docs/api, an authenticated/devpage with a staff toggle, and a staff-only/internal-docs/api. Customers had no idea which was which.The new `/api-reference` page lives inside the signed-in shell, replaces all three, and:
- Detects the highest tier your role is cleared for from your session and renders that by default.
- Shows a pill toggle for Public / Authenticated / Pact staff. Pills you can't access stay visible but disabled, with a lock icon and a tooltip explaining what would unlock them — so customers can see that a higher tier exists without being able to peek.
- Honors a
?tier=URL parameter for deep-linking, silently clamped to what your role is allowed to see. - Is wired into the existing Developer nav group: API Reference, API keys, Webhooks.
The old
/devand/internal-docspaths now redirect to the unified surface. The authoritative gate is still server-side: even if someone fabricates the tier param, the OpenAPI proxy returns 401/403 unless the caller is actually cleared for that tier.Why it matters: discoverability. The API reference is now reachable from the in-app sidebar like every other Pact surface, and it always opens at the right depth of detail for who's looking at it.
#2026-05-28-unified-api-referenceTechnical details
73d41a82PR #933 — unified /api-reference with auto-tier + nav entry + sunset /dev and /internal-docs
- FixedAuthMarketingMobile
Sign in works correctly on every phone
Two mobile sign-in problems closed: the /login form now centers properly on iPhone and Android, and the Sign in button on the marketing landing is now visible and tap-friendly inside the iOS PWA.
/login: actually centered now
The sign-in form used
min-h-screen(which resolves to100vh) for vertical centering. On mobile,100vhis the height with the address bar hidden — so when the URL bar is showing, a "centered" card sits noticeably below the visible middle of the screen, and its bottom can clip off-screen. Swapped to100dvh(dynamic viewport height), which tracks the current visible viewport and re-centers as the URL bar shows or hides. Verified on a Pixel 7 (Chromium) and an iPhone 14 Pro (WebKit) emulator.Landing page: Sign in is now discoverable
In the installed iOS PWA, the marketing landing's "Sign in" was rendered as a faint ghost link, crammed against the system status icons because the header had no safe-area inset. Two changes:
- The header now respects the device's top safe area, so the logo and the Sign in button clear the notch and Dynamic Island.
- "Sign in" is now a solid primary button — high contrast, clearly tappable, harder to lose against the status bar.
Why it matters: if someone has the PWA installed and lands on the marketing page, getting back into the app is now an obvious one-tap action. And the sign-in form itself is correctly positioned the first time on every device profile we tested.
#2026-05-24-sign-in-on-every-phoneTechnical details
bd9b54e5PR #930 — /login form dead-centered on all mobile viewports512b71d5PR #931 — discoverable, safe-area-aware Sign in on the landing nav
- FixedMarketingReliability
Marketing surfaces no longer crash when there's nothing to show yet
Personalization and Send-time windows could throw a runtime error on fresh tenants when an honest empty response came back from the API. Both now render the empty state cleanly.
What was happening
When a tenant didn't yet have enough sends or audience signal, the API correctly returned an empty body — and two shared layout components, the module-permissions provider and the "viewing as" header, tried to read array properties off that empty object. The exception bubbled into a render crash that looked like an outage on the Personalize and Send-time windows surfaces.
What changed
Both components now treat an empty payload as "no data yet" instead of dereferencing into it. The genuinely empty states the marketing surfaces already shipped (
No audience yet,Add more sends before we can recommend a window) now render cleanly instead of being masked by a runtime error.Why it matters: new tenants and any segment lacking signal will see the intended empty state from now on, not a blank screen. Existing tenants with data are unaffected.
#2026-05-24-empty-data-crash-fixTechnical details
8f882fd4PR #925 — empty-data crash cascade in ModuleProvider + ViewingAsHeader
- NewAIUX
Powered by Claude badges across AI surfaces
Every AI feature now wears a small honesty label so you can tell at a glance whether it's calling Claude live, blending Claude with a rule-based fallback, or not yet AI-backed.
You should know what's actually AI
Three label variants, driven by a single feature registry on the backend:
- Powered by Claude (green) — always calls Claude; errors loudly if the model isn't configured.
- Hybrid: Claude + rules (blue) — calls Claude when configured, falls back to rule-based logic otherwise.
- Not yet AI (red) — surfaces marketed as AI that don't yet make a model call. We're calling that out as honesty debt instead of hiding it.
Each badge has a tooltip with the provider and endpoint, plus a link to "How AI works in Pact" for the longer explanation.
Why it matters: when a screen says "AI", you can now confirm — without reading a docs page — whether that's a real model call or a smart-looking heuristic. No AI feature can over-claim how real it is, because the badge is generated from the same registry the backend uses to enforce live model calls.
#2026-05-24-ai-honesty-badgesTechnical details
d834c2dePR #923 — Powered by Claude / Hybrid badges across AI surfaces
- FixedDocsAPI
API reference now renders reliably on every visit
Two separate bugs were leaving the API reference panel blank — once on first load, once after navigating inside the app. Both are fixed and proved out under the strict Content Security Policy.
Two blank-panel bugs, one solved surface
The
/docs/apireference is rendered by Redoc inside a CSP-strict iframe. Two bugs were making it disappear:1. Cross-origin spec fetch. The page tried to load its OpenAPI spec from
app.pact.placewhile sitting onwww.pact.place. The strictconnect-src 'self'blocked the request and Redoc rendered an empty pane.2. Stale Content Security Policy nonce on client-side navigation. When you reached
/docs/apivia an in-app link (rather than a hard refresh), the iframe inherited a CSP nonce minted at the parent's original load — different from the one stamped on the freshly rendered Redoc script. The script was blocked and the panel went blank until you hit refresh.What changed
- The OpenAPI spec is now proxied same-origin from
/api/openapi-public, so the fetch is matched byconnect-src 'self'and triggers no CORS preflight. - The Redoc iframe now lives at
/docs/api/redoc, a dedicated route that mints a fresh per-request nonce on every load — hard refresh and SPA navigation alike.
Why it matters: the API reference is now load-stable. You can click into it from the docs sidebar, refresh, or open it cold from a bookmark — it renders every time, no white pages.
#2026-05-24-docs-api-stable-renderTechnical details
6869e85bPR #922 — serve the OpenAPI spec same-origind74e3793PR #929 — fix stale CSP nonce on client-side nav
- The OpenAPI spec is now proxied same-origin from
- NewSecurityAPIDocsSecurity
Three-tier API documentation: Public, Authenticated, and Pact staff
The API reference and developer docs are now split into three audience-scoped tiers, so signed-out visitors only see the public surface while customers and Pact staff each see exactly what they're cleared for.
Why this matters
Until this week, the auto-generated FastAPI spec was served anonymously and exposed every internal route — admin, impersonation, replay-cost — alongside the genuinely public endpoints. The MDX guides on
/docshad the same problem: a single sidebar listed staff-only Self-hosting pages next to the public quickstart.This release closes that gap end to end. Every API route and every docs page is now classified into one of three tiers:
- Public — what anyone on the internet can see.
- Authenticated — what a signed-in customer of your tier sees.
- Pact staff — internal surfaces, only visible to Pact employees.
What you'll notice
- The full
/openapi.jsonand/docs//redocendpoints on the API origin are gone. Three filtered specs replace them:/api/openapi-public,/api/openapi-authenticated,/api/openapi-staff. /docsonly renders public articles to anonymous visitors. Signing in unlocks the authenticated tier; staff additionally see the Administration section.- Search is tier-aware — anonymous search never returns titles or excerpts from gated pages.
- A CI guard blocks any PR that would publish a staff or authenticated MDX snippet through a public surface.
For customers building integrations: if a route disappeared from your reference, it was never meant to be public. Use the in-app API Reference (
/api-reference) to see the routes your role actually has access to.#2026-05-24-tier-aware-api-docsTechnical details
740ce1a6PR #920 — close anonymous full-OpenAPI leak + strip pact-dev CLI pageba604478PR #924 — per-route visibility tags + 3 tier-aware OpenAPI specs4cc98042PR #926 — tier-routed MDX content + tier-aware search + CI leak guard
- ImprovedMarketingAI
Personalization and send-time windows now run on real AI
The Personalization and Send-time windows surfaces now generate every recommendation with live AI — and show an honest empty state instead of placeholder copy when there isn't enough signal yet.
Real AI, or nothing
Two marketing surfaces used to show stand-in content: Personalization was a "ships next" placeholder, and Send-time windows quietly fell back to a hardcoded "9:30–11am Tue/Wed/Thu" when a segment didn't have much send history. Both are now wired to the same production AI optimizers the rest of Pact uses.
Personalization
Enter a base subject line and Claude rewrites it for each audience segment's dominant role and industry — the exact optimizer that already runs inside journeys. Each suggestion is generated live, and segments that don't change are clearly marked "No change" rather than padded with invented variants.
Send-time windows
Every segment is now routed through the real send-time optimizer (engagement history → tenant default → AI inference). Recommendations are labeled Engagement-backed or AI-inferred so you can see where each window came from. Applying a window rewrites the hour-of-day on every scheduled campaign for that segment.
Honest empty states
When a segment lacks the signal to ground a recommendation — no audience yet, or fewer than 100 delivered emails — you'll see a clear "add more data" prompt instead of a confident-looking number that isn't real.
Why it matters: you can trust what these screens tell you. Every subject line and send-time window is now produced by the same AI that powers the rest of your workspace, and when the data isn't there yet, Pact says so plainly instead of guessing.
#2026-05-23-real-ai-marketingTechnical details
6734650aPR #910 — wire personalize + send-time surfaces to real AIClient
- FixedMobilePWA
Cleaner top bars on iPhone and Android
Fixed two opposite mobile glitches: the status bar overlapping the menu on iPhone, and a white gap above the icon bar on Android.
One fix, two symptoms
The top navigation bar handled the device "safe area" (the strip behind the notch, Dynamic Island, and status bar) inconsistently across layouts. That produced two opposite problems on phones:
- On iPhone, the docs header sat *under* the status bar, so the "Menu" label was partly hidden behind the clock.
- On Android, the installed app reserved iOS-only spacing it never needed, leaving a large white gutter above the icon bar.
Both are now resolved with a single rule applied to every sticky top bar — the in-app bar and the docs header alike. The safe-area reservation only kicks in on Apple touch devices that actually need it, so iPhone and iPad PWAs get the right padding while Android and desktop are left untouched.
Why it matters: if you use Pact installed to your home screen, the top bar now lines up correctly on every device — nothing clipped behind the status bar on iOS, no wasted space on Android.
#2026-05-23-mobile-safe-areaTechnical details
bb7dbd8fPR #909 — unified iOS safe-area handling (Android leak + iOS docs underlap)71d6b343PR #908 — Android top-padding regression (iOS safe-area gate leaked)
- New
White-label branding for agency tenants
Agency plan tenants can now replace the Pact logo, app name, and sender domain with their own brand across all client-facing surfaces.
#2026-05-22-white-labelWhite-label branding
Agency tenants on the Agency plan can now configure a fully custom brand identity applied across all client-facing surfaces.
Configurable in Settings → Brand:
- App name shown in the browser tab and email footers
- Primary logo (SVG or PNG, shown in the top bar and sidebar)
- Favicon
- Custom sender domain for outbound sequences (requires DNS verification)
- Accent color for the UI
Branding changes take effect immediately for all sub-tenants managed under your agency account.
Contact your account manager to enable the Agency plan.
- New
AI agents for research and draft generation
Click the sparkle icon in the top bar to ask AI to research an account, draft a follow-up email, or summarize a contact's history.
#2026-05-22-ai-agentsAI agents
The Ask AI panel (⌘K → "Ask AI", or the ✨ button in the top bar) now supports agentic tasks that go beyond simple Q&A.
Try asking:
- *"Research Acme Corp and summarize their recent news"* — pulls public data and returns a brief
- *"Draft a follow-up email for my last call with Jordan Smith"* — uses call notes and contact history
- *"Which accounts in my book are most likely to churn?"* — scores your pipeline using engagement signals
How it works:
Agents run in the background and stream results token by token. You can keep working while they run. Results are copied to the clipboard or inserted into the editor.
All agent activity is logged in Activity → AI for audit purposes.
- New
Bulk operations for accounts and contacts
Select multiple records in any list view and apply tags, add to sequences, update fields, or export in one step.
#2026-05-22-bulk-opsBulk operations
List views now support row-level multi-select. Use the checkbox in the table header to select all visible rows, or click individual rows to build a selection.
Available bulk actions:
- Tag — apply one or more tags to all selected records
- Add to sequence — enroll the selection into any active sequence
- Update field — set owner, status, lifecycle stage, or any custom field
- Export — download as CSV in the background; a toast links to the file when ready
- Delete — moves records to the trash (restoreable for 30 days)
Actions run server-side in batches of 100. A progress banner keeps you updated.
- New
Public REST API with API key authentication
Generate API keys from Settings → Integrations to access your Pact data from any external tool or automation.
#2026-05-22-public-apiPublic REST API
Your Pact account now has a stable public REST API, secured with per-tenant API keys.
Get started:
1. Go to Settings → Integrations → API Keys
2. Generate a key and store it securely (shown only once)
3. Pass
Authorization: Bearer <key>on every requestFull reference docs at
/docs/api. The same OpenAPI spec powers the built-in API explorer.What's available
- Accounts and contacts — read, create, patch
- Sequences — list, trigger, pause
- Segments and tags — read
- Webhook events for real-time push
Rate limit: 1 000 req/min per key. Raise limits from the API Keys page.
- New
Stripe Checkout, billing portal, and operator billing panel
Pact now ships a full Stripe billing flow: plan picker, Stripe-hosted checkout, Stripe Customer Portal redirect, and a real-time operator billing overview with MRR/ARR and a failed-payment queue.
#2026-05-22-stripe-checkoutWhat shipped
Plan picker & checkout (/billing/upgrade)
Choose from Starter, Pro, or Enterprise tiers. Clicking "Start Starter" or "Start Pro" opens a Stripe-hosted checkout session and returns you to the billing admin page on success. Enterprise routes to the sales team.
Stripe Customer Portal (/billing/portal)
Tenants can now update their card, download invoices, or cancel their subscription directly from the Pact billing admin page. Clicking "Manage billing" launches the Stripe Customer Portal in-tab.
Operator billing panel (/pact-admin/billing)
Pact staff get a live view of:
- Stripe mode — live / test / unconfigured / no-op
- MRR & ARR — summed from active + trialing subscriptions
- Subscription counts by status (active, trialing, past_due, canceled…)
- Failed-payment queue — tenants in past_due / grace_period / soft_lock with links to their tenant detail page
Anti-abuse guards
Tenants with a
hard_lockdunning state receive HTTP 402 on checkout. Attempting to start a second active subscription for the same plan returns HTTP 409.Go-live runbook
Full step-by-step instructions in
docs/ops/stripe-go-live.md. Set Stripe keys via Admin → Platform secrets — never viafly secrets set.