This workflow follows the Datatable → HTTP Request recipe pattern — see all workflows that pair these two integrations.
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 →
{
"//": "Jobby Markdown Editor - jobby-pdf-static.json - Static PDF generator workflow",
"updatedAt": "2026-06-03T11:51:05.635Z",
"createdAt": "2026-05-25T16:32:59.047Z",
"id": "K2acY4kGijPJGop0",
"name": "Jobby - PDF - static",
"description": "retrieves a MD file and returns a printed version in PDF",
"active": false,
"isArchived": false,
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "jobby-pdf",
"options": {
"responseCode": {
"values": {}
}
}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-656,
-80
],
"id": "aee20b02-ae57-411f-8c3b-b1d33ac21d83",
"name": "Webhook"
},
{
"parameters": {
"jsCode": "// 1. R\u00e9cup\u00e9ration du CV et des deux nouvelles propri\u00e9t\u00e9s Notion\nconst properties = $('Webhook').item.json.body?.data?.properties || {};\nconst richTextArray = properties.CV?.rich_text || [];\n\n// Extraction propre depuis Get PageID\nconst company = $('Get PageID').first().json.company || 'company';\nconst jobTitle = $('Get PageID').first().json.jobTitle || 'job';\nconst increment = $('Get PageID').first().json.increment || '01';\n\nlet mdText = richTextArray.map(block => block.plain_text || '').join('');\n\n// 2. Parser Markdown avec nettoyage du \"plain text\" parasite\nfunction robustMarkdownToHtml(md) {\n // Suppression des mentions \"plain text\" ou \"plain_text\" textuelles inject\u00e9es par l'agent\n let cleanedMd = md.replace(/plain[\\s_]text/gi, '');\n\n const lines = cleanedMd.split('\\n');\n let htmlOutput = [];\n let inList = false;\n\n for (let line of lines) {\n let trimmed = line.trim();\n if (!trimmed.startsWith('-') && !trimmed.startsWith('*') && inList) {\n htmlOutput.push('</ul>');\n inList = false;\n }\n if (trimmed === '---' || trimmed === '***') {\n htmlOutput.push('<hr />');\n continue;\n }\n if (trimmed.startsWith('>')) {\n let content = line.replace(/^>\\s*/, '').trim().replace(/^\"(.*)\"$/, '$1');\n htmlOutput.push(`<div class=\"summary-box\">\text;</div>`.replace('text;', content));\n continue;\n }\n if (trimmed.startsWith('# ')) { htmlOutput.push(`<h1>\text;</h1>`.replace('text;', trimmed.substring(2))); continue; }\n if (trimmed.startsWith('## ')) { htmlOutput.push(`<h2>\text;</h2>`.replace('text;', trimmed.substring(3))); continue; }\n if (trimmed.startsWith('### ')) { htmlOutput.push(`<h3>\text;</h3>`.replace('text;', trimmed.substring(4))); continue; }\n\n if (trimmed.startsWith('-') || trimmed.startsWith('*')) {\n if (!inList) { htmlOutput.push('<ul>'); inList = true; }\n htmlOutput.push(`<li>${trimmed.replace(/^[\\-\\*]\\s*/, '')}</li>`);\n continue;\n }\n if (trimmed !== '') htmlOutput.push(`<p>&line;</p>`.replace('&line;', line));\n }\n if (inList) htmlOutput.push('</ul>');\n\n let finalBody = htmlOutput.join('\\n');\n return finalBody.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\n}\n\n// Fonction utilitaire pour nettoyer les caract\u00e8res sp\u00e9ciaux du futur nom de fichier\nfunction slugify(text) {\n return text\n .toString()\n .toLowerCase()\n .normalize('NFD') // Supprime les accents\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim()\n .replace(/\\s+/g, '-') // Remplace les espaces par des tirets\n .replace(/[^a-z0-9\\-]/g, ''); // Supprime le reste\n}\n\nconst finalFileName = \"javarre-\" + slugify(company) + \"-\" + slugify(jobTitle);\n\n// 3. RECUPERATION CONFIG\nlet config = { showVersion: false };\ntry {\n config = JSON.parse($('Read Config from Table').first().json.value);\n} catch (e) {}\n\nlet compiledBody = robustMarkdownToHtml(mdText);\nif (config.showVersion) {\n compiledBody = compiledBody + `<div class=\"resume-version-footer\">v${increment}</div>`;\n}\n\nreturn [\n {\n json: {\n compiledBody: compiledBody,\n pdfFileName: finalFileName\n }\n }\n];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-224,
-80
],
"id": "e79006b9-898c-4505-8606-9ca159c25273",
"name": "G\u00e9n\u00e9ration du HTML & Style CSS"
},
{
"parameters": {
"method": "POST",
"url": "={{ $node[\"Notion : Initialiser l'upload\"].json.upload_url }}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "notionApi",
"sendQuery": true,
"queryParameters": {
"parameters": []
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": "2022-06-28"
}
]
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "file",
"inputDataFieldName": "={{ $node[\"(Gotemberg) PDF\"].binary.data }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
880,
-80
],
"id": "5b17e223-3c0a-43cb-89ce-40e7986236ac",
"name": "Notion : Envoyer le binaire",
"credentials": {
"notionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://api.notion.com/v1/file_uploads",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "notionApi",
"sendQuery": true,
"queryParameters": {
"parameters": []
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": " 2022-06-28"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"mode\": \"single_part\",\n \"filename\": \"{{ $('Get PageID').item.json.outputPdf }}\",\n \"content_type\": \"application/pdf\"\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
656,
-80
],
"id": "ea9008a2-e5f9-44d0-ba00-032edd9088d0",
"name": "Notion : Initialiser l'upload",
"credentials": {
"notionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// 1. R\u00e9cup\u00e9ration des donn\u00e9es brutes du Webhook\nconst body = $('Webhook').item.json.body?.data || {};\nconst properties = body.properties || {};\n\nconst pageId = body.id;\n\n// 2. Extraction du texte MD de CV\nconst richTextArray = properties.CV?.rich_text || [];\nconst mdText = richTextArray.map(block => block.plain_text || '').join('');\n\n// 3. Extraction du nom ($name est la ligne apr\u00e8s le '#' ou sur la ligne du '#')\nlet name = 'resume';\nconst lines = mdText.split(/\\r?\\n/);\nfor (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed.startsWith('# ')) {\n const headingText = trimmed.substring(2).trim();\n if (headingText) {\n name = headingText;\n } else if (i + 1 < lines.length) {\n name = lines[i + 1].trim();\n }\n break;\n }\n}\n\n// 4. Fonction locale slugify pour nettoyer les cha\u00eenes\nfunction slugify(text) {\n return text\n .toString()\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9\\-]/g, '');\n}\n\nconst nameSlug = slugify(name);\nconst today = new Date().toISOString().split('T')[0];\n\n// 5. Calcul de l'incr\u00e9ment quotidien en inspectant les PDF existants\nlet maxIncrement = 0;\nconst pdfFiles = properties.PDF?.files || [];\nconst prefixPattern = new RegExp(\"^\" + nameSlug + \"-resume-\" + today + \"-(\\\\d+)\\\\.pdf$\", \"i\");\n\nfor (const fileObj of pdfFiles) {\n const fileName = fileObj.name || '';\n const match = fileName.match(prefixPattern);\n if (match) {\n const inc = parseInt(match[1], 10);\n if (inc > maxIncrement) {\n maxIncrement = inc;\n }\n }\n}\n\nconst nextIncrement = String(maxIncrement + 1).padStart(2, '0');\nconst finalFileName = nameSlug + \"-resume-\" + today + \"-\" + nextIncrement;\nconst outputPdf = finalFileName + \".pdf\";\n\n// 6. Extraction de Company et JobTitle pour r\u00e9trocompatibilit\u00e9 n8n\nlet company = 'company';\nif (properties.Company && properties.Company.select) {\n company = properties.Company.select.name || 'company';\n}\nlet jobTitle = 'job';\nconst targetProperty = properties.Title || properties[\"Job Title\"];\nif (targetProperty && targetProperty.title && targetProperty.title.length > 0) {\n jobTitle = targetProperty.title.plain_text || 'job';\n}\n\n// 7. Retour des variables\nreturn [{ \n json: {\n pageId: pageId,\n company: company,\n jobTitle: jobTitle,\n outputPdf: outputPdf,\n increment: nextIncrement\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-448,
-80
],
"id": "50e1809c-41d6-4d09-a38b-fa08be19185a",
"name": "Get PageID"
},
{
"parameters": {
"method": "PATCH",
"url": "=https://api.notion.com/v1/pages/{{ $node[\"Get PageID\"].json.pageId }}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "notionApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": "2026-03-11"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"properties\": {\n \"PDF\": {\n \"type\": \"files\",\n \"files\": [\n {\n \"type\": \"file_upload\",\n \"file_upload\": { \n \"id\": \"{{ $('Notion : Initialiser l\\'upload').item.json.id }}\" \n },\n \"name\": \"{{ $json.filename }}\"\n }\n ]\n }\n }\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1072,
-80
],
"id": "1e94c1a3-320d-47ab-88f8-167563781146",
"name": "Attach Bin to page",
"credentials": {
"notionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "http://gotenberg:3000/forms/chromium/convert/html",
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "index.html",
"inputDataFieldName": "indexHtml"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
432,
-80
],
"id": "b3921630-4876-4e63-bf65-6dd8ba2a2033",
"name": "(Gotemberg) PDF"
},
{
"parameters": {
"operation": "toText",
"sourceProperty": "myRawContent",
"binaryPropertyName": "indexHtml",
"options": {
"addBOM": false,
"encoding": "utf8",
"fileName": "=index.html"
}
},
"type": "n8n-nodes-base.convertToFile",
"typeVersion": 1.1,
"position": [
208,
-80
],
"id": "d0978c75-1b40-4761-bf50-766eb4d0d0ff",
"name": "Convert to File"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "1fb1391e-c916-48ff-ae50-b4da474a5ea1",
"name": "myRawContent",
"value": "=<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n <meta charset=\"utf-8\">\n <title>CV Julien Avarre</title>\n <style>\n @page { \n size: A4; \n /* \"To wide\" corrig\u00e9 : On augmente drastiquement les marges lat\u00e9rales (35mm) pour resserrer le texte au centre comme sur le mod\u00e8le */\n margin: 25mm 35mm 25mm 35mm; \n }\n \n /* Custom Config Variables */\n:root {\n --resume-font-family: 'Inter', sans-serif;\n --resume-font-size: 12.5px;\n --resume-line-height: 1.2;\n --resume-heading-scale: 1.6;\n --resume-margin-x: 48px;\n --resume-margin-y: 20px;\n --resume-section-spacing: 12px;\n --resume-color-bg: #ffffff;\n --resume-color-headings: #0f172a;\n --resume-color-body: #334155;\n --resume-color-links: #2563eb;\n --resume-color-accent: #0ea5e9;\n --resume-sidebar-bg: #2d3748;\n --resume-sidebar-text: #ffffff;\n}\n\n/* ==========================================\n ATS RESUME RENDERING AND PRINT TEMPLATES\n ========================================== */\n\n/* The A4 Canvas Sheet Simulator (Screen-only) */\n.a4-sheet {\n background-color: var(--resume-color-bg, #ffffff);\n color: var(--resume-color-body, #334155);\n font-family: var(--resume-font-family, 'Raleway', sans-serif);\n font-size: var(--resume-font-size, 14px);\n line-height: var(--resume-line-height, 1.45);\n \n padding: var(--resume-margin-y, 25px) var(--resume-margin-x, 30px);\n \n width: 210mm;\n min-height: 297mm;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);\n border-radius: 4px;\n box-sizing: border-box;\n text-align: left;\n \n /* Smooth transitions for slider adjustments */\n transition: padding 0.15s ease-out;\n}\n\n/* 2-Column Layout CSS Rules */\n.resume-columns {\n display: grid;\n grid-template-columns: 1.7fr 1.3fr;\n gap: 20px;\n align-items: stretch;\n margin-top: 16px;\n}\n\n.resume-columns.sidebar-left {\n grid-template-columns: 1.3fr 1.7fr;\n}\n\n.resume-main-col {\n display: flex;\n flex-direction: column;\n gap: var(--resume-section-spacing, 12px);\n}\n\n.resume-sidebar-col {\n display: flex;\n flex-direction: column;\n gap: var(--resume-section-spacing, 12px);\n background-color: var(--resume-sidebar-bg, #2d3748);\n color: var(--resume-sidebar-text, #ffffff);\n padding: 18px;\n border-radius: 6px;\n box-sizing: border-box;\n}\n\n/* Sidebar Specific Content Overrides */\n#resume-output .resume-sidebar-col h3 {\n color: var(--resume-sidebar-headings, var(--resume-sidebar-text, #ffffff));\n border-bottom: 1.5px solid var(--resume-color-accent, #0d9488);\n margin-top: calc(var(--resume-section-spacing, 12px) * 0.5);\n padding-bottom: 4px;\n}\n\n#resume-output .resume-sidebar-col p {\n color: var(--resume-sidebar-text, #ffffff);\n}\n\n#resume-output .resume-sidebar-col p strong {\n color: var(--resume-sidebar-headings, var(--resume-sidebar-text, #ffffff));\n}\n\n#resume-output .resume-sidebar-col li {\n color: var(--resume-sidebar-text, #ffffff);\n}\n\n#resume-output .resume-sidebar-col li::marker {\n color: var(--resume-color-accent, #0d9488);\n}\n\n#resume-output .resume-sidebar-col a {\n color: var(--resume-sidebar-text, #ffffff);\n text-decoration: underline;\n}\n\n/* Resume Markdown HTML Output Elements Styling */\n\n#resume-output h1 {\n font-family: var(--resume-font-family, 'Raleway', sans-serif);\n font-size: calc(var(--resume-font-size, 14px) * var(--resume-heading-scale, 1.6) * 1.5);\n color: var(--resume-color-headings, #1e293b);\n font-weight: 800;\n line-height: 1.15;\n margin-bottom: 6px;\n letter-spacing: -0.02em;\n}\n\n#resume-output p {\n margin-bottom: 8px;\n font-size: var(--resume-font-size, 14px);\n color: var(--resume-color-body, #334155);\n}\n\n/* Subtitles or roles (typically bold text right after h1) */\n#resume-output h1 + p strong,\n#resume-output h1 + p {\n font-size: calc(var(--resume-font-size, 14px) * 1.05);\n color: var(--resume-color-accent, #0d9488);\n font-weight: 600;\n}\n\n/* Contact Details Paragraph (e.g. [CONTACT : ...]) */\n#resume-output p:nth-of-type(2) {\n font-size: calc(var(--resume-font-size, 14px) * 0.85);\n color: var(--resume-color-links, #7c3aed);\n background-color: rgba(0, 0, 0, 0.02);\n border: 1px solid rgba(0, 0, 0, 0.04);\n padding: 6px 12px;\n border-radius: 4px;\n margin-top: 8px;\n margin-bottom: 16px;\n display: block;\n word-break: break-all;\n}\n\n/* Links inside the document */\n#resume-output a {\n color: var(--resume-color-links, #7c3aed);\n text-decoration: none;\n font-weight: 500;\n transition: opacity 0.15s ease;\n}\n\n#resume-output a:hover {\n text-decoration: underline;\n opacity: 0.95;\n}\n\n/* Horizontal separators */\n#resume-output hr {\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.08);\n margin: 16px 0;\n}\n\n/* Blockquotes (used for Summary Quotes) */\n#resume-output blockquote {\n border-left: 3px solid var(--resume-color-accent, #0d9488);\n padding-left: 14px;\n margin: 16px 0;\n font-style: italic;\n color: var(--resume-color-body, #475569);\n font-size: calc(var(--resume-font-size, 14px) * 1.02);\n line-height: 1.5;\n}\n\n/* Section Headings (e.g., ### EXP\u00c9RIENCES CL\u00c9S) */\n#resume-output h3 {\n font-family: var(--resume-font-family, 'Raleway', sans-serif);\n font-size: calc(var(--resume-font-size, 14px) * var(--resume-heading-scale, 1.6));\n color: var(--resume-color-headings, #1e293b);\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-top: calc(var(--resume-section-spacing, 12px) * 1.8);\n margin-bottom: calc(var(--resume-section-spacing, 12px) * 0.8);\n border-bottom: 1.5px solid var(--resume-color-accent, #0d9488);\n padding-bottom: 4px;\n display: block;\n}\n\n/* Sub-headings / job blocks (typically bold text for titles) */\n#resume-output p strong {\n font-weight: 600;\n color: var(--resume-color-headings, #1e293b);\n}\n\n/* Lists and Bullet Points - critical for ATS readability */\n#resume-output ul {\n margin-left: 18px;\n margin-bottom: 12px;\n padding-left: 0;\n}\n\n#resume-output li {\n font-size: calc(var(--resume-font-size, 14px) * 0.96);\n margin-bottom: 4px;\n line-height: 1.45;\n color: var(--resume-color-body, #334155);\n /* Standard bullets only, no graphics */\n list-style-type: disc;\n}\n\n#resume-output li::marker {\n color: var(--resume-color-accent, #0d9488);\n}\n\n/* Ensure no page breaks inside job details or blocks in print */\n#resume-output p, \n#resume-output ul, \n#resume-output h3 {\n page-break-inside: avoid;\n break-inside: avoid;\n}\n\n/* Custom directives styling matching markdownresume.app guide */\n.resume-accent {\n color: var(--resume-color-accent, #0d9488);\n font-weight: 600;\n}\n\n.resume-muted {\n color: #64748b;\n font-size: 0.95em;\n opacity: 0.85;\n}\n\n/* ==========================================\n STRICT PRINT-TO-PDF STYLING OVERRIDES\n ========================================== */\n@media print {\n * {\n -webkit-print-color-adjust: exact !important;\n print-color-adjust: exact !important;\n }\n \n /* Set page margins in printer settings dynamically */\n @page {\n size: A4 portrait;\n margin: 15mm; /* Balanced printing margins */\n }\n\n /* Hide entire builder UI */\n body {\n background: #ffffff !important;\n color: #000000 !important;\n font-size: var(--resume-font-size, 12px) !important;\n height: auto !important;\n width: auto !important;\n overflow: visible !important;\n }\n\n .app-header, \n .panel:not(.preview-panel),\n .panel-header,\n .preview-controls,\n .toast {\n display: none !important;\n }\n\n .app-container {\n display: block !important;\n height: auto !important;\n width: 100% !important;\n background: none !important;\n }\n\n .app-main {\n display: block !important;\n height: auto !important;\n overflow: visible !important;\n background: none !important;\n }\n\n .preview-panel {\n display: block !important;\n width: 100% !important;\n height: auto !important;\n border: none !important;\n background: none !important;\n overflow: visible !important;\n }\n\n .preview-canvas-wrapper {\n padding: 0 !important;\n overflow: visible !important;\n display: block !important;\n background: none !important;\n }\n\n .preview-canvas {\n transform: none !important;\n width: 100% !important;\n height: auto !important;\n display: block !important;\n }\n\n .a4-sheet {\n box-shadow: none !important;\n border-radius: 0 !important;\n padding: 0 !important; /* Managed by @page margin */\n width: 100% !important;\n min-height: 0 !important;\n background: var(--resume-color-bg, #ffffff) !important;\n color: var(--resume-color-body, #334155) !important;\n }\n}\n\n </style>\n</head>\n<body>\n\n {{ $json.compiledBody }}\n\n</body>\n</html>",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-16,
-80
],
"id": "c536ea5f-8e34-4a92-8d0b-e9cca421b474",
"name": "Template Design CV"
},
{
"parameters": {
"operation": "get",
"dataTableId": {
"__rl": true,
"value": "OtWoNuYUmoj7knoz",
"mode": "id"
},
"matchType": "allConditions",
"filters": {
"conditions": [
{
"keyName": "key",
"keyValue": "config"
}
]
}
},
"type": "n8n-nodes-base.dataTable",
"typeVersion": 1,
"position": [
-336,
-80
],
"id": "a4c9b321-0a26-4a49-b389-3540fa4eed10",
"name": "Read Config from Table"
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Get PageID",
"type": "main",
"index": 0
}
]
]
},
"G\u00e9n\u00e9ration du HTML & Style CSS": {
"main": [
[
{
"node": "Template Design CV",
"type": "main",
"index": 0
}
]
]
},
"Notion : Envoyer le binaire": {
"main": [
[
{
"node": "Attach Bin to page",
"type": "main",
"index": 0
}
]
]
},
"Notion : Initialiser l'upload": {
"main": [
[
{
"node": "Notion : Envoyer le binaire",
"type": "main",
"index": 0
}
]
]
},
"Get PageID": {
"main": [
[
{
"node": "Read Config from Table",
"type": "main",
"index": 0
}
]
]
},
"(Gotemberg) PDF": {
"main": [
[
{
"node": "Notion : Initialiser l'upload",
"type": "main",
"index": 0
}
]
]
},
"Convert to File": {
"main": [
[
{
"node": "(Gotemberg) PDF",
"type": "main",
"index": 0
}
]
]
},
"Template Design CV": {
"main": [
[
{
"node": "Convert to File",
"type": "main",
"index": 0
}
]
]
},
"Read Config from Table": {
"main": [
[
{
"node": "G\u00e9n\u00e9ration du HTML & Style CSS",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": true
},
"staticData": null,
"meta": null,
"versionId": "66c2ab48-3155-43cb-a8dd-6869d5974fb1",
"activeVersionId": null,
"versionCounter": 616,
"triggerCount": 1,
"shared": [
{
"updatedAt": "2026-05-25T16:32:59.050Z",
"createdAt": "2026-05-25T16:32:59.050Z",
"role": "workflow:owner",
"workflowId": "K2acY4kGijPJGop0",
"projectId": "GfFdmZTqGEJQkrXG",
"project": {
"updatedAt": "2026-05-11T09:44:44.757Z",
"createdAt": "2026-05-11T09:34:45.695Z",
"id": "GfFdmZTqGEJQkrXG",
"name": "\u00c9ole Wind <megazef@gmail.com>",
"type": "personal",
"icon": null,
"description": null,
"creatorId": "2792484d-cba3-4156-adba-fbc49134eb55"
}
}
],
"tags": [
{
"updatedAt": "2026-05-29T11:31:39.972Z",
"createdAt": "2026-05-29T11:31:39.972Z",
"id": "5zynHpPHQi9PRMyD",
"name": "jobby"
},
{
"updatedAt": "2026-05-28T12:28:46.096Z",
"createdAt": "2026-05-28T12:28:46.096Z",
"id": "Ft2TXB4BVRBQRwkV",
"name": "PDF"
},
{
"updatedAt": "2026-05-28T12:28:49.321Z",
"createdAt": "2026-05-28T12:28:49.321Z",
"id": "XmFLRaZ2ZU05mmMo",
"name": "Gotemberg"
}
],
"activeVersion": null
}
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.
notionApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Jobby - PDF - static. Uses httpRequest, dataTable. Webhook trigger; 10 nodes.
Source: https://github.com/gnueole/jobby-md2html/blob/main/n8n/jobby-pdf-static.json — 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.
Response_Handler. Uses httpRequest, dataTable, n8n-nodes-evolution-api, redis. Webhook trigger; 32 nodes.
Receive instant push notifications on your phone and voice announcements on your Google Home every time someone orders from your intranet menu — with cumulative BAC tracking per person.
Jobby - PDF - dyn. Uses httpRequest, dataTable. Webhook trigger; 11 nodes.
This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .