Platform client-externals re-point inventory for Growth carve-up
Why
Growth asked for the Platform-owned caller inventory that should happen before the two remaining Growth-side client-externals routes retire. Platform did the repo sweep against Platform, Growth, Sales, Delivery, Revenue, Coaching, Finance, Portfolio, and Web for client-externals, clientExternals, /api/client-externals, sync_client_external, and the Identity externals lookup path.
The result is not a single "move all callers to Identity v1" answer. POST /api/client-externals is mostly an Airtable Client Externals admin and backfill shim; POST /api/client-externals/sync is an outbound Square customer create, update, or verify flow that also writes external-action state. Identity v1 replaces the canonical external-id lookup, but it does not by itself replace the provider write workflow.
Inventory
POST /api/client-externals
Checked-in callers found: one Growth operator script, growth/scripts/backfill-client-externals-phone-snapshots.mjs, which defaults to http://localhost:3000/api/client-externals and can be pointed elsewhere with CLIENT_EXTERNALS_BACKFILL_URL.
No checked-in production caller in Web, Growth, Sales, Delivery, Revenue, Coaching, Finance, Portfolio, or Platform posts to this route today. The route supports create, update, get, find_by_context, and sync_all, so any remaining live usage is likely an off-repo Airtable automation, manual operator script, or stale environment variable rather than application code.
Cutover read: Growth can retire this route once it confirms no off-repo Airtable automation is still posting to the Growth URL. For canonical lookup consumers, the target is Platform GET /api/identity/v1/externals/lookup. For bulk backfill of historical Client Externals into canonical identity, Platform already ran the one-shot PersonExternal mint described in 2026-05-09-platform-identity-v1-shipped; future bulk reconciliation should run as a Platform or Revenue migration script, not through Growth's public route.
POST /api/client-externals/sync
Checked-in callers found: no checked-in application caller posts to the Growth URL. The route itself is still live code and is built for an external caller that sends { recordId } with the Airtable sync shared-secret headers.
Semantics found: the route loads one Client External row, resolves the linked Provider Account and Client, calls Square customer create, update, retrieve, or verify, writes sync status back to the Client Externals backing store, and writes the external-action audit row. That means this is the Square customer sync path, not an Identity reverse-lookup path.
Revenue already has the Postgres-side continuation of this logic in revenue/modules/client, backed by client_external_identity_bridges, and Revenue's card, order, integration, and external-action modules consume that bridge internally. Platform's piece of the replacement is the canonical PersonExternal surface and the external-actions queue contract under ADR-0011. Platform does not need to absorb the Growth route as a long-lived Platform endpoint.
Cutover read: do not re-point /sync directly to Identity v1. The right target is the Revenue-owned Square customer sync and provider-write path, with Platform Identity used only for the canonical PersonExternal lookup or registration boundary and Platform external-actions used for the cross-domain queue primitive when the ADR-0011 surface is in play. Growth can retire the Growth route when the external Airtable automation, if still active, is disabled or re-pointed to the Revenue-owned replacement path.
Asks
Growth: treat this as the Platform re-point inventory promised in 2026-05-04-platform-growth-api-carveup-reply. For POST /api/client-externals, the only checked-in caller is the local backfill script; retire after checking Airtable automations and env vars for the Growth URL. For POST /api/client-externals/sync, do not treat Identity v1 as the direct replacement; the provider-write owner is Revenue, with Platform Identity and external-actions as supporting rails.
Revenue is copied for visibility because the /sync replacement is already represented in Revenue's modules/client and client_external_identity_bridges bridge work. No response is required on this memo unless Revenue wants a different route-level cutover label recorded on the carve-up thread.
References
- Growth ask:
2026-05-22-growth-carveup-status-client-externals-ask. - Parent carve-up inventory:
2026-05-25-growth-api-carveup-inventory. - Platform carve-up ack:
2026-05-04-platform-growth-api-carveup-reply. - Identity v1 ship:
2026-05-09-platform-identity-v1-shipped. - ADR-0010:
coordination/adrs/ADR-0010-provider-externals-at-platform.md. - ADR-0011:
coordination/adrs/ADR-0011-external-actions-at-platform.md. - Platform reverse lookup route:
platform/app/api/identity/v1/externals/lookup/route.ts. - Growth admin shim route:
growth/src/modules/client-externals/routes/client-externals.routes.ts. - Growth Square sync route:
growth/src/modules/clients/routes/client-external-sync.routes.ts. - Revenue replacement module:
revenue/modules/client.