Back to Articles|Published on November 2, 2026|30 min read

Cirra AI Article

Salesforce Insufficient Access on Cross Reference Entity Fix

Find the blocked ID behind Salesforce insufficient access on cross reference entity errors: an ID-to-dependency worksheet, six documented Help scenarios, Winter '27 (API 68.0) scope and a sandbox-tested fix, 2026.

By Cirra

Salesforce Insufficient Access on Cross Reference Entity Fix

Summary

  1. 01Build one ledger row for every referenced ID, including dependencies introduced by automation. Resolve each reference to an object before proposing an access change.
  2. 02Compare a working and a failing input as the actual acting identity, changing one variable per run. Record the execution context because the same operation can behave differently under different identities.
  3. 03A wrong record type ID and an unavailable record type need different repairs. Check the target object, then test profile and permission set availability for both the assignee and the caller.
  4. 04Route deployment-only failures, including Flow deletion, through the release owner and platform or tool support. Expanding a business user's access does not address a deployment-only cause.
  5. 05Approve one minimal fix, test the smallest operation in a sandbox, read back the result, and retest a negative case. The report reproduced no branch in a Winter '27 org and provides no frequency or resolution statistics.
Inside this article
  1. 01Executive Summary
  2. 02Introduction and Background
  3. 03Taxonomy: What the Error Is and What It Is Not
  4. 04The ID-to-Dependency Ledger
  5. 05Branch-by-Branch Walkthrough
  6. 06Reproducing as the Actual Acting Identity
  7. 07Deployment and Flow-Deletion Cases
  8. 08Using an AI Assistant for the Comparison
  9. 09Data Analysis and Evidence
  10. 10Implications and Future Directions
  11. 11Frequently Asked Questions (FAQs)
  12. 12Conclusion

Executive Summary

Salesforce documents INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY as the status code returned when an operation affects an object that the specified object cross-references and the acting user lacks permission on it [1]. The Salesforce Help article on the message "insufficient access rights on cross-reference id" calls it a permission issue, lists six scenarios, and states that the error may also occur for new or undocumented causes [2]. A failed save therefore does not say which reference failed. A community answer adds that the error is not purely about permissions [3]. The useful question is "which reference failed, for which acting identity?", and the answer comes from evidence gathered before anyone's access is widened.

This report proposes an ID-to-dependency worksheet. Each row captures the field, the redacted referenced ID, the expected and actual object, the acting and target identity, the evidence collected and the single change proposed. The six documented branches map onto it: assigning a record to a new user in the same API call, a record type ID that is not valid for the target object, a user without profile-level access to the record type used, an assigning user whose profile lacks that record type, a Partner Portal user without community scope, and a lead auto-response email template in an inaccessible folder [2]. Record type visibility is documented on both profiles and permission sets, and an Admins blog describes a permission-set-led model [4], so the Help wording should be checked against both models before it is generalized.

The scope is a Winter '27 org. Winter '27 ships API version 68.0 [5]. The sources cited here do not present this error as new in Winter '27. Apex user-mode defaults began at API version 67.0, and deployment-only variants such as Flow deletion through the Metadata API follow a separate path [6]. No branch was reproduced in a Winter '27 org, so each branch is a check to perform and not a diagnosis.

AI assistance can accelerate the comparison, but it does not widen what a user may inspect. Salesforce states that hosted MCP (Model Context Protocol) transactions run as the authenticated user, and the MCP specification calls for a human able to deny tool invocations [7]. The recommended loop is one minimal approved fix, a sandbox test of the smallest operation, a read-back, and a negative test showing unrelated access did not broaden. The only count the report endorses is unresolved dependencies per ledger.

18Recommended Salesforce ID length in characters for API calls that create, edit or delete data
3Characters in the Salesforce ID key prefix used to identify the object

Introduction and Background

Salesforce administrators, RevOps (revenue operations) staff and consulting partners meet this error in four places: an API call, a Data Loader or Bulk API import, an Apex DML (data manipulation language) statement, and a Flow save. The text varies from the status code INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY to "insufficient access rights on cross-reference id". Salesforce's Help article describes a user acting on a flow, record save or action that depends on a connected record, and lists six documented causes [2]. The page is dated August 19, 2026, and it is explicit that the list is not exhaustive [2].

Community and vendor material shows how widely the pattern appears. A Salesforce Stack Exchange answer, linked from the Help article, tells readers to check whether the user has access to the record IDs held in lookup fields [8], and a Marketo knowledge base article ties the same message to an update where the acting user lacks access to a related element [9]. These pages illustrate reasoning but are not platform authority; this report treats Salesforce documentation as the authority and labels everything else as community or vendor commentary.

