This workflow corresponds to n8n.io template #15524 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "oHboaOboWU6mC5B1",
"name": "Archive Outlook email attachments to DATEV DMS",
"tags": [],
"nodes": [
{
"id": "57136696-34e2-456c-8005-f524a3d6d9da",
"name": "Sticky Note - Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": "#FBEC8E",
"width": 1040,
"height": 552,
"content": "## Archive Outlook email attachments to DATEV DMS and notify Slack\nThis template watches Microsoft Outlook for emails with attachments, matches the email to exactly one DATEV client, archives document attachments in DATEV DMS, and sends a minimal Slack success notification.\n\n### How it works\n1. Outlook triggers only for emails with attachments that are not already marked as archived or review required.\n2. The workflow extracts a demo client hint from the subject, looks up matching DATEV master data, and sends ambiguous matches to review.\n3. Archiveable attachments are uploaded to DATEV DMS, document entries are created, and Outlook is marked only after DATEV processing succeeds.\n4. Slack receives a privacy-minimal notification with document count and execution ID.\n\n### Setup\n- [ ] Install the verified Klardaten DATEVconnect community nodes in an n8n instance that supports community nodes.\n- [ ] Connect Microsoft Outlook, DATEVconnect, and Slack credentials.\n- [ ] Select your Slack channel in the Slack node.\n- [ ] Update client matching and DATEV DMS metadata in `Template - Configure variables`.\n\n### Requirements\nMicrosoft Outlook, Slack, DATEVconnect access, and the Klardaten DATEVconnect nodes.\n\n### Customization\nBefore production use, add a real client matching source, duplicate detection, monitoring, an error workflow, and a manual review queue."
},
"typeVersion": 1
},
{
"id": "0e646d62-2116-43db-884c-c8c87f6211a5",
"name": "Sticky Note - Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
592
],
"parameters": {
"color": 7,
"width": 512,
"height": 304,
"content": "## 1. Outlook trigger and variables\nThe trigger downloads attachment binaries directly. Edit `Template - Configure variables` to change the demo client hint settings, review/archive categories, and DATEV DMS metadata."
},
"typeVersion": 1
},
{
"id": "beacce99-f18f-4abb-8250-e42a6dc21cc3",
"name": "Sticky Note - Client matching",
"type": "n8n-nodes-base.stickyNote",
"position": [
544,
560
],
"parameters": {
"color": 7,
"width": 800,
"height": 336,
"content": "## 2. Demo client match\nThe workflow derives a company hint from the subject and builds a DATEV client filter. The lookup returns up to 100 matches so no match or multiple matches go to review instead of automatic archiving."
},
"typeVersion": 1
},
{
"id": "97830130-9564-412d-89fc-388fabea5378",
"name": "Sticky Note - Attachments",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
496
],
"parameters": {
"color": 7,
"width": 512,
"height": 400,
"content": "## 3. Attachment filtering\nEach Outlook binary attachment is converted into a separate item named data for the DATEV upload node. Calendar/contact files and likely small signature images are filtered out. If nothing archiveable remains, the email goes to review."
},
"typeVersion": 1
},
{
"id": "687fb8f0-8be7-4ad1-8b9f-6923e2635261",
"name": "Sticky Note - DMS upload",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
336
],
"parameters": {
"color": 7,
"width": 736,
"height": 640,
"content": "## 4. DATEV DMS upload\nThe file upload and document creation remain separate DATEV DMS steps. Review class, folder, domain, and period rules in `Template - Configure variables` before using real firm data."
},
"typeVersion": 1
},
{
"id": "1b5f2dbb-6d42-48e1-b01b-1014057bdad3",
"name": "Sticky Note - Completion",
"type": "n8n-nodes-base.stickyNote",
"position": [
2720,
496
],
"parameters": {
"color": 7,
"width": 912,
"height": 480,
"content": "## 5. Completion and review states\nSuccessful DATEV archives mark Outlook as DMS_ARCHIVED, read, and moved to Archive. Slack is best-effort and privacy-minimal. Client-match failures or emails without archiveable attachments are marked DMS_REVIEW_REQUIRED for manual review."
},
"typeVersion": 1
},
{
"id": "8155d083-5c85-49a6-abd2-139a1a9dca6d",
"name": "Outlook - New email with attachments",
"type": "n8n-nodes-base.microsoftOutlookTrigger",
"position": [
64,
720
],
"parameters": {
"filters": {
"custom": "contains(subject,'GmbH') and not(categories/any(c:c eq 'DMS_ARCHIVED')) and not(categories/any(c:c eq 'DMS_REVIEW_REQUIRED'))",
"hasAttachments": true
},
"options": {
"attachmentsPrefix": "attachment_",
"downloadAttachments": true
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"microsoftOutlookOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "a9b66a33-83b8-4c58-bc65-830388942a9f",
"name": "Template - Configure variables",
"type": "n8n-nodes-base.set",
"position": [
336,
720
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f72b41af-c72b-445e-a820-51a9f2122c93",
"name": "templateConfig.clientSubjectHintLegalForms",
"type": "string",
"value": "gmbh,ug,ag,kg,ohg,gbr,e.k."
},
{
"id": "b077cbcf-a4d0-4bf4-9222-a4d903c31f3a",
"name": "templateConfig.clientFilterFallback",
"type": "string",
"value": "status eq active"
},
{
"id": "66f8e073-e84c-4a9e-86f5-00f201489eec",
"name": "templateConfig.reviewCategory",
"type": "string",
"value": "DMS_REVIEW_REQUIRED"
},
{
"id": "77f585d1-a401-4f0b-bf55-a5223567b7da",
"name": "templateConfig.archivedCategory",
"type": "string",
"value": "DMS_ARCHIVED"
},
{
"id": "f3985d27-261a-4b8f-bc6f-a16788d73e57",
"name": "templateConfig.dms.classId",
"type": "string",
"value": "1"
},
{
"id": "98c3eeb4-ce87-4c79-bcce-dc8a008ffaca",
"name": "templateConfig.dms.className",
"type": "string",
"value": "Dokument"
},
{
"id": "62bfd64f-3876-4b58-93f9-50407f0d8b65",
"name": "templateConfig.dms.domainId",
"type": "string",
"value": "1"
},
{
"id": "61fb6794-a617-439b-8724-1c38660cff32",
"name": "templateConfig.dms.domainName",
"type": "string",
"value": "Mandanten"
},
{
"id": "0db16d5d-ec2a-4ee5-9563-b4a8b409117b",
"name": "templateConfig.dms.folderId",
"type": "string",
"value": "2"
},
{
"id": "0b4dd471-f31f-45b3-a588-b564de8fdc99b",
"name": "templateConfig.dms.folderName",
"type": "string",
"value": "<Keine Angabe>"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "e1b47b23-773d-4dab-a329-321efb3cc581",
"name": "Demo - Configure processing",
"type": "n8n-nodes-base.code",
"position": [
576,
720
],
"parameters": {
"jsCode": "const item = $input.first();\nconst source = item.json ?? {};\nconst templateConfig = source.templateConfig ?? {};\nconst receivedAt = source.receivedDateTime ?? source.receivedDate ?? source.createdDateTime ?? new Date().toISOString();\nconst subject = String(source.subject ?? '');\n\nfunction escapeODataString(value) {\n return String(value).replace(/'/g, \"''\");\n}\n\nfunction getConfig(path, fallback) {\n const nestedValue = path.split('.').reduce((value, key) => value?.[key], templateConfig);\n if (nestedValue !== undefined && nestedValue !== null && nestedValue !== '') return nestedValue;\n\n const dottedValue = source[`templateConfig.${path}`];\n if (dottedValue !== undefined && dottedValue !== null && dottedValue !== '') return dottedValue;\n\n return fallback;\n}\n\nfunction splitList(value, fallback) {\n return String(value || fallback)\n .split(',')\n .map(item => item.trim().toLowerCase())\n .filter(Boolean);\n}\n\nconst legalForms = new Set(splitList(getConfig('clientSubjectHintLegalForms', 'gmbh,ug,ag,kg,ohg,gbr,e.k.')));\n\nfunction extractCompanyNameFromSubject(value) {\n const cleaned = String(value ?? '').replace(/[\\[\\](){},;:]/g, ' ');\n const tokens = cleaned.split(/\\s+/).filter(Boolean);\n const leadingNoise = new Set(['invoice', 'rechnung', 'beleg', 'document', 'dokument', 'for', 'f\u00fcr', 'from', 'von', 'client', 'kunde', 'attachment', 'anhang']);\n\n for (const [index, token] of tokens.entries()) {\n if (!legalForms.has(token.toLowerCase())) continue;\n\n const start = Math.max(0, index - 3);\n const candidateTokens = tokens.slice(start, index + 1);\n while (candidateTokens.length > 1 && leadingNoise.has(candidateTokens[0].toLowerCase())) {\n candidateTokens.shift();\n }\n\n return candidateTokens.join(' ').trim();\n }\n\n return null;\n}\n\nconst fallbackClientFilter = getConfig('clientFilterFallback', 'status eq active');\nconst companyNameFromSubject = extractCompanyNameFromSubject(subject);\nconst datevClientFilter = companyNameFromSubject\n ? `status eq active and name eq '${escapeODataString(companyNameFromSubject)}'`\n : fallbackClientFilter;\n\nreturn [\n {\n json: {\n ...source,\n email: {\n messageId: source.id,\n receivedAt,\n hasAttachments: source.hasAttachments === true,\n },\n demoConfig: {\n datevClientFilter,\n clientMatchHint: {\n source: companyNameFromSubject ? 'subject_company_name' : 'fallback_review',\n companyName: companyNameFromSubject,\n },\n reviewCategory: getConfig('reviewCategory', 'DMS_REVIEW_REQUIRED'),\n archivedCategory: getConfig('archivedCategory', 'DMS_ARCHIVED'),\n dms: {\n classId: getConfig('dms.classId', '1'),\n className: getConfig('dms.className', 'Dokument'),\n domainId: getConfig('dms.domainId', '1'),\n domainName: getConfig('dms.domainName', 'Mandanten'),\n folderId: getConfig('dms.folderId', '2'),\n folderName: getConfig('dms.folderName', '<Keine Angabe>'),\n },\n },\n },\n binary: item.binary,\n },\n];"
},
"typeVersion": 2
},
{
"id": "1fadf2df-961c-4d2c-929e-979415187071",
"name": "DATEV - Look up demo client",
"type": "@klardaten/n8n-nodes-datevconnect.masterData",
"position": [
816,
720
],
"parameters": {
"filter": "={{ $json.demoConfig.datevClientFilter }}"
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"id": "8751cfd9-e517-4174-b2ab-a626fab3161f",
"name": "Demo - Evaluate client match",
"type": "n8n-nodes-base.code",
"position": [
1024,
720
],
"parameters": {
"jsCode": "const configItem = $('Demo - Configure processing').first();\nconst source = configItem.json;\nconst clients = $input.all()\n .map(item => item.json ?? {})\n .filter(client => client.id);\n\nconst uniqueClients = Array.from(new Map(clients.map(client => [client.id, client])).values());\nconst status = uniqueClients.length === 1 ? 'exact' : uniqueClients.length === 0 ? 'not_found' : 'multiple';\n\nreturn [\n {\n json: {\n ...source,\n client: uniqueClients[0] ?? null,\n clientMatch: {\n status,\n count: uniqueClients.length,\n filter: source.demoConfig.datevClientFilter,\n checkedAt: new Date().toISOString(),\n },\n review: status === 'exact' ? null : {\n category: source.demoConfig.reviewCategory,\n reason: status === 'not_found'\n ? 'No DATEV client matched the demo filter.'\n : 'More than one DATEV client matched the demo filter.',\n },\n },\n },\n];"
},
"typeVersion": 2
},
{
"id": "36aa7af0-26ad-4412-8508-a1c42e060f88",
"name": "Demo - Exactly one client?",
"type": "n8n-nodes-base.if",
"position": [
1216,
720
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ad6987bf-5803-47c0-8f83-3af204f6252a",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.clientMatch.status }}",
"rightValue": "exact"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "9c9af74b-4f41-4e89-a703-5aff7b6dab7a",
"name": "Attachments - Split and filter documents",
"type": "n8n-nodes-base.code",
"position": [
1552,
656
],
"parameters": {
"jsCode": "const emailItem = $('Outlook - New email with attachments').first();\nconst evaluated = $('Demo - Evaluate client match').first().json;\nconst config = evaluated.demoConfig;\nconst binaries = emailItem.binary ?? {};\nconst skipped = [];\n\nfunction normalizeExtension(binary, fileName) {\n const fromBinary = String(binary.fileExtension ?? '').toLowerCase().replace('.', '');\n if (fromBinary) return fromBinary;\n\n const parts = String(fileName ?? '').split('.');\n return parts.length > 1 ? parts.pop().toLowerCase() : '';\n}\n\nfunction parseFileSize(value) {\n if (typeof value === 'number') return value;\n if (!value) return null;\n\n const text = String(value).trim().toLowerCase().replace(',', '.');\n const number = Number.parseFloat(text);\n if (!Number.isFinite(number)) return null;\n if (text.includes('mb')) return number * 1024 * 1024;\n if (text.includes('kb')) return number * 1024;\n return number;\n}\n\nfunction skipReason(binary, fileName, extension) {\n const ignoredExtensions = new Set(['ics', 'vcf']);\n if (ignoredExtensions.has(extension)) return `Ignored .${extension} attachment`;\n\n const mimeType = String(binary.mimeType ?? '').toLowerCase();\n const isImage = mimeType.startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp'].includes(extension);\n const size = parseFileSize(binary.fileSize);\n const looksLikeSignature = /^(image|logo|signature|signatur)[-_]?[0-9]*/i.test(fileName)\n || /(logo|signature|signatur|facebook|linkedin|twitter|instagram|banner)/i.test(fileName);\n\n if (binary.isInline === true) return 'Inline attachment';\n if (isImage && looksLikeSignature && (size === null || size <= 102400)) return 'Likely email signature image';\n return null;\n}\n\nconst receivedAt = evaluated.email?.receivedAt ?? new Date().toISOString();\nconst receivedDate = new Date(receivedAt);\nconst periodDate = Number.isNaN(receivedDate.getTime()) ? new Date() : receivedDate;\nconst baseJson = {\n email: evaluated.email,\n client: evaluated.client,\n demoConfig: config,\n dmsPeriod: {\n year: periodDate.getFullYear(),\n month: periodDate.getMonth() + 1,\n source: Number.isNaN(receivedDate.getTime()) ? 'processing_date' : 'email_received_date',\n receivedAt,\n processedAt: new Date().toISOString(),\n },\n};\n\nconst archiveItems = [];\nfor (const [binaryKey, binary] of Object.entries(binaries)) {\n const fileName = binary.fileName || binaryKey;\n const extension = normalizeExtension(binary, fileName);\n const reason = skipReason(binary, fileName, extension);\n\n if (reason) {\n skipped.push({ binaryKey, fileName, reason });\n continue;\n }\n\n archiveItems.push({ binaryKey, binary, fileName, extension });\n}\n\nif (archiveItems.length === 0) {\n return [\n {\n json: {\n ...baseJson,\n attachment: {\n shouldArchive: false,\n skippedAttachments: skipped,\n skippedCount: skipped.length,\n },\n review: {\n category: config.reviewCategory,\n reason: 'No archiveable document attachments were found after filtering.',\n },\n },\n },\n ];\n}\n\nreturn archiveItems.map((attachment, index) => ({\n json: {\n ...baseJson,\n attachment: {\n shouldArchive: true,\n binaryKey: attachment.binaryKey,\n fileName: attachment.fileName,\n extension: attachment.extension,\n mimeType: attachment.binary.mimeType ?? null,\n fileSize: attachment.binary.fileSize ?? null,\n index: index + 1,\n total: archiveItems.length,\n skippedAttachments: skipped,\n skippedCount: skipped.length,\n },\n },\n binary: {\n data: attachment.binary,\n },\n}));"
},
"typeVersion": 2
},
{
"id": "edcc297a-6c03-4be2-a85e-b88f943125cb",
"name": "Attachments - Has archiveable document?",
"type": "n8n-nodes-base.if",
"position": [
1760,
656
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "262e47c2-1e05-4f3c-ac5d-318e3465d6c8",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.attachment.shouldArchive }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.3
},
{
"id": "19550220-e1bc-4b07-95af-ee331cad15b9",
"name": "DATEV DMS - Upload file",
"type": "@klardaten/n8n-nodes-datevconnect.documentManagement",
"position": [
2064,
816
],
"parameters": {
"resource": "documentFile",
"operation": "upload",
"binaryData": "data"
},
"executeOnce": false,
"typeVersion": 1
},
{
"id": "ddc2d5f6-9cb4-4426-82d3-6177bf310932",
"name": "DATEV - Get current user",
"type": "@klardaten/n8n-nodes-datevconnect.identityAndAccessManagement",
"position": [
2064,
432
],
"parameters": {
"resource": "currentUser"
},
"typeVersion": 1
},
{
"id": "1cef3181-b642-4f56-82fd-0e20ad71166f",
"name": "DATEV DMS - Combine upload context",
"type": "n8n-nodes-base.merge",
"position": [
2304,
624
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition",
"numberInputs": 3
},
"typeVersion": 3.2
},
{
"id": "ae5e76f8-5d1f-4241-ba49-18ded7db59da",
"name": "DATEV DMS - Create document",
"type": "@klardaten/n8n-nodes-datevconnect.documentManagement",
"position": [
2544,
624
],
"parameters": {
"operation": "create",
"documentData": "={{ JSON.stringify({ extension: $json.attachment.extension || '', description: `Email attachment: ${$json.attachment.fileName || 'Unnamed file'}`, class: { name: $json.demoConfig.dms.className, id: $json.demoConfig.dms.classId }, correspondence_partner_guid: $json.client.id, user: { id: $('DATEV - Get current user').item.json.id }, domain: { name: $json.demoConfig.dms.domainName, id: $json.demoConfig.dms.domainId }, folder: { id: $json.demoConfig.dms.folderId, name: $json.demoConfig.dms.folderName }, year: $json.dmsPeriod.year, month: $json.dmsPeriod.month, structure_items: [{ counter: 1, type: 1, document_file_id: $('DATEV DMS - Upload file').item.json.id, name: $json.attachment.fileName || 'Unnamed file', parent_counter: 0, creation_date: $json.dmsPeriod.processedAt, last_modification_date: $json.dmsPeriod.processedAt }] }) }}"
},
"typeVersion": 1
},
{
"id": "85a3ad38-698d-4674-babe-a0274723f8d0",
"name": "Archive - Summarize successful DMS archive",
"type": "n8n-nodes-base.code",
"position": [
2784,
624
],
"parameters": {
"jsCode": "const createdDocuments = $input.all();\nconst attachments = $('Attachments - Split and filter documents').all()\n .filter(item => item.json.attachment?.shouldArchive === true);\nconst first = attachments[0]?.json ?? {};\n\nreturn [\n {\n json: {\n email: first.email,\n archive: {\n category: first.demoConfig?.archivedCategory ?? 'DMS_ARCHIVED',\n documentsCreated: createdDocuments.length,\n attachmentsProcessed: attachments.length,\n completedAt: new Date().toISOString(),\n },\n },\n },\n];"
},
"typeVersion": 2
},
{
"id": "a5bbd71b-e58e-4d40-ba39-a36538efdd54",
"name": "Slack - Notify archive success",
"type": "n8n-nodes-base.slack",
"onError": "continueRegularOutput",
"position": [
3504,
624
],
"parameters": {
"text": "=DMS archiving successful. Documents created: {{ $items('Archive - Summarize successful DMS archive')[0].json.archive.documentsCreated }}. Execution ID: {{ $execution.id }}.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "REPLACE_WITH_SLACK_CHANNEL_ID"
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"typeVersion": 2.4
},
{
"id": "ab622369-e4c8-4f97-9542-477c4590ea2d",
"name": "Outlook - Mark archived",
"type": "n8n-nodes-base.microsoftOutlook",
"position": [
3024,
624
],
"parameters": {
"messageId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Archive - Summarize successful DMS archive').item.json.email.messageId }}"
},
"operation": "update",
"updateFields": {
"isRead": true,
"categories": [
"DMS_ARCHIVED"
]
}
},
"typeVersion": 2
},
{
"id": "ef29b026-e0fb-4751-9e20-e0e1b638f4e6",
"name": "Outlook - Move to archive folder",
"type": "n8n-nodes-base.microsoftOutlook",
"position": [
3264,
624
],
"parameters": {
"folderId": {
"__rl": true,
"mode": "id",
"value": "archive"
},
"messageId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Archive - Summarize successful DMS archive').item.json.email.messageId }}"
},
"operation": "move"
},
"typeVersion": 2
},
{
"id": "1719ab33-7bfc-4253-ac90-c4b2d245ea39",
"name": "Outlook - Mark review required",
"type": "n8n-nodes-base.microsoftOutlook",
"position": [
1600,
960
],
"parameters": {
"messageId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.email.messageId }}"
},
"operation": "update",
"updateFields": {
"categories": [
"DMS_REVIEW_REQUIRED"
]
}
},
"typeVersion": 2
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "238634a8-699a-4c04-8a95-fcac900bd1fd",
"connections": {
"DATEV DMS - Upload file": {
"main": [
[
{
"node": "DATEV DMS - Combine upload context",
"type": "main",
"index": 2
}
]
]
},
"Outlook - Mark archived": {
"main": [
[
{
"node": "Outlook - Move to archive folder",
"type": "main",
"index": 0
}
]
]
},
"DATEV - Get current user": {
"main": [
[
{
"node": "DATEV DMS - Combine upload context",
"type": "main",
"index": 0
}
]
]
},
"Demo - Exactly one client?": {
"main": [
[
{
"node": "Attachments - Split and filter documents",
"type": "main",
"index": 0
}
],
[
{
"node": "Outlook - Mark review required",
"type": "main",
"index": 0
}
]
]
},
"DATEV - Look up demo client": {
"main": [
[
{
"node": "Demo - Evaluate client match",
"type": "main",
"index": 0
}
]
]
},
"DATEV DMS - Create document": {
"main": [
[
{
"node": "Archive - Summarize successful DMS archive",
"type": "main",
"index": 0
}
]
]
},
"Demo - Configure processing": {
"main": [
[
{
"node": "DATEV - Look up demo client",
"type": "main",
"index": 0
}
]
]
},
"Demo - Evaluate client match": {
"main": [
[
{
"node": "Demo - Exactly one client?",
"type": "main",
"index": 0
}
]
]
},
"Template - Configure variables": {
"main": [
[
{
"node": "Demo - Configure processing",
"type": "main",
"index": 0
}
]
]
},
"Outlook - Move to archive folder": {
"main": [
[
{
"node": "Slack - Notify archive success",
"type": "main",
"index": 0
}
]
]
},
"DATEV DMS - Combine upload context": {
"main": [
[
{
"node": "DATEV DMS - Create document",
"type": "main",
"index": 0
}
]
]
},
"Outlook - New email with attachments": {
"main": [
[
{
"node": "Template - Configure variables",
"type": "main",
"index": 0
}
]
]
},
"Attachments - Has archiveable document?": {
"main": [
[
{
"node": "DATEV DMS - Upload file",
"type": "main",
"index": 0
},
{
"node": "DATEV DMS - Combine upload context",
"type": "main",
"index": 1
},
{
"node": "DATEV - Get current user",
"type": "main",
"index": 0
}
],
[
{
"node": "Outlook - Mark review required",
"type": "main",
"index": 0
}
]
]
},
"Attachments - Split and filter documents": {
"main": [
[
{
"node": "Attachments - Has archiveable document?",
"type": "main",
"index": 0
}
]
]
},
"Archive - Summarize successful DMS archive": {
"main": [
[
{
"node": "Outlook - Mark archived",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
microsoftOutlookOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow takes new Outlook emails with attachments and helps archive the relevant files in DATEV DMS.
Source: https://n8n.io/workflows/15524/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates the process of saving binary attachments from Outlook emails into newly created folders in OneDrive. It's ideal for users who regularly receive files and need them organized in
Enterprise: Outlook & Slack Email Inbox Manager. Uses microsoftOutlookTrigger, httpRequest, microsoftOutlook, slack. Event-driven trigger; 17 nodes.
Create Add An Attachment And Send A Draft Using Microsoft Outlook. Uses manualTrigger, microsoftOutlook, httpRequest. Event-driven trigger; 5 nodes.
This workflow allows you to create, add an attachment, and send a draft using the Microsoft Outlook node.
Monitors incoming invoice emails and catches extraction failures before they slip through. When easybits Extractor can't extract the invoice number from an attachment, the workflow sends a Slack alert