{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Data Operation Settings"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"data-operation-settings","__idx":0},"children":["Data Operation Settings"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configure automated sync jobs to keep your Salesforce data current with Onboarded™, and control which objects Onboarded™ is allowed to delete in Salesforce."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Important:"]}," Batch jobs run as the user who schedules them. Ensure this user has the Onboarded™ Admin permission set and access to all objects/fields being synchronized. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#execution-context"},"children":["Execution Context"]}," for details."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scheduled-sync-setup","__idx":1},"children":["Scheduled Sync Setup"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"setup-ui-method","__idx":2},"children":["Setup UI Method"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Open Onboarded™ Setup."]}," Navigate to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Onboarded™ Setup"]}," tab."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Go to Data Operation Settings Tab."]}," Click on the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Operation Settings"]}," section."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Configure Schedule."]}," Set your preferred schedule using the CRON expression builder or presets."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save and Enable."]}," Save your configuration and enable the scheduled job."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Alternative — Manual Scheduling via Setup."]}," You can also schedule jobs manually from ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Setup → Apex Classes → Schedule Apex"]},". If you use this method, the Onboarded™ Setup UI will still detect the scheduled job and update accordingly, as long as the job name starts with \"Onboarded\" (e.g., \"OnboardedSyncScheduler\"). Jobs scheduled with other names will run but won't be reflected in the Onboarded™ Setup interface."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What \"Scheduled Sync\" runs."]}," The scheduled sync job ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["dispatches by object selection"]}," (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#how-the-sync-dispatches-by-object"},"children":["How the sync dispatches by object"]},"): the enabled ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["event-sourced"]}," objects are drained by the event-feed poller, and if ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Forms"]}," is enabled the Form catalog batch runs too."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Link Data runs separately."]}," Populating Lookup/Master-Detail fields (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#link-data"},"children":["Link Data"]},") does ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," happen automatically as part of your regular sync schedule. If your mappings include relationship fields, schedule Link Data as its own, separate CRON entry."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Recommended cadence:"]}," at least daily. Because the poller only pulls what changed since the last run, scheduling it more frequently (for example, hourly) is safe and inexpensive."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Important — Scheduled Jobs Run As The Scheduling User."]}," Salesforce scheduled jobs execute in the security context of the user who scheduled them. This affects CRUD/FLS permissions, sharing rules, and record access."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Best practices:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Schedule jobs using an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["integration user"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["system administrator account"]}," with appropriate data access"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Avoid scheduling under individual user accounts that may be deactivated — deactivating the scheduling user will cause the job to fail"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If the scheduling user leaves the organization, reassign or reschedule the job under an active admin account"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"delete-operations","__idx":3},"children":["Delete Operations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Select which objects Onboarded™ is allowed to delete in Salesforce. This applies to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["both"]}," inbound webhook notifications and scheduled batch/poller sync — a delete reported by Onboarded™ for a checked object is applied regardless of which channel reported it. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Off by default for every object."]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Toggle"},"children":["Toggle"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Object"},"children":["Object"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Employer Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Employer"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Employee Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Employee"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Client Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Client"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Job Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Job"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Placement Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Placement"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Task Deletes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Task"]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Always visible, independent of the master Enable Scheduled Jobs toggle above."]}," These settings govern delete behavior on both the real-time webhook and the scheduled batch/poller sync — turning off ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enable Scheduled Jobs"]}," does not disable them, since the webhook path doesn't depend on that toggle either."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deleted records land in the Recycle Bin, not gone immediately."]}," Deletes performed by this feature are standard Salesforce deletes (not a permanent purge), so they're recoverable from the Recycle Bin for the normal retention window like any other delete."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Turning a toggle on retroactively does not replay past deletes."]}," Enabling a delete toggle only affects deletes Onboarded™ reports going forward — records already deleted in Onboarded™ before you enabled the toggle are not backfilled."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"common-cron-expressions","__idx":4},"children":["Common CRON Expressions"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Schedule"},"children":["Schedule"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"CRON Expression"},"children":["CRON Expression"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Daily at 2:00 AM"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0 0 2 * * ?"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every 6 hours"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0 0 0,6,12,18 * * ?"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Weekdays at 7:00 AM"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0 0 7 ? * MON-FRI"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every hour"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0 0 * * * ?"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sunday at midnight"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0 0 0 ? * SUN"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"batch-size-configuration","__idx":5},"children":["Batch Size Configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Batch Size"]}," setting controls how many records are processed per execution of the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Link Data"]}," batch chain (and other on-demand batch operations, such as Forms Reset — see below). This setting is configurable in the Onboarded™ Setup interface."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Setting"},"children":["Setting"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Details"},"children":["Details"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Valid Range"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 to 2000 records per batch"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Default Value"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["200 records"]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Not used by the event-feed poller."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OnboardedEventSyncQueueable"]}," fetches a fixed page of up to 500 events per execution and is unaffected by this setting. Batch Size applies to the Link Data batch chain; Forms Reset (below) always runs one page per batch execution regardless of this setting."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"batch-size-tuning","__idx":6},"children":["Batch Size Tuning"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Decrease batch size"]}," if you encounter governor limit errors (CPU time, heap size, SOQL queries) due to complex triggers, validation rules, or automation on the target objects"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Increase batch size"]}," if Link Data operations are taking too long and you have minimal automation on target objects"]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tip:"]}," Start with the default value of 200. If you experience governor limit issues, try reducing to 100 or 50. Only increase above 200 if you have tested thoroughly and confirmed your org can handle larger batches."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"forms-reset-on-demand-full-catalog-pull","__idx":7},"children":["Forms Reset (On-Demand Full Catalog Pull)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Forms are a largely-static catalog that is typically built out ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["during initial setup"]}," in your Onboarded™ account — often well before your Salesforce org is connected. Unlike the event-sourced objects, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["forms are not emitted to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/events"]}," feed at all"]},", so the poller never syncs them — forms sync exclusively through the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Form batch"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FormSyncBatch"]},"), a full pull of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/v1/forms"]},". That batch runs automatically when ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Forms"]}," is enabled and a sync fires (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#how-the-sync-dispatches-by-object"},"children":["How the sync dispatches by object"]},"); ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Forms Reset"]}," is the on-demand version of the same pull, for reconciling the full catalog whenever you need it — for example, right after initial setup, or after adding forms in Onboarded™."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Open Onboarded™ Setup."]}," Navigate to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Operation Settings"]}," section."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Locate the Forms Reset heading."]}," Look for the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Forms Reset"]}," panel, described as:"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Pulls the complete forms catalog from Onboarded and upserts it into Salesforce. Forms are not part of the event feed, so they never sync through the scheduled poller — this batch is how forms reach Salesforce. Run it after initial setup, any time you add forms in Onboarded, or whenever you need to reconcile the local catalog. Safe to run repeatedly."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Click Pull All Forms."]}," This button enqueues a full, standalone catalog pull of every Form record from Onboarded™. On success, you'll see: ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Forms reset started — the full catalog is being pulled from Onboarded.\""]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requirements and behavior:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin-only."]}," Only users with the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Onboarded™ Admin"]}," permission set can run Forms Reset (the button is gated in the UI, and the server-side controller re-checks admin access as a defense-in-depth measure). A non-admin attempt is rejected with ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"You do not have permission to reset forms.\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requires Forms sync enabled and mapped."]}," In ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Object Configuration"]},", Forms Reset requires the Form entity's sync toggle to be turned on and a Salesforce object selected for it. If either is missing, you'll see: ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Form sync must be enabled and the Form object mapped before running a forms reset.\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Concurrency guard."]}," Only one Forms Reset can run at a time. If a forms pull is already in progress, a new attempt is rejected with: ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"A forms sync job is already running. Please wait for it to finish before starting another reset.\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Idempotent and safe to re-run."]}," Forms Reset upserts by Onboarded™ ID, so running it repeatedly reconciles your Form records without creating duplicates. There is no downside to running it again if you're unsure whether it's needed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Does not affect the event feed."]}," Forms Reset is a standalone full pull — it runs independently of the event-feed poller and its schedule, and does not change the feed's sync position."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"run-links-now-on-demand-per-object-linkage","__idx":8},"children":["Run Links Now (On-Demand, Per-Object Linkage)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reference relationships are normally populated two ways: ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["inline"]}," as records sync (the webhook and event-feed poller resolve a reference to the related Salesforce record if it already exists at that moment), and by the scheduled ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Link Data"]}," phase. Neither covers the case where you ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["enable a Reference Relationship ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["after"]}," the records were already synced"]}," — those existing records were applied before that mapping existed, so their lookup fields were never populated and won't be back-filled until the next scheduled Link run."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Run Links Now"]}," back-fills that gap on demand, scoped to a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["single"]}," Onboarded™ object so large orgs don't have to reprocess every object. It runs the existing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OnboardedLinkBatch"]}," locally and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["makes no Onboarded™ API calls"]}," — it resolves lookups purely from data already in Salesforce."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Open Onboarded™ Setup."]}," Navigate to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Operation Settings"]}," section."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Locate the Link References panel."]}," Under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Link References"]},", click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Run Links Now"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Choose the object."]}," A modal opens listing ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["only"]}," the Onboarded™ objects that have at least one Reference Relationship mapping configured (so you can't pick an object with nothing to link). Select the object whose reference you just enabled, then click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Run"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["On success you'll see a confirmation that the link job started for the selected object; the linkage runs asynchronously across all of that object's records."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requirements and behavior:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin-only."]}," Only users with the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Onboarded™ Admin"]}," permission set can run it (gated in the UI, re-checked server-side)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requires Link References enabled."]}," The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enable Link References"]}," toggle must be on; otherwise you're prompted to enable it first. (With it off, the underlying batch is a no-op by design.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Object must have Reference mappings."]}," Only objects that actually have a Reference Relationship mapping are offered in the picker, and the server rejects any other object."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Concurrency guard."]}," Only one link batch runs at a time; if one is already active, a new attempt is rejected until it finishes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Single-object scope."]}," Each run relinks exactly the object you selected — nothing else is touched. This keeps the operation inexpensive on orgs with millions of records."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Local-only and idempotent."]}," No API calls; it re-resolves lookups from already-synced data, so it's safe to run repeatedly."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["When to use:"]}," immediately after you add and enable a Reference Relationship mapping for an object whose records are already in Salesforce, to populate the new lookup across the existing records. For ongoing linkage of newly-synced records, the inline resolution and the scheduled ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Link Data"]}," phase handle it automatically."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"sync-queueable-operations-on-demand-queue-recovery","__idx":9},"children":["Sync Queueable Operations (On-Demand Queue Recovery)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Outbound work that can't be pushed immediately is deferred to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#sync-queue"},"children":["Sync Queue"]}]}," and drained by a background processor. Normally this is fully automatic. Occasionally, though, records can be left ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["waiting"]}," — for example if a processing job stopped before it finished, or a large burst was deferred and no later event has come along to resume it. When that happens the queued records sit unprocessed until something restarts the drain."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sync Queueable Operations"]}," is a self-service recovery panel that detects this condition and lets an admin restart processing with one click. It appears ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["only when it's needed"]}," and drains the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["entire"]}," backlog safely."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Open Onboarded™ Setup."]}," Navigate to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Operation Settings"]}," section."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Look for the Sync Queueable Operations panel."]}," It appears automatically ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["only when"]}," there are records waiting in the Sync Queue (status ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pending"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Processing"]},") ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["and"]}," no processor job is currently running. If the queue is healthy or already being processed, the panel is hidden."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Click Process Sync Queue."]}," On success you'll see: ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"Sync Queue processing has been restarted.\""]}," Processing runs asynchronously and works through the whole backlog; the panel disappears on the next load once a processor is running."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requirements and behavior:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin-only."]}," Only users with the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Onboarded™ Admin"]}," permission set can run it (gated in the UI, re-checked server-side). A non-admin attempt is rejected with ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"You do not have permission to process the Sync Queue.\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Appears regardless of the scheduled-jobs toggle."]}," The panel is a recovery tool, so it surfaces whether or not ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enable Scheduled Jobs"]}," is turned on — a stranded queue can be restarted at any time."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Conditional visibility."]}," The panel is shown only when there is at least one actionable row (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pending"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Processing"]},") and no processor Queueable is active. This keeps the Setup page clean when there's nothing to do."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reclaims stranded rows."]}," Because the panel only appears when no processor is running, any row still marked ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Processing"]}," is provably orphaned. Clicking the button resets those rows back to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pending"]}," and restarts the drain, so nothing is left behind."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Drains the whole backlog in safe slices."]}," The processor works through a bounded number of records per transaction and automatically chains itself to continue, so a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["single click"]}," recovers the entire queue without hitting Salesforce governor limits — and the paced slices naturally ease back into any Onboarded™ API rate limits that may have caused the backlog."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Concurrency guard."]}," If a processor is already draining the queue, a new attempt is rejected with ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"The Sync Queue is already being processed. Please wait for the current job to finish.\""]}," (In that case the panel is normally hidden already.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Nothing to do."]}," If there are no actionable rows, the action reports ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["\"There are no Sync Queue records that need processing.\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Safe to run."]}," The operation only restarts processing of records that are already queued; it never creates new work."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["When to use:"]}," if you notice records lingering in the Sync Queue (for example, rows stuck in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Processing"]}," with an old last-attempt time, or a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pending"]}," backlog that isn't shrinking), open ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Operation Settings"]}," and click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Process Sync Queue"]},". For day-to-day operation no action is needed — the queue drains on its own."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"batch-sync-exemption-rules","__idx":10},"children":["Batch Sync Exemption Rules"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Batch Sync Exemption Rules"]}," allow you to exclude specific records from being synced based on field values in the Onboarded™ API response. This is useful when you want to filter out certain records before they are created or updated in Salesforce."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Feed-only."]}," Exemption rules are evaluated by the event-feed poller only. The real-time webhook does not consult exemption rules — a webhook delivery for an otherwise-exempted record still applies, consistent with the webhook always processing what Onboarded™ pushes (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#feed-vs-webhook-scoping"},"children":["Feed vs. Webhook Scoping"]},")."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"exemption-rule-mechanics","__idx":11},"children":["Exemption Rule Mechanics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the poller applies a page of events, API records are checked against active exemption rules ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["before"]}," being processed. Records that match any active exemption rule are excluded from that sync operation."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"exemption-rule-creation","__idx":12},"children":["Exemption Rule Creation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Exemption rules can be configured in the Onboarded™ Setup interface. Each rule requires:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Onboarded™ Object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The Onboarded™ object type this rule applies to (e.g., Employee, Employer, Task)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Onboarded™ API Field"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The API field name to evaluate. Supports nested fields using dot notation (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address.city"]},")"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Match Type"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["How to evaluate the field value (see match types below)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exemption Value"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The value to match against (required for \"equals\" match type)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Is Active"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Toggle to enable or disable the rule"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"match-types","__idx":13},"children":["Match Types"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Match Type"},"children":["Match Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Example Use Case"},"children":["Example Use Case"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["equals"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field value exactly matches the exemption value"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exclude employees where ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," equals ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terminated"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isBlank"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field value is null, empty, or whitespace"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exclude records where ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," is blank"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isNotBlank"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field value is not null and not empty"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exclude records that have a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["do_not_sync"]}," flag populated"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"example-exemption-rules","__idx":14},"children":["Example Exemption Rules"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Exclude terminated employees:"]}," Onboarded™ Object = Employee, API Field = ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},", Match Type = equals, Value = ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terminated"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Exclude test records:"]}," Onboarded™ Object = Employee, API Field = ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", Match Type = equals, Value = ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["test@example.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Exclude records without email:"]}," Onboarded™ Object = Employee, API Field = ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", Match Type = isBlank"]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," Exempted records are counted in sync statistics but are not created or updated in Salesforce. If an exemption rule is later deactivated or removed, previously exempted records will be synced the next time the poller processes an event for them (a past event for that record is not automatically replayed — the exemption simply stops applying going forward)."]}]}]},"headings":[{"value":"Data Operation Settings","id":"data-operation-settings","depth":2},{"value":"Scheduled Sync Setup","id":"scheduled-sync-setup","depth":3},{"value":"Setup UI Method","id":"setup-ui-method","depth":4},{"value":"Delete Operations","id":"delete-operations","depth":3},{"value":"Common CRON Expressions","id":"common-cron-expressions","depth":3},{"value":"Batch Size Configuration","id":"batch-size-configuration","depth":3},{"value":"Batch Size Tuning","id":"batch-size-tuning","depth":4},{"value":"Forms Reset (On-Demand Full Catalog Pull)","id":"forms-reset-on-demand-full-catalog-pull","depth":3},{"value":"Run Links Now (On-Demand, Per-Object Linkage)","id":"run-links-now-on-demand-per-object-linkage","depth":3},{"value":"Sync Queueable Operations (On-Demand Queue Recovery)","id":"sync-queueable-operations-on-demand-queue-recovery","depth":3},{"value":"Batch Sync Exemption Rules","id":"batch-sync-exemption-rules","depth":3},{"value":"Exemption Rule Mechanics","id":"exemption-rule-mechanics","depth":4},{"value":"Exemption Rule Creation","id":"exemption-rule-creation","depth":4},{"value":"Match Types","id":"match-types","depth":4},{"value":"Example Exemption Rules","id":"example-exemption-rules","depth":4}],"frontmatter":{"seo":{"title":"Data Operation Settings"}},"lastModified":"2026-08-27T18:30:57.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/onboarded_for_salesforce/data_operations_settings","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}