
Sync Zendesk Knowledge Base Articles to Airtable with Markdown Conversion
Description
Categories
⚙️ Automation
Nodes Used
n8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.airtablen8n-nodes-base.markdownn8n-nodes-base.splitOutn8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
PriceKostenlos
Views0
Last Updated11/28/2025
workflow.json
{
"meta": {
"instanceId": "f4f5d195bb2162a0972f737368404b18be694648d365d6c6771d7b4909d28167",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "d3490654-2438-4d56-95ef-95a7c49b58a0",
"name": "When clicking ‘Execute workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-100,
0
],
"parameters": {},
"typeVersion": 1
},
{
"id": "b555382d-1794-46aa-89b3-69c07e39a7d4",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
920,
240
],
"parameters": {
"options": {},
"fieldToSplitOut": "articles"
},
"typeVersion": 1
},
{
"id": "3d30de50-21ac-42f4-b8a3-84cc80d954c7",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-120,
480
],
"parameters": {
"rule": {
"interval": [
{
"daysInterval": 30
}
]
}
},
"typeVersion": 1.2
},
{
"id": "9beaf0bf-e3fb-4958-a355-50d91c58988c",
"name": "Set fields to store",
"type": "n8n-nodes-base.set",
"position": [
1140,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a8ea7db7-cc9c-47d1-b20b-061e04e4c2cb",
"name": "id",
"type": "number",
"value": "={{ $json.id }}"
},
{
"id": "9fd07686-f023-490f-98f1-fc579559be0d",
"name": "url",
"type": "string",
"value": "={{ $json.url }}"
},
{
"id": "09cf7488-d957-48c5-9f5d-fe5ea534ab12",
"name": "title",
"type": "string",
"value": "={{ $json.title }}"
},
{
"id": "d004df48-3e18-4c3e-a2ec-8ebb96d32927",
"name": "body",
"type": "string",
"value": "={{ $json.body }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "fa14f526-72f3-4bf8-a892-3a7c1e13edcd",
"name": "Store Zendesk articles to Airtable",
"type": "n8n-nodes-base.airtable",
"position": [
1720,
240
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apptzJnbB6FphIprO",
"cachedResultUrl": "https://airtable.com/apptzJnbB6FphIprO",
"cachedResultName": "Zendesk KB"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblaOi8NYGKPMvPof",
"cachedResultUrl": "https://airtable.com/apptzJnbB6FphIprO/tblaOi8NYGKPMvPof",
"cachedResultName": "Articles"
},
"columns": {
"value": {
"URL": "={{ $json.url }}",
"Title": "={{ $json.title }}",
"Content": "={{ $json.markdown }}",
"Article ID": "={{ $json.id }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Article ID",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Article ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Content",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Content",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Update",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Last Update",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created At",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Created At",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Article ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "upsert"
},
"credentials": {
"airtableTokenApi": {
"id": "C8zNgAdz8w8ZVNqM",
"name": "Airtable Agent Studio"
}
},
"typeVersion": 2.1
},
{
"id": "e5cf0e34-4279-4596-845a-9debdb36fdcc",
"name": "Set base_url",
"type": "n8n-nodes-base.set",
"position": [
140,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "10377b7b-b613-4e1c-a338-804e23c646a0",
"name": "base_url",
"type": "string",
"value": "https://agentstudiohelp.zendesk.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "3d7c2245-ed86-4a69-b4e6-fe4050e1e59e",
"name": "Set base url",
"type": "n8n-nodes-base.set",
"position": [
140,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "10377b7b-b613-4e1c-a338-804e23c646a0",
"name": "base_url",
"type": "string",
"value": "https://agentstudiohelp.zendesk.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "c7af46d1-f9ea-4300-bc52-56eaf1647336",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1140,
-580
],
"parameters": {
"color": 7,
"width": 860,
"height": 1700,
"content": "# Sync Zendesk Knowledge Base Articles to Airtable\n\n## Overview\nThis workflow fetches articles from a Zendesk Knowledge Base and syncs them into an Airtable base. \nIt’s designed for teams who want to repurpose, back up, or enrich Zendesk content—making it available in Airtable (or elsewhere).\n\n## Who is it for\n* Customer service or support teams who want to use their Zendesk articles in other tools.\n* Content/Knowledge managers consolidating or migrating knowledge bases.\n* Ops/automation specialists who want Markdown versions of articles (could be adapted to Notion, Google Sheets, or any Markdown-friendly system).\n\n## Prerequisites\n* **Airtable base** set up using [this template](https://airtable.com/apptzJnbB6FphIprO/shrA6AhTkogTgrRn5). It includes the fields `Title`, `Content`, `URL` and `Article ID`.\n* **Zendesk account** with API access (read permissions for help center articles)\n* **Zendesk API credentials** (see instructions below)\n* **Airtable API credentials** (see instructions below)\n\n## Getting Your Credentials\n**Airtable:**\n1. [Sign up or log in to Airtable](https://airtable.com/).\n2. Go to [your account settings](https://airtable.com/account) and generate a **Personal Access Token** (recommended scopes: `data.records:read`, `data.records:write`).\n3. In n8n, create new Airtable credentials using this token.\n\n\n**Zendesk:**\n1. Log in to your Zendesk dashboard.\n2. Go to **Admin Center > Apps and Integrations > Zendesk API**.\n3. Enable “Token Access,” and create an API token.\n4. In n8n, add Zendesk credentials with your Zendesk domain, email, and the API token.\n\n## How it works\n### 1. **Triggers**\n* **Manual:** For first setup, use the Manual Trigger to fetch **all** existing articles.\n* **Scheduled:** Automatically runs every N days to fetch **only new or updated** articles since the last run.\n\n### 2. **Fetch Articles from Zendesk**\n* Calls the Zendesk Help Center API, using pagination to handle large volumes.\n\n### 3. **Extract and Prepare Data**\n* Splits out each article, then collects fields: `id`, `url`, `title`, and `body`.\n* Converts the article body from HTML to Markdown (for portability and easier reuse).\n\n### 4. **Upsert Into Airtable**\n* Inserts new articles, or updates existing ones (using `Article ID` as the unique key).\n* Fields stored: **Title**, **Content** (Markdown), **URL**, **Article ID**.\n\n## Airtable Template\n* Use [this Airtable template](https://airtable.com/apptzJnbB6FphIprO/shrA6AhTkogTgrRn5) as your starting point.\n* Make sure the table has columns: **Title**, **Content**, **URL**, **Article ID**. You can add more depending on your needs.\n\n## Example Use Cases\n* Migrating Zendesk articles to another knowledge base.\n* Building an internal knowledge hub in Airtable or Notion.\n* Creating Markdown backups for compliance or versioning.\n\n## Notes & Tips\n* **No duplicates:** Existing articles in Airtable are updated, not duplicated.\n* **Flexible destination:** The workflow can be adapted to store articles *anywhere* in Markdown (Notion, Google Sheets, your DB, etc).\n* **API rate limits:** If you have many articles, Zendesk API may rate-limit you. n8n will handle pagination, but long runs could hit limits.\n* **Field mapping:** The workflow is ready for the provided template. If you change your Airtable structure, update the node mappings.\n* **Credentials:** Only Zendesk and Airtable credentials are needed.\n"
},
"typeVersion": 1
},
{
"id": "d57bedfe-ba62-448f-8e2b-b5f590477ee8",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-180
],
"parameters": {
"color": 4,
"width": 920,
"height": 380,
"content": "## Initial sync"
},
"typeVersion": 1
},
{
"id": "ee70ed91-ad63-4709-bdee-d9bbf0e26625",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-160,
-120
],
"parameters": {
"color": 4,
"width": 220,
"height": 280,
"content": "Starts a full sync"
},
"typeVersion": 1
},
{
"id": "a08100e4-9d8d-4833-8ddb-485836060b6a",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
-120
],
"parameters": {
"color": 7,
"width": 220,
"height": 760,
"content": "Sets your Zendesk domain.\n**💡 Edit the `base_url` before running**"
},
"typeVersion": 1
},
{
"id": "b803d8da-78c3-44ec-9917-0bba7ea5098f",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-120
],
"parameters": {
"color": 4,
"width": 280,
"height": 280,
"content": "#### Full Fetch: Get Articles\n- Pulls all articles from the Zendesk Help Center API.\n- Uses pagination to get large sets"
},
"typeVersion": 1
},
{
"id": "36877a5a-afc0-4f91-ade3-4648ade23736",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
320
],
"parameters": {
"color": 5,
"width": 280,
"height": 320,
"content": "#### Incremental Fetch: Get Articles since last run\n- Pulls only new or updated articles since the last scheduled run.\n- Uses the incremental Zendesk endpoint and the schedule's interval."
},
"typeVersion": 1
},
{
"id": "0b082080-6cef-4672-b0c8-9ce0bfd6dcdb",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-180,
320
],
"parameters": {
"color": 5,
"height": 320,
"content": "Runs the workflow automatically on a schedule \n- Fetches only new or updated articles since the last run.\n- Change the interval in the node’s settings."
},
"typeVersion": 1
},
{
"id": "c12804e1-d2fc-47db-95e7-eca226395d59",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
260
],
"parameters": {
"color": 5,
"width": 920,
"height": 400,
"content": "## Incremental sync"
},
"typeVersion": 1
},
{
"id": "a6024af3-0a29-4fdc-85e7-19ee8292ad6b",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
860,
120
],
"parameters": {
"color": 7,
"width": 680,
"height": 320,
"content": "#### Prepare the data\n- Splits the array of articles so each can be processed individually.\n- Selects and renames fields for storage.\n- Converts Zendesk article body from HTML to Markdown."
},
"typeVersion": 1
},
{
"id": "5ee117d9-c294-4a6b-ad52-ce709bb12d66",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1580,
120
],
"parameters": {
"color": 7,
"width": 380,
"height": 320,
"content": "#### Store Articles\nUpserts into Airtable, matching by Article ID\n💡 Update the Airtable base and table before running"
},
"typeVersion": 1
},
{
"id": "a73345d0-cc39-4a5d-9407-8cefaa0082b3",
"name": "Get articles since last run",
"type": "n8n-nodes-base.httpRequest",
"position": [
420,
480
],
"parameters": {
"url": "={{ $json.base_url }}/api/v2/help_center/incremental/articles.json?start_time={{ $now.minus($('Schedule Trigger').params.rule.interval.first().daysInterval, 'days').toSeconds().round() }}",
"options": {
"pagination": {
"pagination": {
"nextURL": "={{ $response.body.next_page }}",
"paginationMode": "responseContainsNextURL",
"requestInterval": 1000,
"completeExpression": "={{ $response.body.next_page.isEmpty() }}",
"paginationCompleteWhen": "other"
}
}
},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "zendeskApi"
},
"credentials": {
"zendeskApi": {
"id": "fLpWOCOisAwS9cK2",
"name": "Zendesk account"
}
},
"typeVersion": 4.2
},
{
"id": "96968991-0f63-4c53-bbc3-b5b22d88cd54",
"name": "Get all articles",
"type": "n8n-nodes-base.httpRequest",
"position": [
400,
0
],
"parameters": {
"url": "={{$json.base_url}}/api/v2/help_center/articles",
"options": {
"pagination": {
"pagination": {
"nextURL": "={{ $response.body.next_page }}",
"paginationMode": "responseContainsNextURL",
"requestInterval": 1000,
"completeExpression": "={{ $response.body.next_page.isEmpty() }}",
"paginationCompleteWhen": "other"
}
}
},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "sort_by",
"value": "created_at"
},
{
"name": "sort_order",
"value": "desc"
}
]
},
"nodeCredentialType": "zendeskApi"
},
"credentials": {
"zendeskApi": {
"id": "fLpWOCOisAwS9cK2",
"name": "Zendesk account"
}
},
"typeVersion": 4.2
},
{
"id": "b3ecd6a3-616d-4a7f-8db9-fd8eb88ddae8",
"name": "Body to Markdown",
"type": "n8n-nodes-base.markdown",
"position": [
1360,
240
],
"parameters": {
"html": "={{ $json.body }}",
"options": {},
"destinationKey": "markdown"
},
"typeVersion": 1
},
{
"id": "70e66adc-d38f-40b2-8bef-245df759b2de",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1140,
-900
],
"parameters": {
"color": 7,
"width": 400,
"height": 300,
"content": "## Attribution\n\nThis template was created by [Agent Studio](https://agentstudio.io/) and is available for free on [n8n](https://n8n.io/workflows/)\n\nIf you need help implementing the template or modifying it, [just reach out 💌](mailto:[email protected]?subject=Store%20Zendesk%20KB%20Articles)\n\n👉 [Find more of our templates](https://n8n.io/creators/agentstudio/)"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Split Out": {
"main": [
[
{
"node": "Set fields to store",
"type": "main",
"index": 0
}
]
]
},
"Set base url": {
"main": [
[
{
"node": "Get articles since last run",
"type": "main",
"index": 0
}
]
]
},
"Set base_url": {
"main": [
[
{
"node": "Get all articles",
"type": "main",
"index": 0
}
]
]
},
"Body to Markdown": {
"main": [
[
{
"node": "Store Zendesk articles to Airtable",
"type": "main",
"index": 0
}
]
]
},
"Get all articles": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Set base url",
"type": "main",
"index": 0
}
]
]
},
"Set fields to store": {
"main": [
[
{
"node": "Body to Markdown",
"type": "main",
"index": 0
}
]
]
},
"Get articles since last run": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "Set base_url",
"type": "main",
"index": 0
}
]
]
}
}
}