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

# Error codes

> A reference of all Hightouch error codes, what they mean, and how to resolve them.

When something fails in Hightouch, the platform assigns an error code that identifies the cause. This page is a complete reference of all Hightouch error codes, organized by where they originate.

Some error codes include troubleshooting links directly in the Hightouch UI. If you don't see a link for your error, use this page to find the code and follow the resolution steps.

> [!NOTE]
>
> Don't see your error code? This page covers Hightouch platform error codes only. Hightouch passes error messages from third-party APIs directly, so if you see a vendor error (like a `400` or `409`), check the [destination's docs page](https://docs.hightouch.com/destinations/overview.md) under **Tips and troubleshooting** or use the [live debugger](https://docs.hightouch.com/syncs/debugger.md) to inspect the full response.
>
> If your error still isn't covered anywhere, use the **Send feedback** button on this page to let us know and we'll add it.

## Sync request errors

These errors occur during sync planning, before Hightouch sends any data to the destination. They typically indicate a problem with your model, primary key, or warehouse configuration.

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `DUPLICATE_COLUMNS_DETECTED` | Your model query returns duplicate column names. | Alias columns in your model SQL so every selected field has a unique name. |
| `NON_UNIQUE_PRIMARY_KEY` | The selected primary key contains duplicate values. | Update your model so each row has a unique identifier. If you're using a SQL model, add a `DISTINCT` clause or `GROUP BY` on the key column. |
| `UNSUPPORTED_PRIMARY_KEY_TYPE` | The primary key's data type isn't supported for this sync path. | Cast the primary key to a supported type (typically `VARCHAR` or `INTEGER`) in your model SQL. |
| `QUERY_COLUMN_MISSING` | A column referenced in your sync configuration no longer exists in the model query results. | Refresh the model schema in Hightouch and update your [field mappings](https://docs.hightouch.com/syncs/mapping-data.md) to use valid columns. |
| `WAREHOUSE_TABLE_MISSING` | A warehouse table required for sync planning doesn't exist. | Confirm the table still exists in your warehouse and that the model points to the correct schema and table name. |
| `PREVIOUS_SYNC_RUN_OBJECT_MISSING` | Stored objects from the previous sync run are missing, usually because cached plan data expired. | Retry the sync. If it persists, trigger a [full resync](https://docs.hightouch.com/syncs/overview.md#resync-full-query) to rebuild sync state. |
| `REMOVE_PLAN_INCOMPLETE` | Backfill or removal planning couldn't complete during a planner transition. | Retry the sync after a few minutes. If it continues, [contact support](#pylon-chat). |
| `REMOVE_RETRY_CHANGED_COLUMN_TYPES` | Rejected-row removal retries are unsafe because model column types changed between runs. | Refresh your model schema and trigger a [full resync](https://docs.hightouch.com/syncs/overview.md#resync-full-query) from a consistent state. |
| `SORT_RAN_OUT_OF_DISK_SPACE` | Sorting rows exhausted available disk space. | Narrow the model to reduce row volume, or [contact support](#pylon-chat) for infrastructure help. |
| `UNSPECIFIED` | Hightouch couldn't classify the failure into a more specific code. | Use the [live debugger](https://docs.hightouch.com/syncs/debugger.md) and [warehouse sync logs](https://docs.hightouch.com/syncs/warehouse-sync-logs.md) to identify the root cause. |

## Destination errors

### Generic destination errors

These errors can occur with any destination. They indicate a problem with authentication, rate limits, or the destination's availability.

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `DESTINATION_INVALID_GRANT` | The destination's authorization grant expired or was revoked. | Reconnect the destination in Hightouch to refresh authorization. |
| `DESTINATION_INVALID_CREDENTIALS` | The destination credentials are invalid. | Verify the username, password, token, or secret configured for the destination. Reconnect if needed. |
| `DESTINATION_INVALID_API_KEY` | The API key is invalid or expired. | Replace it with a current key that has the required permissions. |
| `DESTINATION_DEFINITION_NOT_FOUND` | Hightouch couldn't load the destination type definition. | Confirm you're using a supported destination type. If the connector appears broken, [contact support](#pylon-chat). |
| `DESTINATION_INTERNAL_ERROR` | The destination returned a generic internal failure or timed out. | Retry the sync. If it continues, check the destination's status page for outages, or [contact support](#pylon-chat). |
| `DESTINATION_RATE_LIMIT` | The destination rate-limited the sync. | Wait for the rate limit window to reset, then retry. To prevent recurrence, reduce [sync frequency](https://docs.hightouch.com/syncs/schedule-sync-ui.md) or batch volume. |
| `DESTINATION_MISSING_AD_ACCOUNT` | A required ad account is missing from the destination configuration or inaccessible. | Re-check the destination setup and confirm your account has access to the selected ad account. |
| `DESTINATION_PAYLOAD_TOO_LARGE` | The destination rejected the payload as too large. | Reduce batch size in your sync configuration, or trim the number of mapped fields. |

### Salesforce

For additional Salesforce-specific errors returned by the Salesforce API, see [Salesforce: Tips and troubleshooting](https://docs.hightouch.com/destinations/salesforce.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `SALESFORCE_INACTIVE_USER` | The Salesforce integration user is inactive. | Reconnect the destination with an active Salesforce user. |
| `SALESFORCE_EXPIRED_TOKEN` | The Salesforce access token expired. | [Reauthorize the destination](https://docs.hightouch.com/destinations/salesforce.md#connect-to-salesforce) in Hightouch. |
| `SALESFORCE_INACTIVE_ORG` | The Salesforce org is inactive or inaccessible. | Confirm the org is active and the integration user can log in. |
| `SALESFORCE_RESOURCE_DOES_NOT_EXIST` | A referenced Salesforce object, field, or record doesn't exist. | Check the object name, field name, or record ID in your sync configuration. |
| `SALESFORCE_AUTH_FAILURE` | Salesforce authentication failed. | Re-check credentials, connected app settings, and any IP or login restrictions in Salesforce. |
| `SALESFORCE_REQUESTS_LIMIT_EXCEEDED` | Salesforce API limits were exceeded. | Wait for the limit to reset, or reduce sync frequency and concurrency. See [Salesforce API limits](https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm). |
| `SALESFORCE_NETWORK_DIFFICULTY` | A network or transport failure prevented the Salesforce request from completing. | Retry the sync and check for temporary Salesforce outages on [Salesforce Status](https://status.salesforce.com/). |
| `SALESFORCE_MAX_CALL_STACK` | Salesforce hit a recursion or call-stack limit during processing. | Review Apex triggers, flows, and automation rules that may be recursively updating records during the sync. See [Salesforce: UNABLE\_TO\_LOCK\_ROW](https://docs.hightouch.com/destinations/salesforce.md#unable_to_lock_row) for related guidance. |
| `SALESFORCE_UNABLE_TO_LOCK_ROW` | Salesforce row locking prevented the write because another process is modifying the same record. | Retry later, reduce concurrent updates, or lower your [parallelization setting](https://docs.hightouch.com/destinations/salesforce.md#batching-and-parallelization). See [Salesforce: UNABLE\_TO\_LOCK\_ROW](https://docs.hightouch.com/destinations/salesforce.md#unable_to_lock_row) for detailed steps. |

### Salesforce Marketing Cloud (SFMC)

For additional SFMC-specific errors, see [SFMC: Tips and troubleshooting](https://docs.hightouch.com/destinations/sfmc.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `SFMC_DATA_EXTENSION_ADD_UPDATE_ONLY` | This SFMC sync path only supports add and update operations. | Change the sync mode or target a Data Extension that supports the requested operation. |
| `SFMC_IMPORT_FAILED_NO_RECORDS` | The SFMC import failed because no records were present in the batch. | Confirm that the source model returned rows for this sync run. |
| `SFMC_INVALID_CLIENT_SECRET` | The installed package's client secret expired or is invalid, so SFMC rejected authentication. [Client secrets expire 180 days after they're generated](https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/rotate-oauth2-secret.html). | Rotate the client secret in SFMC and update the destination configuration. See [SFMC: Client secret rotation](https://docs.hightouch.com/destinations/sfmc.md#client-secret-rotation). |

### HubSpot

For additional HubSpot-specific errors, see [HubSpot: Tips and troubleshooting](https://docs.hightouch.com/destinations/hubspot.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `HUBSPOT_RATE_LIMIT_DAILY` | HubSpot's daily API limit was reached. | Wait for the daily limit to reset (typically midnight ET). To prevent recurrence, reduce sync frequency or volume. See [HubSpot API usage guidelines](https://developers.hubspot.com/docs/api/usage-details). |
| `HUBSPOT_RATE_LIMIT_TEN_SECONDLY` | HubSpot's rolling 10-second rate limit was reached. | Hightouch automatically retries these. If the error persists across runs, reduce concurrent syncs to HubSpot. |
| `HUBSPOT_RATE_LIMIT_SECONDLY` | HubSpot's per-second rate limit was reached. | Hightouch automatically retries these. Reduce burst volume if the error recurs. |
| `HUBSPOT_INVALID_REFRESH_TOKEN` | The HubSpot OAuth refresh token is invalid or expired. | Reconnect the HubSpot destination in Hightouch to generate a new token. |
| `HUBSPOT_SYNC_ERROR` | HubSpot returned a generic sync error. | Retry the sync. If it continues, check HubSpot-side logs and object validation rules. |
| `HUBSPOT_CONNECTION_ERROR` | A connection failure prevented the HubSpot request from completing. | Retry and check for temporary HubSpot outages on [HubSpot Status](https://www.hubspotstatusupdates.com/). |
| `HUBSPOT_CONTACT_ALREADY_EXISTS` | A contact with this email already exists in HubSpot. | Review your record matching configuration. HubSpot uses email as the primary unique identifier. See [HubSpot: 409 - Contact already exists](https://docs.hightouch.com/destinations/hubspot.md#409---contact-already-exists) for detailed steps. |
| `HUBSPOT_CLOUDFLARE_BLOCKED_IP` | HubSpot's Cloudflare proxy blocked the request IP. | If you use [Hightouch's static IPs](https://docs.hightouch.com/security/networking#ip-addresses), confirm they aren't blocked by your HubSpot account's network settings. Contact HubSpot support if needed. |

### Google Ads

For additional Google Ads-specific errors, see [Google Ads: Tips and troubleshooting](https://docs.hightouch.com/destinations/google.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `GOOGLE_ADS_INTERNAL_SERVER_ERROR` | Google Ads returned an internal server error. | Retry the sync after a short delay. Check [Google Ads Status](https://ads.google.com/status/publisher/) for outages. |
| `GOOGLE_ADS_USER_LIST_NOT_FOUND` | The target Google Ads audience doesn't exist. | Confirm the audience still exists in Google Ads and the connected account has access. |
| `GOOGLE_ADS_UNAUTHORIZED` | Google Ads rejected the request due to missing permissions or invalid authorization. | Reauthorize the destination and confirm the connected account has the required access level. |
| `GOOGLE_ADS_USER_LIST_NAME_ALREADY_IN_USE` | An audience with this name already exists in Google Ads. | Use a unique audience name, or connect the sync to the existing audience. |
| `GOOGLE_ADS_CONCURRENT_MODIFICATION` | Google Ads rejected the update because another change is still processing. | Wait a few minutes and retry. Avoid running multiple syncs to the same audience simultaneously. |
| `GOOGLE_ADS_STORE_SALES_DIRECT_DATA_NOT_ALLOWED` | Store sales direct data isn't enabled for this Google Ads account. | Confirm account eligibility and enable the feature in Google Ads. See [Google Ads Store Sales requirements](https://support.google.com/google-ads/answer/7620302). |
| `GOOGLE_ADS_GENERIC_INVALID_ARGUMENT` | Google Ads rejected the request as invalid. | Review required fields, identifiers, and mapped values. Use the [live debugger](https://docs.hightouch.com/syncs/debugger.md) to inspect the rejected payload. |

### Braze

For additional Braze-specific errors, see [Braze: Tips and troubleshooting](https://docs.hightouch.com/destinations/braze.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `BRAZE_SERVICE_UNAVAILABLE` | Braze is temporarily unavailable. | Retry the sync after a short delay. Check [Braze Status](https://braze.statuspage.io/) for outages. |
| `BRAZE_ACCESS_DENIED` | Braze denied access to the API. | Confirm the API key has the required permissions in your Braze dashboard. |
| `BRAZE_INVALID_REQUEST` | Braze rejected the request content or structure. | Check required fields and value formats. Use the [live debugger](https://docs.hightouch.com/syncs/debugger.md) to inspect the rejected payload. |

### TikTok

For additional TikTok-specific errors, see [TikTok: Tips and troubleshooting](https://docs.hightouch.com/destinations/tiktok.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `TIKTOK_GATEWAY_TIMEOUT` | TikTok timed out while processing the request. | Retry the sync after a short delay. |
| `TIKTOK_REJECTED_REPLACE_OP` | TikTok rejected a replace operation because another audience job is still processing. | Wait for the existing job to complete before retrying. |
| `TIKTOK_AUDIENCE_ERROR` | The TikTok audience is invalid or not editable. | Confirm the audience exists in TikTok Ads Manager and supports the requested operation. |
| `TIKTOK_PERMISSION_DENIED` | The connected TikTok account lacks the required permissions. | Reauthorize with a TikTok account that can manage the target advertiser and audience. |
| `TIKTOK_INVALID_ENCRYPTION_VALUE` | TikTok rejected the configured encryption or hashing value. | Verify the expected hashing format in your TikTok sync configuration. |

### Google Sheets

For additional Google Sheets-specific errors, see [Google Sheets: Tips and troubleshooting](https://docs.hightouch.com/destinations/google-sheets.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `GOOGLE_SHEETS_INVALID_GRANT` | The Google Sheets authorization grant is invalid. | Reauthorize the destination in Hightouch. |
| `GOOGLE_SHEETS_INVALID_DATA_TYPE` | The sync tried to write an unsupported value type to a cell. | Cast complex values (arrays, objects) to plain text or supported scalar types in your model. |
| `GOOGLE_SHEETS_INVALID_RANGE` | The configured write range is invalid. | Check the tab name, cell range, and sheet structure in the destination configuration. |
| `GOOGLE_SHEETS_EXCEEDS_GRID_LIMITS` | The write would exceed the spreadsheet's grid limits (10 million cells). | Reduce the number of rows or columns, or write to a new sheet. |
| `GOOGLE_SHEETS_MISSING_SHEET_ID` | The spreadsheet or sheet identifier is missing from the configuration. | Reopen the destination setup and confirm the selected sheet. |
| `GOOGLE_SHEETS_QUOTA_EXCEEDED` | The Google Sheets API quota was exceeded. | Retry later, or reduce sync frequency. See [Google Sheets API limits](https://developers.google.com/sheets/api/limits). |
| `GOOGLE_SHEETS_ENTITY_NOT_FOUND` | The target spreadsheet or sheet no longer exists. | Confirm the spreadsheet exists and is shared with the connected Google account. |

### Slack

For additional Slack-specific errors, see [Slack: Tips and troubleshooting](https://docs.hightouch.com/destinations/slack.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `SLACK_NOT_IN_CHANNEL` | The Hightouch Slack app isn't a member of the target channel. | Invite the Hightouch app to the channel, or select a different channel. |
| `SLACK_IS_ARCHIVED` | The target Slack channel is archived. | Unarchive the channel or choose a different destination channel. |
| `SLACK_INVALID_BLOCKS` | Slack rejected the block payload as invalid. | Validate the [Block Kit JSON](https://api.slack.com/tools/block-kit-builder) structure and required fields. |
| `SLACK_NO_TEXT` | The Slack message is missing required text content. | Add message text to your sync configuration, even if blocks are also present. |
| `SLACK_NON_CALLABLE_ITERATOR` | An unexpected payload construction failure occurred. | Retry once. If it persists, [contact support](#pylon-chat). |
| `SLACK_UNEXPECTED_TOKEN` | Slack rejected the payload due to invalid syntax. | Review templated message content and JSON formatting for syntax errors. |

### Other destinations

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `AMPLITUDE_INVALID_JSON_REQUEST` | Amplitude rejected the request payload format. | Review field mappings and ensure the JSON structure matches [Amplitude's API requirements](https://www.docs.developers.amplitude.com/analytics/apis/http-v2-api/). |
| `CITRUS_AD_INVALID_BASE_URL` | The configured CitrusAd base URL is invalid. | Update the destination with the correct API endpoint. |
| `ITERABLE_INVALID_LIST_ID` | The Iterable list ID is invalid. | Confirm the list still exists in Iterable and the configured ID is correct. |
| `ANAPLAN_BAD_MAPPINGS` | The Anaplan field mappings are invalid. | Re-check dimension, line-item, and field mapping setup. See [Anaplan: Tips and troubleshooting](https://docs.hightouch.com/destinations/anaplan.md#common-errors). |
| `ANAPLAN_NULL_POINTER` | The Anaplan request failed with a null-pointer error. | Retry first. If it persists, check mapped objects and source values for missing required fields. |
| `TABOOLA_MISSING_NUMERIC_ACCOUNT_ID` | The Taboola account ID is missing or not numeric. | Update the destination configuration with the correct numeric account ID. |
| `ELASTICSEARCH_INVALID_METADATA_TYPE` | The Elasticsearch metadata type is invalid. | Check mapping configuration and ensure metadata fields use supported types. |
| `FRESHDESK_CLOUDFLARE_IP_BLOCKED` | Freshdesk's Cloudflare proxy blocked the request IP. | Confirm [Hightouch's static IPs](https://docs.hightouch.com/security/networking#ip-addresses) are allowlisted, or contact Freshdesk support. |

## Rejected-row errors

Rejected-row errors apply to individual records, not the entire sync run. You can inspect rejected rows in the [live debugger](https://docs.hightouch.com/syncs/debugger.md) or [warehouse sync logs](https://docs.hightouch.com/syncs/warehouse-sync-logs.md).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `NULL_EXTERNAL_ID` | A required external ID is null for one or more rows. | Ensure the mapped identifier column is populated for every record. Update your model to filter out rows with null identifiers. |
| `DUPLICATE_PRIMARY_KEY` | Multiple source rows share the same primary key value. | Deduplicate your model so each primary key appears only once per sync run. |

### LinkedIn

For additional LinkedIn-specific errors, see [LinkedIn: Tips and troubleshooting](https://docs.hightouch.com/destinations/linkedin.md#common-errors).

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `LINKEDIN_INVALID_CONVERSION` | LinkedIn rejected the conversion payload. | Check that all required conversion fields are present and correctly formatted. |
| `LINKEDIN_EVENT_TOO_OLD` | The event timestamp is outside LinkedIn's allowed time window. | Send more recent events. LinkedIn typically requires events within the last 90 days. |
| `LINKEDIN_MISSING_USER_IDS` | Required LinkedIn user identifiers are missing. | Map at least one accepted identifier (email, Google Advertising ID, or Apple IDFA) for each row. |
| `LINKEDIN_MISSING_INVALID_USER_INFO` | LinkedIn user information is missing or invalid. | Review identifier formatting and required match fields. |
| `LINKEDIN_MISSING_IDENTIFIER_OR_NAME` | A required identifier or name value is missing from the row. | Populate the required matching fields before syncing. |
| `LINKEDIN_INVALID_SEGMENT_VALUE` | A segment value (often email) failed LinkedIn's validation. | Check email formatting and ensure values meet LinkedIn's requirements. |
| `LINKEDIN_PERMISSION_DENIED` | The connected LinkedIn account lacks the required permissions. | Reauthorize with a LinkedIn account that can manage the target audience or conversion action. |
| `LINKEDIN_API_ERROR` | LinkedIn returned a generic row-level API failure. | Retry if the issue appears transient. Use the [live debugger](https://docs.hightouch.com/syncs/debugger.md) to inspect LinkedIn's response for the affected rows. |

## Predictive traits errors

These errors occur when training or running [predictive trait](https://docs.hightouch.com/customer-studio/predictive-traits.md) models. They indicate a problem with training data, event configuration, or warehouse access.

| Error code | What it means | How to resolve |
| :- | :- | :- |
| `NO_USERS_IN_INPUT_FILE` | The training audience returned no users. | Check that the parent audience or model query returns rows before training starts. |
| `NO_USER_ROWS_AFTER_FILTERS` | Users were present initially, but predictive filters removed all of them. | Loosen the filters or verify that event and property conditions match real data. |
| `NO_TRAINING_DATA_FILES` | Hightouch couldn't generate the training dataset. | Confirm that the configured events return data and the event model is queryable. |
| `LABEL_FREQUENCY_TOO_LOW` | There aren't enough examples of the target outcome to train the model reliably. | Increase the lookback window, reduce filters, or choose a higher-volume outcome event. |
| `NO_POSITIVE_EXAMPLES` | The training data contains zero positive examples of the target event. | Check that the outcome event is occurring for users in scope. |
| `TRAINING_MATRIX_DOWNLOAD_FAILED` | An internal failure occurred while retrieving the training artifact. | Retry the run. If it persists, [contact support](#pylon-chat) — this is typically not customer-fixable. |
| `NO_KEY_EVENTS` | No feature-generation events are configured. | Add at least one event input in the predictive trait configuration before retraining. |
| `EVENT_MODEL_MISCONFIGURED` | The event model configuration is invalid. | Confirm the event model exists, has a valid primary key, and includes all referenced columns. |
| `EVENT_QUERY_FAILED` | Hightouch couldn't query event data from the warehouse. | Check warehouse permissions, model SQL, and whether the referenced tables still exist. |
| `SOURCE_ACCOUNT_LOCKED` | The warehouse user account is locked. | Wait for the lockout to clear, or have your warehouse admin re-enable the account. |
| `UNKNOWN_EVENT_IN_FILTER` | A predictive filter references an event Hightouch can't resolve. | Check for renamed, deleted, or misconfigured events in the predictive trait setup. |
| `INVALID_EVENT_PROPERTY_CONDITION` | An event-property filter is malformed. | Verify the filter syntax and confirm you're using valid string property names. |
| `NO_EVENT_DATA_FILES` | No event data was produced for training or inference. | Confirm the configured events have recent data and event pulls are succeeding. |
| `TRAINING_ERROR` | An internal training failure occurred. | Retry once. If it repeats, [contact support](#pylon-chat). |
| `CACHED_EVENT_PULL_DISABLED` | A required event pull is disabled. | Re-enable the event pull in your schema configuration and rerun the predictor. |
| `MALFORMED_EVENT_DATA` | Numeric event fields contain invalid values. | Clean the source data so numeric columns contain only valid numbers (no strings, nulls in numeric-only fields, etc.). |
| `MODEL_QUERY_FAILED` | Hightouch couldn't query the parent model data needed for the run. | Check that the parent model still exists and all referenced columns are present. |
