8/24/2026 Release

This release introduces merchant locations — a new first-class sub-resource with full CRUD endpoints and three new location.* webhook events — alongside a redesigned portfolio dashboard that finally counts Underwriting and Rejected merchants, a Stripe destination for vault token exports, and a sweep of the merchant API reference that documents the validation rules every field actually enforces — plus fixes for stuck connection evaluations, hidden merchant tabs, and boarding validation gaps.

Jump to: New Features · Improvements · Bug Fixes


New Features

Merchant locations

A merchant can now carry multiple physical locations as their own records under the merchant, instead of everything hanging off the single merchant profile.

  • Full CRUD under the merchant. POST, GET (list and single), PATCH, and DELETE on /v1/merchants/{merchantId}/locations let you create, read, update, and remove locations. Each location carries a name, address, MCC, and phone, plus an optional bankingId pointing at one of the merchant's bank accounts.
  • List responses use the standard envelope. GET /v1/merchants/{merchantId}/locations returns { locations, hasMore, lastId } with lastId-based continuation — the same pagination shape as the rest of the API.
  • Validated banking references. A location's bankingId is checked against the merchant's real bank accounts on both create and update, so a location can never point at an account that doesn't exist. Removing a bank account automatically clears bankingId (to null) on any location that referenced it — your system decides what replaces it.
  • Location ids on the merchant record. GET /v1/merchants/{merchantId} and the merchant.* webhook payloads now include the merchant's locations id array and primaryLocationId, so you know which locations exist without a second call. Full location records still come from the location endpoints.
  • Explicit primary designation. PATCH /v1/merchants/{merchantId} accepts primaryLocationId to promote a location to primary in a single write, or null to clear it. A location referenced as primary can't be deleted until it's demoted, and nothing is ever auto-assigned — primary is always an explicit choice.

Location lifecycle webhooks

  • Three new subscribable events. location.created, location.updated, and location.deleted are now valid values on your webhook subscription, delivered over the same signed, retried pipeline as merchant and transaction webhooks.
  • Fired from every mutation path. Each location create, update, and delete emits its matching event, so your system stays in sync without polling.
  • Banking cleanup is observable. When a removed bank account clears a location's bankingId, a location.updated event fires per affected location carrying the post-cleanup record, so you see the change no matter which banking-removal path caused it.
  • Delivery attempts tagged as location. Location webhook deliveries are recorded with their own entity type, so they can be audited and troubleshot the same way as merchant, transaction, and form webhooks.

Redesigned portfolio dashboard

The dashboard landing page has been rebuilt full width on the Preczn design system.

  • Underwriting and Rejected merchants are now counted. The Merchant Connection Status table previously omitted these two statuses entirely, so those merchants appeared in no column and row totals didn't reconcile with portfolio totals. Both now have their own columns, and every merchant is accounted for.
  • Full-width tables, no hidden tabs. The portfolio widgets now span the page: the Portfolio Insight band shows both insights simultaneously instead of behind tabs, and the connection status and latest updated tables no longer scroll horizontally at half width.
  • Click a count to see the merchants. Non-zero status counts in the connection status table link straight to the merchant list pre-filtered to that connection and status.
  • Merchant Services charts on the design system. The enrichment, SAQ compliance, and token charts render as design-system cards with a responsive grid, so they stay readable at any window width.

Export vault tokens to Stripe

Stripe and Stripe Connect are now supported destinations for the third-party tokenization export pipeline. Card and ACH vault tokens are pushed into Stripe's vault as Customer-attached PaymentMethods — for Stripe Connect, objects are created directly on the merchant's connected account. Already-exported tokens are skipped, so re-running an export is safe.

Improvements

Merchant API

  • The API reference now documents what the API actually enforces. Field-level constraints — patterns, length limits, accepted values, formats, and ranges — are now derived directly from the validation rules the API runs, instead of being hand-maintained and drifting out of date. Alongside that, every merchant API request and response field received a reviewed description and realistic example, covering merchants, addresses, owners, banking, contacts, connections, webhooks, billing groups, attachments, forms, loans, plans, pagination, and error responses.
  • CardPointe Site URL self-corrects. Pasting a full URL (like https://fts-uat.cardconnect.com) as a CardPointe connection's Site URL now normalizes to the bare prefix on save, and already-stored full-URL values resolve to the correct API host at read time — so a pasted URL no longer fails at transaction time.

Dashboard

  • CardPointe Site URL is self-evident. Everywhere a CardPointe connection is configured, the Site URL field now renders the fixed https:// and .cardconnect.com parts around an editable prefix, so there's no guessing whether to enter a full URL or a prefix.
  • Transactions Export on the design system. The Transactions Export page has been restyled onto the new design system, with a merchant picker that no longer fetches every merchant on the platform, readable failure reasons, and access to exports older than the most recent 50.

Boarding form

  • Clearer document upload tips. The shared "common reasons documents are rejected" tips have been reordered to lead with what matters most, a redundant file-format line was removed, and over-strict wording was softened.

Bug Fixes

Dashboard

  • Transactions and Snapshot tabs no longer hidden for error-only merchants. Merchants whose transactions all ended in Error status had both tabs disabled — and direct links silently redirected — because the gate relied on a flag that error-status ingestion never set. The unreliable gate has been removed, so the tabs are always reachable.

Boarding form

  • Annual finance volume below Greensky's minimum. The Annual Finance Volume field now enforces Greensky's $1.00 API minimum, so a 0 — which previously passed the form and rejected the merchant's boarding request at Greensky — is caught in the form with a clear message.

Merchant API

  • Connections no longer stuck in "Evaluating" after a platform connection rollout. A background job that populates requirement templates could silently overwrite a connection's concurrent status update, reverting it to Evaluating with nothing to re-evaluate it — blocking onboarding for merchants caught in the window. The write is now safe against that race.
  • Merchant clone externalId transfer hardened. Cloning a merchant with its externalId previously wrote the id onto the clone without uniqueness validation and could leave the same id on both records if the transfer was interrupted. The transfer now validates uniqueness and no longer leaves duplicates behind.