---
id: JNY-CRM-ENT-004
title: Configure an affiliation type and use it on a contact
product_area: crm
module: entities
revision: 1
status: approved
product_intent: proposed
implementation_evidence: observed
source_sha:
  react-console: da63075876b2c5f4a6af07d457bb24ea8bf4c0c7
  services-crm: 7ea48a414c42eade10d60753b8bcc323b1dd726f
actor: ACT-CRM-003
goal: >-
  Define a relationship type and its shared-detail defaults, select it as the
  workspace default and retire it without altering existing affiliations.
capabilities:
  - CAP-CRM-ENT-017
  - CAP-CRM-ENT-018
  - CAP-CRM-ENT-009
  - CAP-CRM-ENT-006
screens:
  - '/console/{tenantId}/configuration/crm/types/affiliationTypes'
  - '/console/{tenantId}/configuration/crm/types/affiliationTypes/{id}/edit'
  - '/console/{tenantId}/crm/contacts/{id}/edit'
steps:
  - 'n': 1
    surface: '/console/{tenantId}/configuration/crm/types/affiliationTypes'
    action: >-
      Create Member Firm with a description and billing-address-to-work and
      main-phone-to-work defaults.
    capability: CAP-CRM-ENT-017
    expected: >-
      The configuration list contains the new type with its derived id and
      mappings.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
  - 'n': 2
    surface: '/console/{tenantId}/configuration/crm/types/affiliationTypes'
    action: Select Member Firm in the Default Affiliation Type setting.
    capability: CAP-CRM-ENT-017
    expected: The workspace stores Member Firm as its default.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
  - 'n': 3
    surface: updateContact
    action: >-
      Set a contact’s Organization through the API without specifying an
      affiliation type.
    capability: CAP-CRM-ENT-009
    expected: The resulting primary affiliation uses Member Firm.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
  - 'n': 4
    surface: '/console/{tenantId}/crm/contacts/{id}/edit'
    action: Open the new-affiliation type selector in the contact editor.
    capability: CAP-CRM-ENT-006
    expected: Member Firm is available with its Link When Added options.
    provenance: observed
    source: >-
      react-console:components/affiliations/affiliation-editor.tsx:Link When
      Added
  - 'n': 5
    surface: '/console/{tenantId}/configuration/crm/types/affiliationTypes/{id}/edit'
    action: Attempt to delete Member Firm while it is default and referenced.
    capability: CAP-CRM-ENT-017
    expected: The delete attempt is rejected.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
  - 'n': 6
    surface: '/console/{tenantId}/configuration/crm/types/affiliationTypes'
    action: Reset the workspace default and deactivate Member Firm.
    capability: CAP-CRM-ENT-017
    expected: 'Existing affiliations retain the type, while new selections exclude it.'
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
alternates:
  - from_step: 1
    condition: The administrator works on the contact-role catalogue instead.
    path: 'Create, describe, reorder and deactivate a role.'
    outcome: Its ordered choice is available until deactivated.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0197.spec.ts#CRM-ACC-0197
  - from_step: 6
    condition: A selected contact type is deactivated before creation completes.
    path: The contact still saves with that type.
    outcome: The next chooser visit excludes the inactive choice.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0065.spec.ts#CRM-ACC-0065
failures:
  - from_step: 2
    condition: A standard user attempts to change the default affiliation type.
    path: The request lacks set-default authority and is rejected.
    outcome: The prior default remains selected.
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
      a caller who may only read affiliation types the change of the default
      (403)
  - from_step: 1
    condition: Two mappings target the same destination type.
    path: Validation identifies the duplicate destination and rejects saving.
    outcome: No new affiliation type is created.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0200.spec.ts#CRM-ACC-0200
rules_in_play:
  - BR-CAP-CRM-ENT-017-01
  - BR-CAP-CRM-ENT-017-02
  - BR-CAP-CRM-ENT-017-05
  - BR-CAP-CRM-ENT-017-06
  - BR-CAP-CRM-ENT-017-07
  - BR-CAP-CRM-ENT-009-11
  - BR-CAP-CRM-ENT-006-11
  - BR-CAP-CRM-ENT-018-08
