---
title: "Slack Canvas to Confluence Migration | ClonePartner"
description: "Slack Canvas to Confluence: Slack Canvas has no parent-child relationships, folder paths, or ordering metadata…"
source: Slack Canvas
target: Confluence
canonical: "https://clonepartner.com/migrate/slack-canvas-to-confluence"
---

# Slack Canvas → Confluence migration

Slack Canvas to Confluence migration — canvases exported with their structure and channel context preserved.

## Why teams migrate from Slack Canvas to Confluence

Migrating from Slack Canvas to Confluence requires fully custom engineering — there is no native export wizard, Atlassian importer, or third-party connector bridging the two platforms. The fundamental data model mismatch is severe: Slack Canvas stores content as flat, structureless markdown objects with no parent-child relationships, no folder paths, and no sibling ordering, while Confluence is built around a strict space-to-page-to-child-page hierarchy. Every canvas must be read via the Slack files.list API filtered to the canvas type, its markdown content converted to Confluence's XHTML-based storage format, and then pushed to Confluence via the REST API. The page tree structure required by Confluence does not exist in Slack and must be designed by the migration team before any automation is written.

## Key migration challenges

- **No Native Migration Path** — There is no export wizard, Atlassian importer, or third-party connector available; the entire migration pipeline must be built using the Slack API and Confluence REST API.
- **Flat-to-Hierarchical Structure Design** — Slack Canvas has no parent-child relationships, folder paths, or ordering metadata, so the Confluence page tree hierarchy must be fully designed by the migration team using derived signals such as channel associations and title naming conventions.
- **Markdown-to-Storage-Format Conversion** — Canvas content is stored as markdown while Confluence requires XHTML-based storage format with custom <code>ac:</code> and <code>ri:</code> namespace elements, requiring a multi-stage conversion pipeline with post-processing for macros, links, and attachments.
- **Canvas Enumeration API Limitations** — There is no <code>canvases.list</code> endpoint; all canvases must be discovered via the Tier 3 rate-limited <code>files.list</code> method, which silently omits canvases in private channels or DMs the token cannot access.
- **Cross-Shared Canvas Disambiguation** — Standalone canvases shared into multiple channels appear once in the API but have multiple channel associations, requiring explicit decisions about which Confluence parent page each canvas belongs under and whether to duplicate or cross-link content.
- **User Identity and Attachment Re-upload** — Slack user mentions must be resolved from internal Slack UIDs to Atlassian Account IDs via <code>users.info</code>, and all inline images and file attachments must be individually downloaded from Slack's private URLs and re-uploaded to Confluence before page content can reference them.

## Entity mappings

- **Standalone Canvas** (Slack Canvas) → **Pages** (Confluence)
- **Channel Canvas** (Slack Canvas) → **Pages** (Confluence)
- **Canvas Content (Markdown)** (Slack Canvas) → **Pages** (Confluence)
- **Table** (Slack Canvas) → **Pages** (Confluence)
- **Checklist** (Slack Canvas) → **Pages** (Confluence)
- **Image** (Slack Canvas) → **Attachments** (Confluence)
- **File Attachment** (Slack Canvas) → **Attachments** (Confluence)
- **Comment** (Slack Canvas) → **Comments (Footer)** (Confluence)
- **Channel** (Slack Canvas) → **Spaces** (Confluence)
- **User** (Slack Canvas) → **Space Permissions** (Confluence)
- **Canvas Lookup** (Slack Canvas) → **Content Properties** (Confluence)

## What breaks during migration

