Integrations
Company enrichment
Firmographics — domain, employee range, HQ, description, LinkedIn — filled in on accounts from an external data provider. Off unless you turn it on, and administered through the API rather than a settings screen.
Two gates, both closed by default
Enrichment runs only when both are open, and they are independent:
Running it
Two admin endpoints: one enriches a single account, one sweeps the whole workspace. Both are asynchronous — they queue work and return, rather than blocking on a vendor.
Why a repeat run usually does nothing
Every call costs money, and the background tasks are at-least-once, so an account enriched within the last 30 days is skipped. That window is cost control rather than a cache: a month-old headcount bucket is still right. A lookup that finds nothing still stamps the account, so an unenrichable company does not get re-billed on every sweep. Forcing a refresh is a deliberate act — it clears the stamp.
What gets recorded as the source
An enriched account records a fixed, vendor-neutral label. The name of the provider that answered is never written to the record, never returned by the API and never shown to Marvin — it exists only in operational logs. Account documents are readable directly by the tenant, so redacting at the API boundary would not have been enough.
It survives a CRM sync
Enriched fields are carried across when the CRM mirror refreshes. Were they dropped there, the next sync would silently re-bill the entire account list.
OppFlow.ai docs · by Traversal · v0.1.32