The angle here is narrower than a generic Flow-debugging guide. A valid ID may belong to the wrong org or the wrong object, and a visible primary record does not prove access to its dependencies. A long-running community answer makes a related point: the error appears when something is inserted or updated that logically cannot be, and it is not purely about permissions [3]. The report therefore separates three questions that are usually blurred: is the reference well formed, does the target exist in this org, and can the acting identity use it.

Long-standing behavior, such as sharing and record type visibility, is not advertised here as new in Winter '27. Where Help article wording on record type access and ownership transfer is not cited, the report relies on developer documentation, Trailhead or the Admins blog. Nothing here was verified in a live org.

Taxonomy: What the Error Is and What It Is Not

The status code family

The SOAP API status code table separates several failures that look alike in a log. As noted in the summary, INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY covers an operation that affects an object the specified object cross-references. Salesforce's example is an account update that creates a related approval work item the user cannot act on, which shows that a cross-reference can be created by automation and not typed by a user.

Neighboring codes point to different repairs. INVALID_CROSS_REFERENCE_KEY is documented for a record that does not exist in the database [1]. MALFORMED_ID requires an ID of 15 characters, or 18 characters with a valid case-insensitive extension [1]. A null or invalid value passed in Apex produced the invalid-key variant in one community example [10], and a Flow that passed the wrong field from a loop to an email action produced the access message in another [11]. The separation is useful but not clean: one vendor author reported that a nonexistent User ID in OwnerId raised the cross-reference message, and concluded it appears reserved for user and profile IDs [12]. The same author attributes the message more broadly to an invalid reference to an ID [12]. These are single tests and not documentation.

Reading the error object

Each failed record in the SOAP error object carries a status code, a message and a fields property, and the fields property identifies the fields that affected the error [13]. The fields value can be empty. When it is, the ledger below has to supply the missing link.

Two classes the rest of this report keeps apart

  • Business transaction errors: an API operation, import or Flow save run by a user or integration, where the acting identity and its sharing, record type and template access decide the outcome.
  • Metadata deployment errors: the same text appears when a deployment or validation fails, notably for Flow deletion. Gearset notes that outside a Flow deletion the message usually points to a permission problem [14], which implies that inside one it often does not.

A deployment problem is not automatically solved by expanding a business user's access. That boundary returns in the deployment section.

The ID-to-Dependency Ledger

What the ledger is for

The ledger converts "something it references is blocked" into a list of specific references, each with an owner. Every row is one reference: an explicit lookup or master-detail field, OwnerId, RecordTypeId, or a reference introduced by downstream automation such as an auto-response template. The ledger counts unresolved dependencies only, and estimates no resolution rates or time saved, because no source reviewed publishes such figures.

Two identification rules keep the ledger honest. First, an object is identified from the three-character key prefix in the ID through describe results, which return the prefix code in the object ID [15]. Second, an object should be confirmed through an authorized describe or query call, not inferred from memory or from a model's guess. For import files, Salesforce recommends 18-character IDs in API calls that create, edit or delete data [16], because the extra three characters encode the case of the preceding 15 [16].

The sequence before any access change is:

  1. Capture the exact error text, operation, org, timestamp and acting user.
  2. Separate malformed or invalid-key errors from insufficient-access errors.
  3. Fill one ledger row per reference, including references introduced by automation.
  4. Resolve each ID to an object through an authorized call.
  5. Reproduce as the acting identity with one working and one failing input.
  6. Propose one change per unresolved row, with an owner and approver.

Table 1 below lists the worksheet fields and how each is confirmed. The "how to confirm" column assumes only the identity and tools the practitioner is already authorized to use.

