AutomationFlowsData & Sheets › Sync Zendesk Knowledge Base Articles to Airtable with Markdown Conversion

Sync Zendesk Knowledge Base Articles to Airtable with Markdown Conversion

ByAgent Studio @agentstudio on n8n.io

Customer service or support teams who want to use their Zendesk articles in other tools. Content/Knowledge managers consolidating or migrating knowledge bases. Ops/automation specialists who want Markdown versions of articles (could be adapted to Notion, Google Sheets, or any…

Event trigger★★★★☆ complexity21 nodesAirtableHTTP Request
Data & Sheets Trigger: Event Nodes: 21 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #5876 — we link there as the canonical source.

This workflow follows the Airtable → 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "d3490654-2438-4d56-95ef-95a7c49b58a0",
      "name": "When clicking \u2018Execute workflow\u2019",
      "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": {
          "name": "<your credential>"
        }
      },
      "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\u2019s designed for teams who want to repurpose, back up, or enrich Zendesk content\u2014making 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 \u201cToken Access,\u201d 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**\ud83d\udca1 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\u2019s 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\ud83d\udca1 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": {
          "name": "<your credential>"
        }
      },
      "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": {
          "name": "<your credential>"
        }
      },
      "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![Agent Studio](https://agentstudio.io/images/agent_studio_logo_small.png)\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 \ud83d\udc8c](mailto:hello@agentstudio.io?subject=Store%20Zendesk%20KB%20Articles)\n\n\ud83d\udc49 [Find more of our templates](https://n8n.io/creators/agentstudio/)"
      },
      "typeVersion": 1
    }
  ],
  "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 \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Set base_url",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Customer service or support teams who want to use their Zendesk articles in other tools. Content/Knowledge managers consolidating or migrating knowledge bases. Ops/automation specialists who want Markdown versions of articles (could be adapted to Notion, Google Sheets, or any…

Source: https://n8n.io/workflows/5876/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

This workflow is built for real estate investors, wholesalers, and skip tracers who need to find contact details -- phone numbers, emails, and addresses -- for property owners at scale. It automates t

HTTP Request, Airtable
Data & Sheets

This template uses the Sleeper API to fetch the complete list of NFL players and stores them in an Airtable base. It’s built to run daily and ensures you have the most up-to-date player list for fanta

HTTP Request, Airtable
Data & Sheets

This workflow acts as a junior finance research analyst for a UK boutique M&A or corporate finance team. It listens for Slack messages, classifies the request, gathers company or market data, and prod

HTTP Request, Google Drive, Google Docs +5
Data & Sheets

Sync your Google Contacts with your Notion database.

Google Contacts, HTTP Request, Notion +1
Data & Sheets

Agendamiento_v2. Uses n8n-nodes-evolution-api, redis, httpRequest, executeWorkflowTrigger. Event-driven trigger; 59 nodes.

N8N Nodes Evolution Api, Redis, HTTP Request +3