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

# Data Normalization

> Data normalization helps you maintain clean, consistent contact data across your organization.

## Overview

Data normalization helps you maintain clean, consistent contact data across your organization. By mapping inconsistent source values (like "US", "United States", "USA", and "U.S.A.") to a single standardized target, you ensure reliable reporting, accurate audience segmentation, and effective personalization - without manual data cleanup.

<Info>
  **Key Concepts**

  * **Source field**: The contact field containing raw, inconsistent data (e.g., `country`).
  * **Output field**: The contact field where normalized values are written. This can be the same as the source field (overwrite), or a different field.
  * **Normalized value**: A clean, standardized value that one or more source values map to (e.g., "United States").
  * **Source value**: A raw value from your data that maps to a normalized value (e.g., "US", "USA", "U.S.A."). Source values are **case-insensitive.** "usa" and "USA" are treated as the same value. Click the **Tt** icon to view all case variants in your data.
  * **Unmapped values**: Source values that have not yet been assigned to any normalized value. Unmapped values are kept as-is, their original value is preserved unchanged
  * **Backfill**: Applying normalization to existing historical records, not just new incoming data.
</Info>

<AccordionGroup>
  <Accordion title="Navigating to Data Normalization">
    Click **Database** in the left sidebar, then select **Data Normalization**. The page has three tabs:

    * **Normalization Configurations:** Shows all fields with existing normalization configurations. Configurations that need review (new unmapped values detected) sort to the top with an indicator. Each row shows the field name, output field, unique value count, record count, status, and last updated time.
    * **Available Field:** Lists all contact string fields that can be normalized. Shows the field name, number of unique values, and number of populated records.
    * **Activity Log:** Chronological record of all normalization configuration changes. Filter by date range (30 days, 90 days).
  </Accordion>

  <Accordion title="Field Eligibility">
    Normalization is available for **contact fields only**. Within the contact entity, only **string fields** can be normalized.

    Certain default fields are restricted from normalization, including `email`, `id`, `first_name`, and `last_name`. Other default string fields like `company_name` and `title` are eligible.

    Navigate to **Database → Data Normalization → Available Fields** to see which fields are eligible. Fields that cannot be normalized display an explanation of why.

    <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/01.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=b97e25cdbc22f69e1e1eec254e0e7781" alt="Available Fields tab listing contact string fields eligible for normalization" width="3368" height="1960" data-path="images/database/data-normalization/01.png" />
  </Accordion>

  <Accordion title="Create a Normalization Configuration">
    <AccordionGroup>
      <Accordion title="Step 1: Mapping Guidance">
        1. Navigate to **Database → Data Normalization → Available Fields**.
        2. Click **Normalize** next to the field you want to configure.
        3. Configure how the AI-powered mapping engine should generate initial mappings. Both options below are optional, can be used independently or together, and the combined input must stay under 10,000 characters.

           * **Let AI decide:** Provide optional instructions to guide the AI (e.g., "Use 2 letter ISO codes for Country"). The AI analyzes your instructions alongside the existing source values and suggests groupings. If you don't provide instructions, the AI generates mappings based on patterns in your data.
           * **Use my own list:** Provide your own target normalized values by typing or pasting them directly, or by uploading a CSV file (max 3 MB). If the source field has a linked **Salesforce picklist**, the picklist values are automatically loaded as your target list. The AI then maps your source values to the values in your list.

           You can use both at the same time, for example, provide a list of target values and add instructions for how the AI should handle edge cases.

                   <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/02.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=73062dee250901f22cdce4140469d375" alt="Mapping Guidance step with Let AI decide instructions and Use my own list options" width="1998" height="741" data-path="images/database/data-normalization/02.png" />
        4. Click **Generate Mappings** to run the AI mapping.

        <Info>
          AI mapping is non-deterministic. If you are not happy with the initial results, go back, refine your prompt or list, and generate again.
        </Info>

        <Info>
          For fields with a large number of unique values, AI mapping may take longer to process. If you have a high-cardinality fields above 10,000 values, reach out to your Customer Success team, and they can help you plan the best approach and involve the Inflection team if needed.
        </Info>
      </Accordion>

      <Accordion title="Step 2: Mapping Configuration">
        After the AI generates mappings, review the results. The screen shows:

        * A table of **normalized values** (left column) with their **source values** (right column), each showing a record count
        * An **Unmapped Values** section at the bottom showing source values the AI could not confidently assign
        * A header showing total unique values, total records, and a count of values still to review

        #### Review and approve mappings

        Each normalized value group shows a count of values "to review". These are AI-generated mappings that you haven't yet confirmed. Click **Approve** on a group to confirm its mappings, or click **Approve All** in the header to approve every group at once.

        <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/03.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=a23432ee9793150c154841e3d8e124c8" alt="Mapping Configuration screen with normalized value groups and Approve buttons" width="1821" height="711" data-path="images/database/data-normalization/03.png" />

        #### Edit mappings

        * **Drag and drop:** Drag a single source value from one group to another, or from the unmapped section into a group.

                  <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/04.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=4a7c898d48990b337f4595780bc0cad4" alt="Dragging a source value between normalized value groups" width="3185" height="1661" data-path="images/database/data-normalization/04.png" />
        * **Bulk move from unmapped values:** Use the search bar in the **Unmapped Values** section to filter values (e.g., typing "was" shows all unmapped values containing "was"). A **"Move all (N) to..."** button appears with the count of matching results.

          Click it to see a searchable list of existing normalized value groups, then select a destination, all matching values move to that group at once.

                  <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/05.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=3c8ed5217347bda6e78c7a8e188f75d7" alt="Unmapped Values section with search filter and Move all button" width="3206" height="1834" data-path="images/database/data-normalization/05.png" />
        * **Bulk move within a normalized value group:** When a group has more than 3 source values, click **+N MORE** to open the **Source Values** drawer for that group. Use the search bar in the drawer to filter values, then click **"Move all (N) to..."** to select a different normalized value group or **Unmapped** as the destination.

                  <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/06.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=4e8142ed49b64ece4f055941d1833fd5" alt="Source Values drawer with search and bulk move options for a group" width="3264" height="1584" data-path="images/database/data-normalization/06.png" />
        * **Add a source value to a group:** Click **+ Add** next to any group's source values to manually type in a new source value.
        * **Add a new normalized value:** Use the "Add normalized value..." input at the top of the mapping table and click **+ Add** to create a new empty group, then drag or bulk-move values into it.
        * **View case variants**: Click the **Tt** icon next to a source value to see all the different case variations that exist in your data (e.g., "Google", "google", "GOOGLE"). Source values are still matched case-insensitively, you cannot map different casings to different buckets but this lets you see exactly what forms appear in your raw data.

                  <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/07.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=75070ef6d2474265eb1882399e5a7296" alt="Case variants popover showing all casings of a source value" width="3162" height="1818" data-path="images/database/data-normalization/07.png" />
        * **Remove a source value from a group:** Click the **X** on a source value tag to move it back to unmapped.
        * **Remove an entire group:** Click the **X** on the group row to move all its source values back to unmapped and delete the group.

        #### Handle unmapped values

        Before you can save, all unmapped values must be resolved. Values you don't want to assign to a specific normalized value are automatically **kept as-is** the original value is preserved unchanged in the output field. You can click **Approve** to confirm them in bulk.

        <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/08.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=2eca0cd019b2d973825c90c25e5ba76f" alt="Unmapped Values section with values kept as-is and an Approve button" width="3184" height="1290" data-path="images/database/data-normalization/08.png" />
      </Accordion>

      <Accordion title="Step 3: Settings">
        Configure the **output field** where normalized values are written:

        * **Overwrite original field:** Replace the source field values with normalized values. Note that this overwrites the raw data; if you want to preserve the original values, use one of the options below instead.
        * **Write to existing field:** Select a different contact field as the output.
        * **Create new field:** Create a new custom contact field directly from this screen. The field is created as a Contact Field in Inflection

                  <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/09.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=fcb043018110282680dd537893ab020d" alt="Settings step with output field options: overwrite, existing field, or create new field" width="2000" height="499" data-path="images/database/data-normalization/09.png" />

        <Info>
          If you want to preserve your raw data while also sending normalized values to an external system like Salesforce, consider writing to a separate output field. For example, you could keep the source field as read-only (to preserve raw values) and set the output field to two-way sync so normalized data flows to Salesforce.
        </Info>
      </Accordion>

      <Accordion title="Step 4: Review & Save">
        Review a summary of your configuration:

        * Total normalized values and source values
        * Output field selection
        * Count of Unmapped values kept as-is

        Click **Save & Apply**. You'll be asked how to apply the configuration:

        * **Apply going forward only:** Only normalize new incoming data. Existing records remain unchanged.
        * **Backfill historic values:** Apply normalization to all existing records. This runs in the background and may take some time. You'll see a "backfill started" entry in the Normalization Activity Log, and a "backfill completed" entry when it finishes.
      </Accordion>
    </AccordionGroup>
  </Accordion>

  <Accordion title="Manage Existing Configurations">
    <AccordionGroup>
      <Accordion title="Handle New Unmapped Values">
        When new source values appear in your data that don't match any existing mapping, they surface in the **Normalization Configurations** tab with an 'unmapped' status indicator showing the count of new unmapped values.

        <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/10.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=4d03cdfa56ffaec04811cd07bcc9907c" alt="Normalization Configurations tab with an unmapped status indicator on a configuration" width="3270" height="492" data-path="images/database/data-normalization/10.png" />

        To resolve them:

        1. Click on the configuration with unmapped values.
        2. Review the new unmapped values in the Mapping Configuration step.
        3. Drag them into existing groups, create new normalized values, bulk-move them, or keep them as-is.
        4. Save your changes.
      </Accordion>

      <Accordion title="Edit a Configuration">
        1. Navigate to **Database → Data Normalization → Normalization Configurations**.
        2. Click on the configuration you want to edit.
        3. The edit flow has three steps: **Mapping Configuration**, **Settings**, and **Review & Save** (the Mapping Guidance step is skipped since mappings already exist).
        4. Modify mappings as needed: add new normalized values, reassign source values, or approve new mappings.
        5. Click **Save & Apply** and choose your backfill preference.

        Existing approved mappings are preserved when you edit. Only new or changed mappings are applied.
      </Accordion>
    </AccordionGroup>
  </Accordion>

  <Accordion title="Normalization Activity Log">
    The **Normalization Activity Log** tab records all configuration-level changes:

    * **Configuration created:** Logged when a new normalization configuration is saved.
    * **Configuration updated:** Logged with the source and output field names and details of what changed.
    * **Backfill started:** Logged when a backfill process begins.
    * **Backfill completed:** Logged when the backfill process finishes.

    Each log entry includes:

    * **Timestamp** (date and time)
    * **Actor** (user name or "System" for automated changes)

    Filter logs by **date range** (30 days, 90 days, or custom) to find specific entries.
  </Accordion>

  <Accordion title="Contact Activity Log">
    When normalization modifies a contact's field value, either through real-time normalization of new data or through a backfill, an entry is recorded in that individual contact's **Activity Log**. This lets you trace exactly when and how a specific contact's data was changed by normalization.

    To view these entries, navigate to a contact's profile and open their Activity Log.

    <img src="https://mintcdn.com/inflection-4b2c0de4/0Fy2fPaKm7bhQlZX/images/database/data-normalization/11.png?fit=max&auto=format&n=0Fy2fPaKm7bhQlZX&q=85&s=430ad0fed5f39f236c65fc281b0698dd" alt="Contact Activity Log entries showing field value changes made by normalization" width="3402" height="1508" data-path="images/database/data-normalization/11.png" />
  </Accordion>

  <Accordion title="Best Practices">
    * **Start with high-impact fields:** Focus on fields used in reporting and segmentation first, like job title, company name, or industry.
    * **Leverage Salesforce picklists** for fields synced from Salesforce to keep both systems aligned.
    * **Review new unmapped values regularly:** New source values appear as your data grows. Periodic review ensures your normalization stays current.
    * **Iterate on your prompt:** AI mapping is non-deterministic. If the initial results aren't right, go back and refine your prompt or add more specific instructions, then regenerate.
    * **Preserve raw data when needed:** If you want to keep the original source values intact, write normalized values to a separate output field rather than overwriting the source field.
    * **Reach out for high-cardinality fields:** If your field has a very large number of unique values, contact your Customer Success team for guidance. They can involve the Inflection team to help plan the best approach.
  </Accordion>
