Reviewing job runs and their logs in the backoffice
The Jobs page lists all sync and replication jobs for the Organization. Each row shows the job type, domain, status, when it was created, and what it changed.
The Changes column summarizes what the job wrote. For a replication job, that is what it wrote to the target system: the sections it touched and the fields it changed, for example “Salaries +1, Bank account nr”. For an employee sync job, it is what the sync changed in Twine: the properties it changed, and the job’s page adds how many employees each one changed for. It shows names only. The values themselves are only in the job’s log.
No changes means the job compared the employees with the other side and found nothing to write.
Not recorded means Twine cannot say whether the job changed anything. Jobs that ran before this was introduced (September 2026) read this way. So do syncs of anything but employees, replication to the few systems that cannot compare, such as file exports, and jobs that wrote parts Twine does not record yet when none of the parts it does record changed: some systems’ replicated salary or employment history, or the work schedules a Hibob sync brings in. It does not mean nothing changed.
A dash means the job has not finished yet, or was skipped.
Two filters build on this:
Changes narrows the list to jobs that changed something, changed nothing, had changes held back (for example by a merge conflict), or did not record.
Changed fields finds the jobs that changed any of the fields you name. You can use a Twine property name (salary_amount), a field name in the target system, or a section name (salaries), separated by commas.
Combined with the IDs filter, this answers “which jobs changed this employee’s salary” directly.
Clicking a job opens its detail view. This page shows the job’s metadata, its current status, any descendant jobs (for example, the replication jobs spawned by a sync), and a streaming log of everything that happened during execution. The log is the primary surface for understanding what a job did and why it failed.A job’s log and its data are removed three months after the job ran. The job itself stays for 13 months, with its status, timing, Changes and Run, so older jobs can still be found and filtered, but they can no longer be requeued.The Changes card on the detail page lists what the job changed: each section with how many records were created, updated, deleted and kept, and the date the earliest change takes effect from, the Twine properties and target-system fields it wrote (inside a section too: a new salary names its amount and period), and anything it computed but held back, such as a section with a merge conflict. For an employee sync, it lists each Twine property with the number of employees it changed on and the earliest date the change takes effect from, and how many employees were created, updated or deactivated. Below it, Run shows how the job started (by its schedule, by someone in Twine, through the Public API, by a webhook or an SFTP upload, or as a requeue of another job), the software version that ran the job, a configuration fingerprint, and how many requests the job made to the system, with how many of them failed. Two jobs with the same fingerprint ran with the same mappings and settings. A different fingerprint usually means someone edited the configuration between them; it can also change once when a Twine update changes how an integration’s settings are stored, in which case the software version changes at the same job.
The detail page for a running job displays a terminate button. This kills the underlying process immediately rather than waiting for it to finish gracefully.
Termination is forceful - it stops the process without giving it a chance to complete its current step. While most operations run inside database transactions (so partial writes are rolled back), there is a small risk of inconsistent data if the job was mid-way through a non-transactional operation. Use this only when a job is stuck or needs to be stopped urgently.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Twine Integrations","colors":{"primary":"#7600ff","light":"#ad66ff","dark":"#7600ff"},"logo":{"light":"https://mintcdn.com/entwineab/W0WCY-b2dvTokvLn/logo/light.svg?fit=max\u0026auto=format\u0026n=W0WCY-b2dvTokvLn\u0026q=85\u0026s=7e70d0ec35e8816f98a512eafa2ad35b","dark":"https://mintcdn.com/entwineab/W0WCY-b2dvTokvLn/logo/dark.svg?fit=max\u0026auto=format\u0026n=W0WCY-b2dvTokvLn\u0026q=85\u0026s=bcf15f923005d67de257a74c061db962"},"favicon":"https://mintcdn.com/entwineab/OPi-j2jbIEGoK6fy/favicon.svg?fit=max\u0026auto=format\u0026n=OPi-j2jbIEGoK6fy\u0026q=85\u0026s=190facce372d84ae3de157af3da0688e","navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"},{"href":"https://app-stage.twine.se","label":"Stage"}],"primary":{"type":"button","label":"App","href":"https://app.twine.se"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"twine.se","icon":"globe","href":"https://www.twine.se"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"entwineab","hasAudioNarration":false,"actualSubdomain":"entwineab","customDomains":["docs.twine.se"],"gitSource":{"type":"github","owner":"twine-se","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6acf668b4788a74327b72032","collectionId":"027bd1b7-2940-449a-bfcf-f8ccfca1f9a2","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acf668b4788a74327b72032"},"entitlements":{},"buildId":"6acf668b4788a74327b72032","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API Reference","count":149},{"language":"default","tag":"Data Engine","count":86},{"language":"default","tag":"Integrations","count":72},{"language":"default","tag":"Flow Engine","count":41},{"language":"default","tag":"Platform","count":33},{"language":"default","tag":"Assigns","count":28},{"language":"default","tag":"Flow Control","count":19},{"language":"default","tag":"Transformation","count":19},{"language":"default","tag":"Changelog","count":18},{"language":"default","tag":"HRIS","count":14}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"backoffice/daily-operations/jobs","slug":"/backoffice/daily-operations/jobs","pageMetadata":{"title":"Inspecting Jobs","description":"Reviewing job runs and their logs in the backoffice","href":"/backoffice/daily-operations/jobs"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Reviewing job runs and their logs in the backoffice\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const Shot=({id,caption})=>{const screenshots={\"domain-mappings.sync-trigger-actions-employee\":{path:`images/backoffice/configuration/domain-mappings/sync-trigger-actions-employee.png`,caption:`Each sync trigger exposes action buttons for an ad-hoc sync and for editing the trigger configuration.`,w:2880,h:1800,highlights:[{key:`sync-now`,description:`Fires an immediate one-off sync without waiting for the next scheduled run. Handy when you want to see the effect of a configuration change right away.`,x:.8854,y:.5056,w:.025,h:.0511},{key:`edit`,description:`Opens the edit modal where the schedule, parent trigger, scheduled toggles, and any domain-specific settings for this trigger can be adjusted.`,x:.916,y:.5056,w:.025,h:.04}]},\"domain-mappings.sync-trigger-edit-employee\":{path:`images/backoffice/configuration/domain-mappings/sync-trigger-edit-employee.png`,caption:`The Edit Sync Trigger modal for a non-time-report mapping.`,w:900,h:1124,highlights:[{key:`cron-enabled`,description:`Controls whether the trigger fires automatically. When it is turned off, the trigger only runs if someone starts it manually.`,x:.0556,y:.3149,w:.2336,h:.0783},{key:`cron-expression`,description:`Standard cron syntax that determines when the trigger runs while the schedule is enabled.`,x:.3247,y:.3149,w:.6198,h:.1103},{key:`scheduled-toggles`,description:`Queues future flips of the enable state. Useful for pausing a trigger during a maintenance window and having it re-enable itself afterwards without manual intervention.`,x:.0556,y:.468,w:.8889,h:.2349},{key:`parent-trigger`,description:`Chains this trigger to run immediately after another one completes, so dependent syncs always happen in the right order.`,x:.0556,y:.7456,w:.8889,h:.1032}]},\"domain-mappings.sync-trigger-actions-time-report\":{path:`images/backoffice/configuration/domain-mappings/sync-trigger-actions-time-report.png`,caption:`Time-report mappings expose the same sync trigger actions as other domains.`,w:2880,h:1800,highlights:[{key:`sync-now`,description:`Fires an immediate sync. On time-report mappings this first opens a small dialog for picking the date range to pull before the sync actually runs.`,x:.8854,y:.5056,w:.025,h:.0511},{key:`edit`,description:`Opens the edit modal. For a time-report mapping this exposes an extra section for the default date range the scheduled sync should cover.`,x:.916,y:.5056,w:.025,h:.04}]},\"domain-mappings.sync-trigger-edit-time-report\":{path:`images/backoffice/configuration/domain-mappings/sync-trigger-edit-time-report.png`,caption:`The Edit Sync Trigger modal for a time-report mapping exposes an extra date-range section.`,w:900,h:1388,highlights:[{key:`cron-enabled`,description:`Controls whether the trigger fires automatically. When it is turned off, the trigger only runs if someone starts it manually.`,x:.0556,y:.255,w:.2336,h:.0634},{key:`cron-expression`,description:`Standard cron syntax that determines when the trigger runs while the schedule is enabled.`,x:.3247,y:.255,w:.6198,h:.0893},{key:`scheduled-toggles`,description:`Queues future flips of the enable state. Useful for pausing a trigger during a maintenance window and having it re-enable itself afterwards without manual intervention.`,x:.0556,y:.379,w:.8889,h:.1902},{key:`parent-trigger`,description:`Chains this trigger to run immediately after another one completes, so dependent syncs always happen in the right order.`,x:.0556,y:.6037,w:.8889,h:.0836},{key:`time-report-settings`,description:`Defines which date range the sync should pull time reports for. The start and end dates can each be either a fixed date or a dynamic expression evaluated at run time.`,x:.0556,y:.7219,w:.8889,h:.1556}]},\"domain-mappings.employee-outgoing\":{path:`images/backoffice/configuration/domain-mappings/employee-outgoing.png`,caption:`An outgoing Employee → Employee mapping pushes Twine employee data into a target system.`,w:2880,h:1800},\"domain-mappings.time-report\":{path:`images/backoffice/configuration/domain-mappings/time-report.png`,caption:`Time report mappings include a dedicated time-code mapping section alongside the standard configuration.`,w:2880,h:1800,highlights:[{key:`time-code-mapping`,description:`Appears only on time report to time report mappings. Lines up each time code in the source system with the matching Twine time code so reported hours land in the right bucket downstream.`,x:.1778,y:.4256,w:.4,h:.5567}]},\"jobs.details\":{path:`images/backoffice/daily-operations/jobs/details.png`,caption:`The Job Details page shows everything about a single sync job — its metadata, status, descendants, and streaming logs.`,w:2880,h:1800},\"system-integration-settings.authentication\":{path:`images/backoffice/configuration/system-integration-settings/authentication.png`,caption:`The Authentication sub-tab holds credentials and a sharable authentication URL generator.`,w:2880,h:1800,highlights:[{key:`generate-url-button`,description:`Generates a one-time shareable URL that lets a customer without a Twine login enter their own credentials. The link stays valid for five days.`,x:.816,y:.3378,w:.1555,h:.04}]},\"system-integration-settings.authentication-url-generated\":{path:`images/backoffice/configuration/system-integration-settings/authentication-url-generated.png`,caption:`After clicking Generate Authentication URL, the card displays the shareable link with a copy button.`,w:872,h:948,highlights:[{key:`copy-button`,description:`Copies the generated link to the clipboard so it can be pasted into an email or chat to the customer.`,x:.8945,y:.692,w:.0275,h:.0253}]},\"system-integration-settings.general\":{path:`images/backoffice/configuration/system-integration-settings/general.png`,caption:`The General sub-tab holds system-specific settings that are not credentials.`,w:2880,h:1800,highlights:[{key:`system-specific-card`,description:`Holds configuration that is specific to the connected system and unrelated to authentication. The exact fields depend on which integration is selected.`,x:.6861,y:.2633,w:.3028,h:.28}]},\"system-integration-settings.time-reports\":{path:`images/backoffice/configuration/system-integration-settings/time-reports.png`,caption:`The Time Reports \u0026 Types sub-tab configures how source time codes map to Twine time codes.`,w:2880,h:1800,highlights:[{key:`refresh-button`,description:`Re-fetches the current time-type catalogue from the connected system so the mapping list picks up anything that has been added or removed upstream.`,x:.3896,y:.9144,w:.1529,h:.04}]},\"system-integrations.admin\":{path:`images/backoffice/configuration/system-integrations/admin.png`,caption:`The Admin tab exposes destructive and one-shot administrative actions for a system integration.`,w:2880,h:1800},\"system-integrations.domains-overview\":{path:`images/backoffice/configuration/system-integrations/domains-overview.png`,caption:`The Domains tab lists outgoing and incoming domain mappings for this system integration.`,w:2880,h:1800,highlights:[{key:`create-button`,description:`Opens a dialog where you pick the direction, target integration, and source and target domains for a new mapping.`,x:.8297,y:.2633,w:.1592,h:.04}]},\"system-integrations.domains-create-dialog\":{path:`images/backoffice/configuration/system-integrations/domains-create-dialog.png`,caption:`The Create Domain Mapping dialog starts with the direction radio and an empty form.`,w:900,h:964},\"system-integrations.domains-create-dialog-filled\":{path:`images/backoffice/configuration/system-integrations/domains-create-dialog-filled.png`,caption:`Once a target system integration and source/target domains are selected, the Create button unlocks.`,w:900,h:964},\"anomalies.list\":{path:`images/backoffice/daily-operations/anomalies/list.png`,caption:`The Anomalies page lists issues grouped by severity, system, and status.`,w:2880,h:1800},\"entity-matcher.integration-overview\":{path:`images/backoffice/configuration/entity-matcher/integration-overview.png`,caption:`The Entity Matcher is accessed from the overview page of a System Integration.`,w:2880,h:1800},\"entity-matcher.filter-form\":{path:`images/backoffice/configuration/entity-matcher/filter-form.png`,caption:`Select a domain and match field before searching for entity matches.`,w:1536,h:300},\"entity-matcher.search-results\":{path:`images/backoffice/configuration/entity-matcher/search-results.png`,caption:`Local entities on the left, remote candidate entities in the dropdowns on the right.`,w:1536,h:800},\"integrations.alexis_hr.system-settings\":{path:`images/integrations/screenshots/alexis_hr/system-settings.png`,caption:`The system-specific settings tab for Alexis HR on its configured integration.`,w:2880,h:1800},\"jobs.list\":{path:`images/backoffice/daily-operations/jobs/list.png`,caption:`The Jobs page shows sync jobs with their type, domain, status, and creation time.`,w:2880,h:1800},\"notifications.settings\":{path:`images/backoffice/configuration/notifications/settings.png`,caption:`Notification settings control which events trigger alerts and who receives them.`,w:2880,h:1800},\"roles.list\":{path:`images/backoffice/configuration/roles/list.png`,caption:`The Roles page lets you define roles and the rules that govern access within an organization.`,w:2880,h:1800},\"roles.quick-start-wizard\":{path:`images/backoffice/configuration/roles/quick-start-wizard.png`,caption:`The Quick start wizard creates a preconfigured Org admin or Org user role in one step.`,w:1060,h:928},\"roles.detail-sheet\":{path:`images/backoffice/configuration/roles/detail-sheet.png`,caption:`Clicking a role opens a detail sheet showing metadata, tokens, and a link to manage rules.`,w:2880,h:1800},\"roles.rules-page\":{path:`images/backoffice/configuration/roles/rules-page.png`,caption:`The rules page shows all rules for a role. Expanding a rule reveals its TERLs.`,w:2880,h:1800},\"roles.edit-rule\":{path:`images/backoffice/configuration/roles/edit-rule.png`,caption:`The rule editor lets you configure a rule name, policy, actions, and TERLs.`,w:1344,h:1232},\"roles.tokens-add-form\":{path:`images/backoffice/configuration/roles/tokens-add-form.png`,caption:`Add a new API or refresh token to a role by filling in the name and type.`,w:1344,h:1800},\"roles.token-created\":{path:`images/backoffice/configuration/roles/token-created.png`,caption:`After creating a token, copy it immediately — it is only shown once.`,w:1344,h:1800},\"roles.tokens-list\":{path:`images/backoffice/configuration/roles/tokens-list.png`,caption:`The Tokens table shows every active API and refresh token for the role.`,w:1344,h:1800},\"roles.token-revoked\":{path:`images/backoffice/configuration/roles/token-revoked.png`,caption:`Revoking a token immediately invalidates it. Revoked tokens disappear from the list.`,w:1344,h:1800},\"roles.add-terl\":{path:`images/backoffice/configuration/roles/add-terl.png`,caption:`Click \"Add new TERL\" to add a resource target to a rule.`,w:1344,h:1536},\"system-data.employee-detail\":{path:`images/backoffice/data/system-data/employee-detail.png`,caption:`Selecting an employee opens a detail view with properties, metadata, and source data inspection tools.`,w:2880,h:1800},\"system-data.time-reports-employee\":{path:`images/backoffice/data/system-data/time-reports-employee.png`,caption:`Filter time reports by employee and date range to see reported time across a specific period.`,w:2880,h:1800},\"system-data.employees-list\":{path:`images/backoffice/data/system-data/employees-list.png`,caption:`The Employees table shows every employee ingested from the connected source systems.`,w:2880,h:1800},\"system-data.time-reports\":{path:`images/backoffice/data/system-data/time-reports.png`,caption:`Time Reports displays a calendar-style grid of reported time, grouped by employee or time code.`,w:2880,h:1800},\"system-integration-settings.metadata\":{path:`images/backoffice/configuration/system-integration-settings/metadata.png`,caption:`The Metadata sub-tab shows system-specific metadata fetched from the source system.`,w:2880,h:1800},\"templates.list\":{path:`images/backoffice/configuration/templates/list.png`,caption:`Mapping Templates define how data from a source system is mapped into Twine.`,w:2880,h:1800}};const shot=screenshots[id];if(!shot)return _jsxs(`div`,{style:{color:`#dc2626`,padding:`12px`,border:`1px solid #dc2626`,borderRadius:`6px`,fontSize:`13px`,margin:`24px 0`},children:[`Screenshot not found: `,_jsx(`code`,{children:id})]});const displayCaption=caption||shot.caption;return _jsxs(`figure`,{style:{margin:`24px 0`},children:[_jsx(`img`,{src:`/${shot.path}`,alt:displayCaption||``,style:{width:`100%`,height:`auto`,borderRadius:`8px`,border:`1px solid rgb(var(--primary-light) / .15)`,boxShadow:`0 1px 3px rgb(0 0 0 / .06)`,display:`block`}}),displayCaption\u0026\u0026_jsx(`figcaption`,{style:{marginTop:`8px`,fontSize:`13px`,color:`var(--colors-content-secondary, #6b7280)`,textAlign:`center`,fontStyle:`italic`},children:displayCaption})]})};function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning,_MdxComponentBoundary}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The Jobs page lists all `,_jsx(_components.a,{href:`/platform/other/jobs`,children:`sync and replication jobs`}),` for the Organization. Each row shows the job type, domain, status, when it was created, and what it changed.`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`Shot`,children:_jsx(Shot,{id:`jobs.list`})}),`\n`,_jsx(Heading,{level:`2`,id:`what-a-job-changed`,children:`What a job changed`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Changes`}),` column summarizes what the job wrote. For a replication job, that is what it wrote to the target system: the sections it touched and the fields it changed, for example “Salaries +1, Bank account nr”. For an employee sync job, it is what the sync changed in Twine: the properties it changed, and the job’s page adds how many employees each one changed for. It shows names only. The values themselves are only in the job’s log.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No changes`}),` means the job compared the employees with the other side and found nothing to write.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Not recorded`}),` means Twine cannot say whether the job changed anything. Jobs that ran before this was introduced (September 2026) read this way. So do syncs of anything but employees, replication to the few systems that cannot compare, such as file exports, and jobs that wrote parts Twine does not record yet when none of the parts it does record changed: some systems’ replicated salary or employment history, or the work schedules a Hibob sync brings in. It does not mean nothing changed.`]}),`\n`,_jsx(_components.li,{children:`A dash means the job has not finished yet, or was skipped.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Two filters build on this:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Changes`}),` narrows the list to jobs that changed something, changed nothing, had changes held back (for example by a merge conflict), or did not record.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Changed fields`}),` finds the jobs that changed any of the fields you name. You can use a Twine property name (`,_jsx(_components.code,{children:`salary_amount`}),`), a field name in the target system, or a section name (`,_jsx(_components.code,{children:`salaries`}),`), separated by commas.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Combined with the `,_jsx(_components.strong,{children:`IDs`}),` filter, this answers “which jobs changed this employee’s salary” directly.`]}),`\n`,_jsx(Heading,{level:`2`,id:`job-details`,children:`Job details`}),`\n`,_jsx(_components.p,{children:`Clicking a job opens its detail view. This page shows the job’s metadata, its current status, any descendant jobs (for example, the replication jobs spawned by a sync), and a streaming log of everything that happened during execution. The log is the primary surface for understanding what a job did and why it failed.`}),`\n`,_jsxs(_components.p,{children:[`A job’s log and its data are removed three months after the job ran. The job itself stays for 13 months, with its status, timing, `,_jsx(_components.strong,{children:`Changes`}),` and `,_jsx(_components.strong,{children:`Run`}),`, so older jobs can still be found and filtered, but they can no longer be requeued.`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`Shot`,children:_jsx(Shot,{id:`jobs.details`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Changes`}),` card on the detail page lists what the job changed: each section with how many records were created, updated, deleted and kept, and the date the earliest change takes effect from, the Twine properties and target-system fields it wrote (inside a section too: a new salary names its amount and period), and anything it computed but held back, such as a section with a merge conflict. For an employee sync, it lists each Twine property with the number of employees it changed on and the earliest date the change takes effect from, and how many employees were created, updated or deactivated. Below it, `,_jsx(_components.strong,{children:`Run`}),` shows how the job started (by its schedule, by someone in Twine, through the Public API, by a webhook or an SFTP upload, or as a requeue of another job), the software version that ran the job, a configuration fingerprint, and how many requests the job made to the system, with how many of them failed. Two jobs with the same fingerprint ran with the same mappings and settings. A different fingerprint usually means someone edited the configuration between them; it can also change once when a Twine update changes how an integration’s settings are stored, in which case the software version changes at the same job.`]}),`\n`,_jsx(Heading,{level:`3`,id:`terminating-a-running-job`,children:`Terminating a running job`}),`\n`,_jsxs(_components.p,{children:[`The detail page for a running job displays a `,_jsx(_components.strong,{children:`terminate`}),` button. This kills the underlying process immediately rather than waiting for it to finish gracefully.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Termination is forceful - it stops the process without giving it a chance to complete its current step. While most operations run inside database transactions (so partial writes are rolled back), there is a small risk of inconsistent data if the job was mid-way through a non-transactional operation. Use this only when a job is stuck or needs to be stopped urgently.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{Shot,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Inspecting Jobs","description":"Reviewing job runs and their logs in the backoffice","href":"/backoffice/daily-operations/jobs"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[140,13067,")=>null;function _cr"]]},"mdxExtracts":{"tableOfContents":[{"title":"What a job changed","slug":"what-a-job-changed","depth":2,"children":[]},{"title":"Job details","slug":"job-details","depth":2,"children":[{"title":"Terminating a running job","slug":"terminating-a-running-job","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"entwineab","siteName":"Twine Integrations","title":"Inspecting Jobs - Twine Integrations","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T10:13:42.315Z","originalFileLocation":"backoffice/daily-operations/jobs.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Reviewing job runs and their logs in the backoffice\">\u003cmeta data-mint-head name=\"application-name\" content=\"Twine Integrations\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Inspecting Jobs - Twine Integrations\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reviewing job runs and their logs in the backoffice\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Twine Integrations\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.twine.se/backoffice/daily-operations/jobs\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://entwineab.mintlify.app/_mintlify/api/og/v2?division=Daily+operations\u0026amp;title=Inspecting+Jobs\u0026amp;description=Reviewing+job+runs+and+their+logs+in+the+backoffice\u0026amp;theme=30a0ce2375f0bc6afd332c94\u0026amp;signature=68ab527e253a47029fb20ba501b55dcf15b77b8f088783087c35e9c68612a77b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Inspecting Jobs - Twine Integrations\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reviewing job runs and their logs in the backoffice\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://entwineab.mintlify.app/_mintlify/api/og/v2?division=Daily+operations\u0026amp;title=Inspecting+Jobs\u0026amp;description=Reviewing+job+runs+and+their+logs+in+the+backoffice\u0026amp;theme=30a0ce2375f0bc6afd332c94\u0026amp;signature=68ab527e253a47029fb20ba501b55dcf15b77b8f088783087c35e9c68612a77b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/entwineab/8LV-a3cLiAT4An4I/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Twine Integrations\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7600ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.twine.se/backoffice/daily-operations/jobs\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/backoffice/daily-operations/jobs.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.twine.se/#organization\",\"name\":\"Twine Integrations\",\"url\":\"https://docs.twine.se\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/entwineab/W0WCY-b2dvTokvLn/logo/light.svg?fit=max\u0026auto=format\u0026n=W0WCY-b2dvTokvLn\u0026q=85\u0026s=7e70d0ec35e8816f98a512eafa2ad35b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.twine.se#website\",\"name\":\"Twine Integrations\",\"url\":\"https://docs.twine.se\",\"publisher\":{\"@id\":\"https://docs.twine.se/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.twine.se/backoffice/daily-operations/jobs#webpage\",\"url\":\"https://docs.twine.se/backoffice/daily-operations/jobs\",\"name\":\"Inspecting Jobs\",\"description\":\"Reviewing job runs and their logs in the backoffice\",\"dateModified\":\"2026-09-30T10:13:42.315Z\",\"isPartOf\":{\"@id\":\"https://docs.twine.se#website\"},\"breadcrumb\":{\"@id\":\"https://docs.twine.se/backoffice/daily-operations/jobs#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.twine.se/backoffice/daily-operations/jobs#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Daily operations\",\"item\":\"https://docs.twine.se/backoffice/daily-operations/anomalies\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Inspecting Jobs\",\"item\":\"https://docs.twine.se/backoffice/daily-operations/jobs\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.twine.se/backoffice/daily-operations/jobs#article\",\"headline\":\"Inspecting Jobs\",\"name\":\"Inspecting Jobs\",\"description\":\"Reviewing job runs and their logs in the backoffice\",\"url\":\"https://docs.twine.se/backoffice/daily-operations/jobs\",\"mainEntityOfPage\":{\"@id\":\"https://docs.twine.se/backoffice/daily-operations/jobs#webpage\"},\"dateModified\":\"2026-09-30T10:13:42.315Z\",\"publisher\":{\"@id\":\"https://docs.twine.se/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.twine.se#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Twine Integrations\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Twine Integrations","nav":{"global":{"anchors":[{"anchor":"twine.se","icon":"globe","href":"https://www.twine.se"}]},"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":"/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations"}]},{"tab":"Platform","pages":[{"title":"Platform","href":"/platform"}]},{"tab":"Backoffice","groups":[{"group":"Backoffice","pages":[{"title":"Backoffice","sidebarTitle":"Overview","href":"/backoffice"}]},{"group":"Daily operations","pages":[{"title":"Working with Anomalies","description":"Viewing, clearing, and routing anomalies in the backoffice","href":"/backoffice/daily-operations/anomalies"},{"title":"Inspecting Jobs","href":"/backoffice/daily-operations/jobs"}]},{"group":"Configuration","pages":[{"title":"System Integrations","description":"Configuring a system integration in the backoffice","href":"/backoffice/configuration/system-integrations"},{"title":"Domain Mappings","href":"/backoffice/configuration/domain-mappings"},{"title":"Entity Matcher","href":"/backoffice/configuration/entity-matcher"},{"title":"Templates","href":"/backoffice/configuration/templates"},{"title":"Configuring Notifications","href":"/backoffice/configuration/notifications"}]},{"group":"Data","pages":[{"title":"System Data","href":"/backoffice/data/system-data"}]}]},{"tab":"Flow Engine","pages":[{"title":"Flow Engine","href":"/flow-engine"}]},{"tab":"Data Engine","pages":[{"title":"Data Engine","href":"/data-engine"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"title":"Inspecting Jobs - Twine Integrations","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}