assertions:
  - id: AS-JNY-CRM-ENT-004-01
    statement: >-
      The Organization command uses the workspace’s configured default
      affiliation type.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
  - id: AS-JNY-CRM-ENT-004-02
    statement: A default or referenced affiliation type resists deletion.
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses
      the delete of the type that is the default (409)
  - id: AS-JNY-CRM-ENT-004-03
    statement: Deactivation preserves existing affiliations of that type.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199
e2e_policy: required
e2e_reason: >-
  Browser proof checks configuration controls and the contact editor’s use of
  their choices.
feature: FEAT-CRM-ENT-06
evidence:
  - >-
    `react-console` at `da63075876b2c5f4a6af07d457bb24ea8bf4c0c7`: examined
    `acceptance/crm/journeys/affiliations/CRM-ACC-0197.json`, `CRM-ACC-0199.json`,
    `CRM-ACC-0200.json`, `acceptance/crm/journeys/contacts/CRM-ACC-0065.json` and their Playwright
    specs; `lib/routes/__tests__/routes.test.ts` (configuration routes).
  - >-
    `services-crm` at `7ea48a414c42eade10d60753b8bcc323b1dd726f`: examined
    `modules/entities/tests/e2e/affiliation-types.e2e.spec.js`.
approved_by: Andrew
approved_at: 2026-10-22
narrative:
  status: verified
  review: NARRATIVE-REVIEW-2026-10-23
narrative_sources:
  - section: Story
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199;
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0197.spec.ts#CRM-ACC-0197;
      react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0065.spec.ts#CRM-ACC-0065;
      services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses a caller who may
      only read affiliation types the change of the default (403);
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0200.spec.ts#CRM-ACC-0200
  - section: Story
    provenance: observed
    source: 'react-console:components/affiliations/affiliation-editor.tsx:Link When Added'
  - section: What Is True Afterwards
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0199.spec.ts#CRM-ACC-0199;
      services-crm:modules/entities/tests/e2e/affiliation-types.e2e.spec.js#refuses the delete of
      the type that is the default (409)
proved_by: []
---

# Configure an affiliation type and use it on a contact

## Story

A CRM Administrator introduces Member Firm as a new kind of affiliation for the association. She supplies its description and default mappings from the firm's billing address and main phone to the person's work details, then chooses it as the workspace default. The catalogue now offers that relationship vocabulary for later contact work.

A subsequent Organization command on a contact omits an explicit affiliation type and uses Member Firm. The administrator checks the contact editor's new-affiliation selector and Link When Added choices, connecting configuration to the staff experience rather than stopping at catalogue creation.

She also tests retirement. Deletion is refused while the type is selected as default or referenced by affiliations. Resetting the default and deactivating Member Firm preserves existing ties while removing it from new selection. Configuration changes govern later use without retroactively replacing existing people's relationship meaning.

Duplicate destination mappings refuse creation because they would compete for one contact slot. A caller without set-default authority cannot change the workspace default. The frontmatter also includes catalogue-administration variants for contact roles and for a contact type deactivated after selection; these illustrate related retirement behavior, but they are distinct from configuring the Member Firm relationship itself.

For Ruth Kim at Harbor Engineering, the administrator checks the later Organization command's result rather than assuming the configuration list proves contact behavior. The saved affiliation uses Member Firm, and the configured work-detail sources remain associated with that tie. If she later retires Member Firm, Ruth's retained relationship explains its earlier meaning. A fresh selector and an existing affiliation therefore provide two different checks of the retirement outcome.

## What Is True Afterwards

The Organization command uses the configured workspace relationship type when it needs a default, and the contact editor exposes the applicable sharing choices. After retirement, existing affiliations keep their type and new choices exclude it. Default and reference checks prevent deletion from removing meaning still in use. The administrator has changed future selection without claiming a rewrite of prior affiliations or complete proof of every saved-query path.