</AccordionGroup>

## Frequently Asked Questions

<AccordionGroup>
  <Accordion title="Which fields can I normalize?">
    Only string fields on the Contact entity are eligible. Certain default fields like `email`, `id`, `first_name`, and `last_name` are restricted. Other default string fields like `company_name` and `title` can be normalized.
  </Accordion>

  <Accordion title="Are source values case-sensitive?">
    No. Source value matching is **case-insensitive** "United States", "united states", and "UNITED STATES" are all treated as the same source value. However, the casing of the normalized value you define is preserved exactly as you enter it. You can click the **Tt** icon next to any source value to see all the case variations that exist in your data.
  </Accordion>

  <Accordion title="Can I normalize a field to itself?">
    Yes. Select **Overwrite original field** in the Settings step. The raw value is replaced with the normalized value. Keep in mind this overwrites the original data.
  </Accordion>

  <Accordion title="Can two configurations share the same source field?">
    Yes. Two separate normalization configurations can use the same source field, as long as each has a different output field.
  </Accordion>

  <Accordion title="What happens if I try to move a normalized value into another group?">
    This creates a circular mapping and is not allowed. The system prevents you from moving a value that is already a normalized value for another group.
  </Accordion>

  <Accordion title="What is the maximum file size for CSV uploads?">
    CSV files used for list-based mapping are limited to **3 MB**.
  </Accordion>

  <Accordion title="What happens to existing data when I create a new configuration?">
    It depends on your choice at save time. If you select **Backfill historic values**, all existing records are updated asynchronously in the background. If you select **Apply going forward only**, existing records remain unchanged.
  </Accordion>

  <Accordion title="Can I undo normalization?">
    Configurations can be edited at any time. However, if you backfilled historical records and used the **Overwrite original field** option, the original raw values have been replaced. If you wrote to a **different output field**, your original source field data is untouched.
  </Accordion>

  <Accordion title="What if the AI mapping doesn't look right?">
    AI mapping is non-deterministic, running it again with the same prompt may produce different results. Go back to the Mapping Guidance step, refine your prompt or adjust your target value list, and click **Generate Mappings** again. You can iterate as many times as needed before saving.
  </Accordion>

  <Accordion title="Can I bulk-move unmapped values?">
    Yes. In the **Unmapped Values** section, use the search bar to filter values, then click **"Move all (N) to..."** to select a target normalized value group. All matching values move at once. You can also drag and drop individual values. For normalized value groups with more than 3 source values, click **+N MORE** to open the drawer, where the same search and bulk move functionality is available.
  </Accordion>

  <Accordion title="My field has a lot of unique values. What should I do?">
    For high-cardinality fields, AI mapping may take longer and require more manual review. Reach out to your Customer Success team, they can help you plan the best approach and involve the Inflection team if needed.
  </Accordion>

  <Accordion title="How quickly are new incoming values normalized?">
    New values matching an existing normalization configuration are normalized immediately upon ingestion.
  </Accordion>

  <Accordion title="Can other entities besides Contact be normalized?">
    Currently, normalization is available for the **Contact** entity only.
  </Accordion>

  <Accordion title="Can I add a source value to a group manually?">
    Yes. Click **+ Add** next to any group's source values to type in a value that may not be in the current dataset yet.
  </Accordion>

  <Accordion title="How do I know when a backfill is done?">
    Check the **Normalization Activity Log**. You'll see a "backfill started" entry when the process begins and a "backfill completed" entry when it finishes.
  </Accordion>

  <Accordion title="Where can I see normalization changes on a specific contact?">
    Individual contact-level normalization changes appear in that contact's **Activity Log** on their profile page, not in the Normalization Activity Log.
  </Accordion>
</AccordionGroup>
