N
n8n Store
Workflow Market
Sync Zendesk Knowledge Base Articles to Airtable with Markdown Conversion

Sync Zendesk Knowledge Base Articles to Airtable with Markdown Conversion

by agentstudio0 views

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
PriceGratis
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![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 💌](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
          }
        ]
      ]
    }
  }
}

相关工作流