- **Canvas Content (Markdown Body)** [Breaks] — Every canvas requires multi-stage conversion from markdown to Confluence XHTML storage format, with custom handling for macros, code blocks, task lists, and internal links — no automated tool handles this end-to-end.
- **Page Hierarchy / Structure** [Breaks] — Slack Canvas contains zero structural metadata such as parent references or folder paths, meaning the entire Confluence page tree must be manually designed or derived from weak signals like channel associations and title conventions.
- **Attachments and Inline Images** [Breaks] — Inline images reference Slack private download URLs that expire or require authentication, so every attachment must be individually downloaded and re-uploaded to Confluence before the referencing page is published.
- **Canvas Inventory Completeness** [Breaks] — The <code>files.list</code> API silently omits canvases in private channels or DMs that the migration token cannot access, making complete inventory dependent on token scope and bot channel membership at crawl time.
- **User Mentions** [Workaround] — Slack mentions using internal UIDs like <code>&lt;@U12345678&gt;</code> must be resolved to Atlassian Account IDs via the <code>users.info</code> API, requiring a full user identity mapping and failing silently for deactivated or external accounts.
- **Canvas Comments** [Workaround] — Comments are not embedded in canvas content and must be correlated separately through <code>file_conversations.json</code> and matching <code>FC:&lt;canvas_id&gt;</code> folders in exports, with no direct API equivalent in Confluence comments structure.
- **Tables** [Workaround] — Canvas tables are visual grids capped at 300 cells with no column types or formulas, making XML conversion straightforward for simple tables but requiring manual review for any tables approaching the cell limit.
- **Cross-Shared Standalone Canvases** [Workaround] — Canvases shared into multiple channels require an explicit ownership decision before migration, and any chosen cross-linking strategy in Confluence must be implemented manually as no automated deduplication logic exists.
- **Channel Canvas vs. Standalone Canvas Classification** [Direct] — The <code>is_channel_space</code> and <code>linked_channel_id</code> fields on file objects allow programmatic separation of channel-native canvases from standalone canvases, making classification reliable once token scope is correctly configured.
- **Basic Inline Formatting (Bold, Italic, Lists)** [Direct] — Standard markdown formatting elements such as bold, italic, strikethrough, and ordered and unordered lists map directly to well-supported Confluence storage format HTML elements with no edge cases.

## What we migrate

### Migration Filter

- **Time Range** — Migrate articles created or updated within a specific period
- **Language & Locale** — Migrate specific language versions or translations only
- **Category Selection** — Select specific sections, folders, or categories to migrate
- **Publication Status** — Filter by published, draft, archived, or internal-only articles

### Data Types

- **Tags & Metadata** — SEO settings, search labels, author attribution, and article tags
- **Articles & Content** — Core help articles including HTML formatting and inline images
- **Media & Attachments** — All downloadable files, PDFs, and media assets embedded in articles
- **Categories & Hierarchy** — Full folder structure with sections, sub-sections, and parent categories

## Complete technical guide

For a deep-dive into the technical process, data mapping, and step-by-step migration workflow, read our full guide: [Slack Canvas to Confluence Migration: APIs, Limits & Mapping](https://clonepartner.com/blog/slack-canvas-to-confluence-migration-apis-limits-mapping/).

## Frequently asked questions

### Is there a Slack canvases.list API endpoint?

No. There is no dedicated canvases.list method. Slack's developer docs direct you to files.list filtered to the canvas type. This is a Tier 3 endpoint (roughly 50 requests per minute) returning paginated results. A bot token only sees canvases in channels the bot has joined.

### Can you import Slack Canvas version history into Confluence?

No. Confluence's REST API creates every page at version 1 with no way to insert historical versions or backdate edits. The only mechanism that preserves version history is XML space import, which requires a Confluence source. Canvas version history must be archived externally.

### Can Slack Canvas comments become Confluence inline comments?

Not faithfully. Canvas comments are thread-style channel messages, not text-anchored annotations. Confluence inline comments require exact text-selection anchors (textSelection, textSelectionMatchCount) that Slack does not export. Footer comments are the only reliable target.

### What is the difference between a channel canvas and a standalone canvas?

A channel canvas is the single built-in canvas attached to a Slack channel — exactly one per channel, with access tied to channel membership. A standalone canvas is a free-floating document created separately and shared explicitly to channels or users. Only paid Slack plans support standalone canvases.

### Which Confluence API uploads attachments — V1 or V2?

V1. The Confluence V2 API is GET-only for attachments with no POST upload endpoint. Use the V1 content-attachments API: POST /rest/api/content/{pageId}/child/attachment with multipart form data and the X-Atlassian-Token: nocheck header.

## Get a fixed-price quote

[Talk to an engineer](https://clonepartner.com/talk-to-us?duration=30&utm_source=xtoy&utm_medium=button&utm_campaign=demo_bookings&utm_content=cta_click&utm_term=demo_button_click) about your Slack Canvas → Confluence migration.