Worksheet fieldWhat to recordHow to confirm with authorized tools
Org ID and release15 or 18 character org ID, edition, sandbox or production, release (for example Winter '27, API 68.0)Setup company information and the org's API version list
TransactionOperation (insert, update, upsert, delete, deploy), API and version, timestamp, job or request IDRequest log, Bulk API job ID, Flow interview, or Apex debug log
Field or API nameThe field named in the error's fields value, if presentError object fields property
Referenced ID (redacted)First three characters plus last four only; never paste full IDs into a shared channelPrefix lookup through describe
Expected object and orgObject the field is meant to reference, and the org the ID was exported fromField definition; compare with the source org for migrated data
Actual objectObject the ID resolves to in this org, or "not found"Authorized describe or query; "not found" may mean invalid, deleted, or invisible
Acting identityUser or integration that ran the operation; a flow's running user is whoever launched it [17]Login history, debug log user, flow interview owner
Target identityAssigned OwnerId, or the user the record is created forUser record, profile, permission sets, license
Required evidenceRecord type availability, record sharing, folder visibility, community membershipSee Table 3
Observed accessWhat the acting identity can actually read or use, from a test as that identityReproduction as the user (see below)
Proposed change, owner, approval, read-backOne minimal change, who owns it, who approved it, the post-change observationChange ticket; read-back by the same test

Redaction is part of the evidence trail: the ledger may travel to a partner, a vendor desk or an AI assistant, and full record IDs are better kept out of those channels.

The rows "Actual object" and "Observed access" decide most diagnoses. A row whose actual object is "not found" splits into three sub-cases with different repairs: the ID is from another org, the record was deleted, or the acting identity cannot see it. A Revenue.io support page notes that mismatched references are especially common when moving configurations between sandboxes and production [18], which fits the first sub-case. Gearset's data-deployment article says the same message can mean the related record is missing from the org or that the user lacks permission to see it [19]. A vendor walkthrough suggests placing the failing ID at the end of the org's URL to see whether it opens [12], a quick check when the tester is authorized to view the record.

Figure 01
Build the dependency ledger before changing access
  1. 01Capture the failure

    Capture the exact error text, operation, org, timestamp and acting user.

  2. 02Separate error families

    Separate malformed or invalid-key errors from insufficient-access errors.

  3. 03List every reference

    Fill one ledger row per reference, including references introduced by automation.

  4. 04Resolve each ID

    Resolve each ID to an object through an authorized call.

  5. 05Compare as the acting identity

    Reproduce as the acting identity with one working and one failing input.

  6. 06Assign a narrow repair

    Propose one change per unresolved row, with an owner and approver.

A count of zero means every reference has been explained, not that the operation will succeed.

Branch-by-Branch Walkthrough

The Help article's six scenarios are the starting structure. The report follows them, adds checks for the causes the article's closing sentence leaves open, and keeps each as a check to run. None of the branches below was reproduced in a Winter '27 org for this report.

Branch 1: a new owner in the same API call that creates the record

Salesforce says a record cannot be assigned to a new user in the same API call that creates it [2], and the stated resolution is to create the record first and update OwnerId in a separate call [2]. Apex has a related mixed-DML restriction between setup objects such as User and other objects, with a separate transaction as the fix. The practical check is an order-of-operations question: was the target user created, licensed and given its permission sets in a transaction that has finished before the ownership assignment is attempted? If the answer is "the same call", the repair is a sequencing change in the integration, not an access grant.

Branch 2: invalid record type for the object

The Help article lists a record type ID that is not valid for the target object [2]. This is a wrong-ID case and not an entitlement case. Record types are per object, and widening anyone's access cannot fix a record type that belongs to a different object. The check is to resolve the ID against the target object's record types and to confirm the object API name in the ledger. Describe results list all record types for an object even when the user cannot use some of them, so presence in describe does not prove availability.

Branches 3 and 4: record type availability for the assignee and the caller

The Help article describes two profile-level scenarios: the user being assigned lacks access to the record type used [2], and the assigning user's profile lacks it [2]. Salesforce's metadata documentation shows record type visibility on profiles [20] and on permission sets [21]. A 2026 Admins blog describes a permission-set-led model in which profiles provide baseline settings [4] and lists "Record Types (outside of the default)" among what permission sets can carry [4].

The record type reference states that a user on a profile not enabled for a record type cannot create records with it [22]. A Trailhead project makes the same assumption when it enables both record types for all profiles so every agent can create cases of either type [23]. A community answer likewise says profiles need access to the record types [8], and a comment on a long-running thread says the record type check is enforced even for system administrators [3]. No Salesforce sentence found for this research says in one place that every API write with a RecordTypeId is blocked unless the identity has the type through a profile or a permission set. The conservative rule for the worksheet is to test both sources of availability for both identities, and to avoid converting the Help article's profile wording into an absolute rule for all permission models. A planned retirement of permissions on profiles was not enforced for Spring '26, according to the Admins blog author's note [24], so both models remain in use.

Branch 5: Partner Portal user without community scope

For a Partner Portal user without access to the internal record or community scope, the Help article's fix is to add a NetworkScope column to the API call [2]. For Experience Cloud site users, a sharing set grants access to records associated with the account or contact matching the user's own [25], and each profile can have only one sharing set [25], so a profile's sharing set must include every object its external users need. The check is whether the external user belongs to the community the call names and whether the sharing set covers the object in the ledger row.

Branch 6: lead auto-response template in an inaccessible folder

The sixth documented scenario is a lead auto-response email template in a folder the submitting user cannot access [2]. This is a dependency introduced by automation: the ledger gains a row for the template even though the failing operation only inserted a lead. Folder visibility is role-aware, because a folder shared with a role is visible only to users in that role [26]. A Trailhead project reports that enabling Folders and Enhanced Sharing resolved an insufficient-privileges error in the Lightning template setup [27], which shows folder enablement as a separate precondition from sharing.

Branch 7: the undocumented remainder

The article's closing statement means the six branches are a starting set [2]. Four further checks cover most of what practitioners report.

  • Record sharing on a related record: record-level access starts from the organization-wide default and widens through ownership, the role hierarchy, sharing rules and manual sharing [28], and the lookup targets the acting user can read matter in the same way [8].
  • Hierarchy settings: on custom objects, users above the owner get access through the hierarchy unless the object setting is cleared, in which case only the owner and users granted access through sharing features receive it [29].
  • Master-detail inheritance: a detail record inherits the sharing setting of its parent [29], so under Controlled by Parent a user can act on it only if they can perform that action on the parent [29], and the master object controls behaviors of the detail such as who can view it [30]. Access to a detail record therefore does not prove access to a different parent.
  • Integration user object access: vendor pages describe an integration user lacking Read access to an Opportunity object [31], a user without permission on a related record [18], and a Content Version file the user could not access [32]. These illustrate object and file entitlements and are not Salesforce documentation.
  • Duplicate Apex share rows: one community comment reports that this error can surface when adding Apex sharing for a record [3]. This is a lead to test and not a platform statement.
Figure 02
Wrong record type versus unavailable record type
Wrong record typeObject mismatch
  • A record type belonging to a different object cannot be repaired by widening access.
  • Resolve the ID against the target object's record types and confirm the object API name in the ledger.
Unavailable record typeIdentity availability
  • Check both profiles and permission sets for record type visibility.
  • Test availability for both the assignee and the caller without generalizing profile wording to every permission model.

Describe results list all record types for an object even when the user cannot use some of them, so presence in describe does not prove availability.

Reproducing as the Actual Acting Identity

Establish the execution context first

The same operation can behave differently under different identities. Salesforce's Admins blog says record-triggered, platform event-triggered and scheduled-triggered flows run in system context without sharing [17], while top-level screen flows run in user context by default [17]. A flow invoked from Apex is documented there as always running in system mode without sharing [17], while a Trailhead unit says the flow type sets the default context and describes its own summary as simplified, with exceptions [33]. The two sources differ on autolaunched flows, and the Admins post dates from 2022. Screen-flow rules should not be generalized to every flow type. In user context, a flow fails when the user's profile or permission sets lack access the flow needs [33], and flow users need the Run Flows permission [33].

Winter '27 may change the picture. Salesforce Ben reports a new flow run-context option that limits a flow to the data and actions the running user may use [34]. Because this comes from trade press and not from release notes, and the Salesforce developer guide to Winter '27 reviewed here does not mention it, treat it as unconfirmed: verify it in the official Winter '27 release notes and in a sandbox before using it in any troubleshooting or design decision.

Apex has version-gated defaults of its own: at API version 67.0 and later, Apex runs in user context by default [35]. That change arrived in Summer '26, so it predates Winter '27, but code deployed at API 67.0 or 68.0 can behave differently from older code, and classes with no sharing declaration should be reviewed. Sources also differ on triggers: one community answer says sharing settings are still checked when a trigger runs in system mode [8], so trigger behavior should be tested in the actual org and not assumed.

Ownership changes in triggers and bulk updates

Ownership transfer is a recurring scenario in the documentation reviewed. A trigger that changes record ownership needs the running user to have read access to the new owner's User record, when the trigger starts through the API, the standard UI or a with-sharing class [28]. The OwnerChangeOptions header for updates and upserts offers an option under which the new owner must have at least read access on the record [36]. Owner changes also alter sharing, because user-managed (manual) sharing is removed when the record owner changes [28]. Salesforce Ben reports a Winter '27 org-wide setting to keep manual shares on ownership change [34]. This item is also unconfirmed: the Salesforce developer guide to Winter '27 reviewed here does not mention it, so verify the setting's name, location and default in the official release notes and a sandbox before relying on it.

For an account owner change that returns the cross-reference error, the ledger rows are the new owner, the account's child records that carry their own owner or record type, and any sharing the previous owner held. A sharing rule helps only when the blocked dependency is a related record the acting identity cannot see. It does nothing for a wrong record type ID or a template folder.

A working and a failing input (Hypothetical Example)

The fixtures below are synthetic and exist only to show how to compare two inputs. They are not drawn from a customer org.

  • Working input (Hypothetical Example): an update to a Contact whose OwnerId is a user holding the Contact record type through a permission set, run by an integration user with access to the parent Account. Ledger rows: OwnerId resolves to a User; RecordTypeId resolves to the Contact object; both identities pass the availability check.
  • First failing input (Hypothetical Example): the same update with a RecordTypeId copied from a different sandbox. The ID's prefix resolves to a different object, or to nothing. Ledger result: the row is marked "wrong ID", not "absent entitlement", and no access change is proposed.
  • Second failing input (Hypothetical Example): the same update with a valid Contact record type that is not available to the assigned user. Ledger result: one unresolved dependency, assigned to the permission owner, with a proposed change of making that single record type available to that user.

Change one variable per run: changing the user, the record type and the owner together defeats the comparison.

Debugging as another user, and finding the failing record

Trailhead documents a Process Automation Settings option that lets administrators debug flows as other users [37], and a worked example in which an autolaunched flow failed at an update element [37]. In that example the cause was system context with sharing combined with a private default on activities, so the flow could access only the records the running user could access [37]. The error text there was a sibling message, "insufficient access rights on object id", not the cross-reference message, so it illustrates method and not the exact error. Debug runs change data unless rollback mode is selected [37], which is one reason to test in a sandbox. Only Partial Copy and Full Copy sandboxes include data [38], so a Developer sandbox may lack the very record the failing input references.

For imports and bulk work, the Data Loader error file and the Bulk API 2.0 failed-results file carry per-record errors, and the latter includes the ID of the record that had an error [39]. Rows should be matched by field values and not by file position. In Apex, calling a Database method with the second parameter false allows partial processing, so each failed record gets its own result [40]. In an all-or-none request, valid records can come back as rolled back because another record failed, so the first error in a response is not always the root cause.

Deployment and Flow-Deletion Cases

The same message appears in Metadata API deployments. Gearset documents that from Metadata API version 44, deleting a Flow requires listing every version of the Flow in the target environment [6], and that a deletion using API version 43 or below avoids the problem [6]. A newer Gearset guide adds that Salesforce only allows deleting entire Flows, including all versions [14]. Salto's help center describes a different handling: the selected flow is skipped and the deletion is not attempted [41]. The two vendors do not agree on the remedy, which is a reason to route these cases to the platform or tool vendor's support path and not to widen user permissions.

For data deployments, Gearset suggests removing the offending field from the deployment when the related record cannot be restored [19], and it notes that the error can occur for reasons other than permissions [19].

The decision rule for a deployment-only case is plain:

  • Whose identity failed: if a deploy or destructive change run by a deployment identity fails while the business user's save works, the ledger row belongs to the release owner.
  • What not to do: expanding a business user's access in production would not touch the cause and adds risk with no verified benefit.
  • Flow deletion: check that every version is listed, and expect vendor remedies to differ.
  • Escalation: send undocumented metadata deployment errors to Salesforce Support or the deployment tool vendor with the redacted ledger attached.

Using an AI Assistant for the Comparison

What the assistant can and cannot do

An AI assistant is useful for a bounded task: read the redacted error and input, read the metadata it is authorized to read, produce a dependency map and list the unknowns. It can compare a working and a failing input and draft a narrowly worded repair for approval. It cannot infer permission to inspect another record from an inaccessible result. If a query as the connected user returns no rows, the correct reading is "invisible to this identity", not "does not exist" and not "grant access to find out". Native Setup and API checks remain the baseline.

Authorization boundaries are documented. Salesforce states that hosted MCP transactions run as the authenticated user, without anonymous service accounts [42]. The MCP specification states that there should always be a human with the ability to deny tool invocations [7] and that clients should present confirmation prompts [7]. Authorization for HTTP transports follows OAuth 2.1 [43].

Interface options

Table 2 below compares interfaces a practitioner might use to run the read-only parts of the ledger. The Cirra AI row describes a product from this article's publisher and is not independently verified or backed by a citation. Its access model, tool list, plan and approval behavior should be confirmed in the vendor's documentation before relying on it.

InterfaceActs asWrite capabilityNotes for this task
Setup, Data Loader, REST or SOAP with your own loginThe signed-in userYes, within that user's permissionsThe baseline; per-record errors come from the error files and API responses
Salesforce hosted MCP, sobject-reads serverThe authenticated userNo; no data changes are possible [44]Suitable for describe, query and relationship reads; generally available for Enterprise Edition orgs and above
Salesforce hosted MCP, sobject-all serverThe authenticated userYes; create, read, update and delete toolsUse only with approval prompts and sandbox testing for fix steps
Salesforce DX MCP server (local)Orgs already authorized on your computer [45]Yes; includes a SOQL query tool [45] and a permission set assignment tool [45]The repository states it reaches end of life on November 2, 2026 [45], so verify status before adopting
Cirra AI (hosted admin MCP server)Not independently verified; confirm the authentication model and approval behavior in the vendor's documentationNot independently verified; confirm which describe, query and metadata operations are supportedConfirm exact tool support for describe, query and permission-set steps, and whether it acts only as the connected user

Read-only interfaces cover the ledger's evidence steps, while write-capable ones belong after approval. A permission set assignment tool is a repair tool and not a diagnostic tool, so it sits behind the approval step below. For every row, the identity the interface connects as defines what the ledger can observe, and approval gates every write.

The approval loop

  1. Approve one minimal fix that maps to one ledger row, with the owner and approver named.
  2. Test the smallest operation in a sandbox that holds an equivalent record, using the same acting identity.
  3. Read back the result with the same query or describe call that supplied the evidence.
  4. Retest a negative case, a second identity or input that should still fail, to confirm unrelated access was not broadened.
  5. Escalate deployment-only and undocumented cases to the appropriate platform or tool support path.
Figure 03
Validate one approved fix and preserve access boundaries
  1. 01Approve one minimal fix

    Map the fix to one ledger row and name its owner and approver.

  2. 02Test the smallest operation

    Use the same acting identity in a sandbox that holds an equivalent record.

  3. 03Read back the result

    Repeat the query or describe call that supplied the evidence.

  4. 04Retest a negative case

    Use a second identity or input that should still fail to confirm unrelated access was not broadened.

  5. 05Escalate unresolved cases

    Route deployment-only and undocumented cases to the appropriate platform or tool support path.

Data Analysis and Evidence

The quantitative evidence on this error is thin. Salesforce publishes no frequency or resolution statistics for it, and none were found in the sources reviewed, so this report offers no resolution rates, time savings or prevalence figures. What can be counted are documented facts that bound the diagnostic work.

Table 3 below maps symptoms to the evidence that separates wrong ID, absent entitlement, inaccessible record, template and deployment cases.

Symptom or branchDependency to testEvidence that separates itSource status
Malformed or nonexistent IDThe referenced ID itselfLength of 15 or 18 characters; resolves to an object by prefixOfficial
ID from another org or objectExpected versus actual objectID resolves to a different object, or nothing, in this orgOfficial plus vendor
Record type not valid for objectRecordTypeId and target objectType missing from the target object's record typesOfficial
Record type not available to a userProfile or permission set visibilityAvailability test for assignee and callerOfficial; permission-set nuance from metadata docs
New user plus ownership in one callSequence of operationsOwnership assigned in the creating callOfficial
Inaccessible related recordSharing, hierarchy, parent accessQuery as the acting identity returns no rowOfficial
Portal or community userCommunity scope, sharing setNetworkScope present; sharing set covers objectOfficial
Template or folderTemplate referenced by auto-responseFolder visible to the submitting userOfficial
Flow or metadata deletionVersions of the Flow listedDeletion lists every versionVendor commentary; confirm with the platform
None of the aboveUnknownEscalate with ledgerHelp says causes may be undocumented

The table is a triage order and not a probability ranking, because the sources do not rank causes by frequency. Rows marked "Vendor commentary" are to be confirmed against the platform.

The bounded numbers that do appear in the documentation are as follows.

  • Six scenarios are listed in the Help article, plus an explicit statement that others exist.
  • 15 or 18 characters are valid for an ID, and 3 characters form the key prefix, as cited above.
  • API 68.0 is Winter '27 and API 67.0 brought Apex user-mode defaults, as cited above.
  • November 2, 2026 is the end-of-life date the DX MCP server repository states, so verify the tool's status before adopting it.
  • Unresolved dependencies is the only metric the worksheet defines: the number of ledger rows whose observed access is still "unknown" or "blocked" after the evidence steps. A count of zero means every reference has been explained, not that the operation will succeed.

Where a result lists the failing field, the ledger row can be filled directly. Where it does not, the ID-to-object resolution step is the fallback.

Implications and Future Directions

Three implications follow. First, permission sets and profiles both carry record type visibility, so the Help article's profile wording is the likeliest to be over-generalized. Teams moving users from profile-based to permission-set-based setups should add record type availability to the migration checklist.

Second, execution-context defaults are moving. Apex user-mode defaults arrived at API 67.0, and two Winter '27 items (a flow run-context option and manual share retention on ownership change) are reported only by trade press, were not found in the official Salesforce material reviewed, and should not be used as operational guidance until confirmed in the release notes. Existing integrations should be retested after API version bumps.

Third, the interfaces that can act on an org are multiplying, and their lifecycles differ: the DX MCP server's repository states an end-of-life date of November 2, 2026, while hosted MCP servers are available for Enterprise Edition and above. Runbooks that name a tool should record its status date.

Open questions remain. Salesforce does not appear to publish an official statement on whether an API write that supplies a RecordTypeId requires availability through any source other than profile assignment. The read-access rule for a new owner on a single-record transfer is not established here beyond the API option and trigger rule cited above. And no source measures how often each branch occurs; a partner team could build that dataset from its own tickets by counting unresolved dependencies per ledger.

Frequently Asked Questions (FAQs)

What does "insufficient access rights on cross-reference id" mean?

Salesforce describes it as a permission issue: the user or process acting on a flow, record save or action depends on a connected record, such as a lookup or master-detail target, that it cannot access [2]. The status code table defines the cross-reference variant as an operation affecting an object that the specified object cross-references.

How can an admin find which record causes the error?

Read the error's fields value, the Data Loader error file, or the Bulk API 2.0 failed results. Resolve each referenced ID to an object by key prefix, match rows by field values, then ask whether the acting identity can see the record at all [46].

How does the error appear in Apex?

Run DML through a Database method with allOrNone set to false so each failure returns its own result, then read the status code and fields from each error. Check the class's sharing keyword and the API version, because Apex runs in user context by default at API 67.0 and later.

How does it appear in a Flow?

Identify the flow type and the running user first. Record-triggered flows run in system context without sharing, as cited above, screen flows run in user context by default, and an administrator can debug as another user once the Process Automation option is enabled. Test in a sandbox using rollback mode so debug runs do not change data.

Can an owner change cause it, and what about account owner changes?

Yes, in the documented cases. A trigger that changes ownership needs read access to the new owner's User record, and manual sharing is removed on an owner change, as cited above. Check the new owner, the child records and the prior sharing, one ledger row each.

Can a sharing rule fix it?

Only when the blocked dependency is a related record the acting identity cannot see. Sharing rules and the role hierarchy widen record access, but they do nothing for a wrong record type ID or a template folder. Confirm the branch before proposing a rule. Object-wide overrides such as View All Data and Modify All Data bypass sharing but are broad, and Trailhead advises caution assigning them outside System Administrator [47].

Does Winter '27 change this behavior?

No Winter '27 item reviewed names this error. Winter '27 is API 68.0, and behavior that can interact with it, such as Apex user-mode defaults, began at API 67.0, as cited above.

Conclusion

The error message names a symptom, not a record. The disciplined response is an evidence ledger: capture the exact error and operation, resolve each reference to an object, compare one working and one failing input, and match the result to a documented branch. Salesforce lists six branches and says others exist, so the ledger needs an explicit "undocumented" outcome that routes to support and does not default to a permission grant.

Record type availability, record sharing, template folder visibility and operation sequencing are different dependencies, each with its own narrow repair. Deployment-only cases, such as Flow deletion through the Metadata API, belong to a separate path [6]. AI assistance can speed the comparison and draft the proposed change, acting as the connected user with a human able to deny each write. The limits of this report are the absence of reproduction in a Winter '27 org and of frequency data, and both are best filled by a team's own sandbox tests and its own count of unresolved dependencies.

External Sources (47)

About

Cirra AI

About Cirra AI

Cirra AI is a software company dedicated to reinventing Salesforce administration through AI-powered tooling built on the Model Context Protocol (MCP). From its headquarters in Silicon Valley, the team has built the first commercial MCP server for Salesforce administration—a hosted service that lets any MCP-compatible AI tool (Claude, ChatGPT, Cursor, and others) connect to a Salesforce org and execute admin tasks through natural language. The product gives Salesforce administrators, revenue-operations teams, and consulting partners the ability to implement configuration changes in minutes instead of hours, while respecting org permissions and maintaining full auditability. Cirra AI's mission is to "let humans focus on design and strategy while software handles the clicks." To achieve that, the company develops two complementary product lines: Salesforce Admin MCP Server – A fully hosted MCP endpoint that connects any AI tool to Salesforce in minutes via OAuth. Administrators describe what they need in plain English—create custom objects and fields, configure page layouts, manage permission sets, build flows, provision users, generate documentation—and the MCP server translates those instructions into standard Salesforce Metadata and Tooling API calls, bounded by the user's existing permissions. No local infrastructure or custom code is required: sign up, authenticate, copy the MCP URL into your AI tool, and start working. Salesforce Skills Library – An open-source collection of domain-specific skills (available at skills.cirra.ai) that supercharge AI assistants with deep Salesforce expertise. Skills cover Apex development with 150-point scoring, Flow creation and validation with 110-point scoring, Lightning Web Component development with the PICKLES architecture methodology, metadata operations, permission auditing, data and SOQL operations, org-wide health audits, architecture diagramming, and Kugamon CPQ management. The skills are installable as a single plugin for Claude Cowork, Claude Code, and OpenAI Codex, or as individual skill files for Claude web, desktop, and ChatGPT. They enable AI assistants to perform complex, multi-step Salesforce tasks independently—run a comprehensive org audit, fix issues flagged in the report, generate field descriptions at scale—without prompt-by-prompt hand-holding. Together, these products address three chronic pain points in the Salesforce ecosystem: (1) the high cost of manual administration and repetitive setup-menu navigation, (2) the backlog created by scarce expert capacity, and (3) the risk of inconsistent, undocumented changes. Early adopter feedback shows time-on-task reductions of 70–90 percent for routine configuration work.

Leadership

Cirra AI was founded in 2024 by Jelle van Geuns, a Dutch-born engineer, serial entrepreneur, and veteran of the Salesforce ecosystem with over 14 years of platform experience. Before Cirra, Jelle bootstrapped Decisions on Demand, an AppExchange ISV whose rules-based lead-routing engine is used by multiple Fortune 500 companies. Under his leadership the firm reached seven-figure ARR without external funding, demonstrating a combination of deep technical innovation and pragmatic go-to-market execution. Jelle began his career at ILOG (later IBM), where he managed global solution-delivery teams and developed expertise in enterprise optimisation and AI-driven decisioning. He holds an M.Sc. in Computer Science from Delft University of Technology and speaks frequently on AI-assisted administration, MCP integration patterns, and human-in-the-loop automation at Salesforce community events and podcasts. The leadership team includes Jeff Bajayo (VP Sales), a seasoned Salesforce and SaaS professional with over a decade of experience, and Latrice Barnett (Advisor, Marketing), who brings 10+ years of partnership and ecosystem marketing expertise from the Salesforce ecosystem.

Why Cirra AI Matters

MCP-native architecture – Rather than building a proprietary agent UI, Cirra embraces the Model Context Protocol as a universal connector, letting customers use the AI tool they already prefer—Claude, ChatGPT, Cursor, or any future MCP-compatible client—while Cirra handles the Salesforce integration layer. Deep vertical focus – The Skills Library encodes thousands of Salesforce best-practice patterns, scoring rubrics, and validation scripts that generic AI assistants lack. This domain intelligence produces higher-quality, more reliable outputs for Apex, Flows, LWC, permissions, and metadata operations than general-purpose prompting alone. Enterprise-grade security – The platform uses OAuth authentication, encrypted endpoints, and inherits the connected user's Salesforce permission model. Cirra never stores Salesforce credentials, and all actions are logged for auditability—critical requirements for regulated industries adopting AI tooling. Works for admins and partners alike – Individual administrators use Cirra to eliminate setup-menu drudgery and respond faster to business requests. Consulting firms use it to scale senior-level expertise across delivery teams, enabling more projects delivered at higher quality and lower cost through improved documentation and test coverage. Accessible to non-developers – Anyone with a paid Claude or ChatGPT subscription can install the skills and connect the MCP server. No coding, no complex integrations—just sign up and start working.

Future Outlook

Cirra AI continues to expand its capabilities with the upcoming Admin Agent (launching June 2026), which will bring fully autonomous multi-step task execution to Salesforce administration. The company is also extending platform compatibility to additional AI marketplaces and broadening its skills library to cover more Salesforce clouds and use cases. By combining open standards, domain-specific intelligence, and a relentless focus on the admin experience, Cirra AI is building the de-facto AI integration layer for Salesforce administration.

Disclaimer

This document is provided for informational purposes only. No representations or warranties are made regarding the accuracy, completeness, or reliability of its contents. Any use of this information is at your own risk. Cirra AI shall not be liable for any damages arising from the use of this document. This content was generated with assistance from artificial intelligence tools, which may contain errors or inaccuracies. Readers should verify critical information independently. All product names, trademarks, and registered trademarks mentioned are property of their respective owners and are used for identification purposes only. Use of these names does not imply endorsement. This document does not constitute professional or legal advice. For specific guidance related to your needs, please consult qualified professionals.