> ## Documentation Index
> Fetch the complete documentation index at: https://gtmsdk.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Change: rb2b company industry now crosswalks onto the Attio industry select

> rb2b visits used to write their industry label verbatim onto the legacy industry text attribute; they now crosswalk onto the industry_select single-select (the canonical ai-3fs taxonomy), guarded and warned like the other enrichment selects. Revenue and headcount shapes are unchanged.

## Updates

**rb2b industry writes crosswalk onto `industry_select` (issue #905)**

\#805 mapped rb2b company firmographics onto whatever attribute already
existed, which put `industry` verbatim onto the legacy `industry` **text**
attribute. That attribute is what the crm-uploader ai-3fs migration is
retiring — the canonical industry taxonomy lives on the sibling
`industry_select` single-select seeded with the HubSpot enum, and the text
attribute already carries the Title-Case "pollution" class that migration
catalogued and dropped. rb2b's verbatim labels ("Software", "SaaS") joined
that pollution instead of the taxonomy.

rb2b labels now crosswalk onto their `industry_select` option
("Software" → `COMPUTER_SOFTWARE`) via a curated table in
`libs.attio.values.format_company_industry_select`. The mapping inherits the
gtm-cd0ix select-write guard by joining `_ENRICHMENT_SELECT_FIELDS`, so an
archived attribute (ai-e6e's documented failure mode for this very slug) or a
renamed option drops the write with an `attio_industry_field_unavailable` /
`attio_industry_option_unavailable` warning instead of 400ing the whole
upsert. A label with no crosswalk entry is dropped with an
`attio_industry_unmapped` warning — the raw value still lands in the
tracking-event `body` JSON. The dispatcher's `merge_only_if_empty` guard for
industry now reads `industry_select`, or it would silently no-op whenever
only the select was populated.

Three backstop mappings split onto the Title-Case LinkedIn-v2 options the
live list turned out to carry (verified active on dev + prod 2026-10-05,
resolving the review threads on #926): "professional services" now lands on
`Professional Services` instead of `MANAGEMENT_CONSULTING` (consultant
vocabulary stays on the enum title), and "manufacturing" / "engineering
services" land on `Manufacturing` / `Engineering Services` instead of the
V1 best-fit `MECHANICAL_OR_INDUSTRIAL_ENGINEERING`, which conflated
machinery makers with engineering-services firms.

Deliberately unchanged: `estimate_revenue` keeps its #805 lower-bound write
onto the `annualrevenue` currency — the alternative `estimated_arr_usd` band
select is an *Estimated ARR* field (semantic mismatch for a *revenue* value)
and drops off-band ranges like rb2b's `$5M - $20M`. `employee_count` keeps
its bucketed `employee_range` write. The verbatim-text formatter
(`format_company_industry`) is retired — it was absent from
`contracts/downstream_api.toml` and every consumer repo before removal.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.