Confluence to Quip Migration: API Limits, Methods & Data Mapping
Quip retired its native import in 2024. Learn how to migrate Confluence to Quip using the Automation API, handle 503 rate limits, and map fields correctly.
There is no native import path from Confluence to Quip. Quip retired its Upload/Import option and the Import API endpoint on January 19, 2024 — and Salesforce has since announced the full retirement of Quip, with subscriptions no longer renewable after March 1, 2027. If you are migrating Confluence content into Quip today, you are working against two headwinds: a target platform with no import tool and a ticking end-of-life clock. (quip.com)
This guide covers the real methods for moving Confluence spaces into Quip, the hard API constraints on both sides, the field-mapping decisions that determine whether your migration preserves data or silently drops it, and the exact workflow for an API-driven migration.
Quip End-of-Life (March 2027): Salesforce is retiring all Quip products. Subscriptions cannot be renewed after March 1, 2027. After your subscription expires, the site enters a 90-day read-only phase, followed by blocked logins, then data deletion. If you are migrating into Quip for short-term Salesforce ecosystem consolidation, plan your exit strategy at the same time.
Why Teams Still Migrate from Confluence to Quip
Given Quip's trajectory, this might seem like a strange direction. But we see it regularly. The typical driver is a Salesforce ecosystem consolidation mandate — a corporate decision to move all documentation into Salesforce-adjacent tools before a larger platform shift to Slack Canvases or Agentforce. Other scenarios include short-term Salesforce integration needs where Quip's live data features (pulling CRM records directly into documents) outweigh the EOL risk for the next 12–18 months.
If you are evaluating whether Quip is the right long-term target for your Confluence content, it almost certainly is not. But if the business requirement is to get content into Quip now, this guide will get you there with the fewest surprises.
For teams considering other destinations, see our guides on Confluence to SharePoint, Confluence to Coda, or Confluence to Notion.
Best Migration Method for Each Use Case
| Method | Fidelity | Rich Text | Attachments | Comments | Automation | Best For |
|---|---|---|---|---|---|---|
| Manual Copy-Paste | Very Low | Partial | ❌ Manual | ❌ | ❌ | <30 pages, one-off |
| CSV/XLSX Staging | Low–Medium | ❌ | ❌ | ❌ | Partial | Structured tables into Quip spreadsheets |
| Confluence Export → Manual Rebuild | Low | Partial (HTML) | Manual re-upload | ❌ | ❌ | Small spaces, low complexity |
| Zapier / iPaaS Triggers | Low–Medium | Basic HTML | ❌ | ❌ | ✅ (trigger-based) | Ongoing sync of new pages |
| API-Driven Custom Scripts | High | ✅ (HTML conversion) | ✅ (blob upload) | Partial | ✅ | Full workspace migrations |
| ClonePartner Managed Migration | Highest | ✅ | ✅ | ✅ | ✅ | Complex spaces, tight deadlines |
The API-driven approach is the only realistic path for anything beyond a handful of pages. Every other method either drops data silently or requires so much manual effort that it is not a migration — it is re-creation. CSV is a staging format for tabular data, not a document migration format. PDF is for reading. The API is for migration. (support.atlassian.com)
Understanding the Data Model Mismatch: Spaces vs. Folders
Before you write a single line of migration code, you need to understand why Confluence content does not map cleanly to Quip.
Confluence organizes content in a strict Space → Page Tree hierarchy. Each space has a root page, and every other page is a child or descendant of that root. The parent-child relationships are explicit and enforced. Blog posts live in a separate flat list within each space. Pages are versioned, and inline comments are attached to specific content ranges. The page model exposes stable IDs plus parentId, authorId, createdAt, version, and body fields, so you can reconstruct lineage without relying on titles or URLs. (developer.atlassian.com)
Quip has a fundamentally different model. Quip "folders" are tag-like — a single document (Quip calls them "threads") can exist in multiple folders simultaneously. There is no enforced parent-child hierarchy between documents. Permissions are inherited from folders, and Quip supports restricted subfolders. A naive one-to-one mapping of every Confluence label, page branch, and permission set into folders will create chaos fast. (quip.com)
This mismatch creates several mapping problems:
- A Confluence page tree 5 levels deep has no direct equivalent in Quip. You need to decide: flatten it into a single folder per space, or create nested Quip folders that approximate the hierarchy?
- Confluence blog posts have no structural analog in Quip — they become regular documents.
- Confluence inline comments attach to content ranges; Quip's conversation pane is document-level, not section-level for inline annotations.
- Quip folders are also permission containers, not just navigation aids. Creating a folder for every Confluence label risks a taxonomy explosion with unintended permission implications.
Canonical Path Decision: Before migration, map every Confluence page's full path (e.g., ENGINEERING/Architecture/ADRs/ADR-042) to a target Quip folder path. This mapping table becomes your single source of truth. Without it, you will end up with a flat dump of documents that no one can navigate.
The cleanest pattern in practice:
- Space → top-level Quip folder
- Parent/child page path → subfolder path plus breadcrumb block in the document
- Labels/tags → metadata block inside the document or selected secondary folders
- Page restrictions → restricted Quip folders or direct member sharing
- Original URL → external redirect manifest, since Confluence pages and Quip threads use different URL models
How to Export Data from Confluence (and What Gets Left Behind)
The first half of the migration is getting content out of Confluence. Your export method determines your ceiling for fidelity on the Quip side.
For a deep dive into every extraction method, see our complete guide: How to Export All Data from Confluence: Methods, Limits & Tools.
Confluence Cloud Export Formats
| Format | Pages | Blog Posts | Comments | Attachments | Macros | Best Use |
|---|---|---|---|---|---|---|
| ✅ | ❌ | ❌ | Embedded images only | Rendered (lossy) | Archival snapshots | |
| HTML | ✅ | ❌ | ❌ | In attachment folders | Rendered (lossy) | Page body harvesting |
| CSV | ✅ | ✅ | ✅ | ✅ | Metadata only | Cloud-to-Cloud re-import |
| XML | ✅ | ✅ | ✅ | ✅ | Storage format preserved | Full-fidelity backup |
| REST API | ✅ | ✅ | ✅ | ✅ | Storage format + expansion | Programmatic migration |
What Drops Silently
- PDF and HTML space exports exclude blog posts. This is a long-standing Confluence Cloud limitation. Comments are also excluded from both formats. (support.atlassian.com)
- Word exports cap at 50 images per page. Anything beyond that is permanently dropped.
- XML exports exclude Team Calendars. If your spaces use Team Calendar macros, that data does not come out in the XML.
- Attachments over 100 MB lose search indexing. Larger Office files can fail text extraction and not be searchable; attachment names with special characters may also be missed by Confluence search. If your migration scripts use API search queries to discover content, large or oddly-named attachments will not appear in results. Walk attachment endpoints per page instead. (support.atlassian.com)
- HTML exports can include deleted attachments still sitting in the space trash until they are purged. If you do not normalize that, you can migrate ghost files. (support.atlassian.com)
- Only content visible to the exporting user is included, except when a site admin performs CSV or XML exports (in which case all content is exported). (support.atlassian.com)
Recommended: REST API Export
For a Confluence-to-Quip migration, the REST API is the right extraction method. It gives you:
- Full page content in storage format (Confluence's XHTML-based XML with macro markup)
- Blog posts via the
/wiki/api/v2/blogpostsendpoint - Inline comments via
/wiki/api/v2/pages/{id}/inline-comments - Attachments via
/wiki/rest/api/content/{id}/child/attachment - Page tree structure via the
ancestorsfield on each page - Body conversion via the Content Body API, which can convert storage format into
vieworexport_view(developer.atlassian.com)
import requests
BASE = "https://your-domain.atlassian.net/wiki/api/v2"
HEADERS = {"Authorization": "Basic <base64_email:api_token>"}
def get_all_pages(space_id):
pages = []
cursor = None
while True:
params = {"space-id": space_id, "limit": 250, "body-format": "storage"}
if cursor:
params["cursor"] = cursor
resp = requests.get(f"{BASE}/pages", headers=HEADERS, params=params)
resp.raise_for_status()
data = resp.json()
pages.extend(data["results"])
cursor = data.get("_links", {}).get("next")
if not cursor:
break
return pagesConfluence Cloud Rate Limits: Atlassian uses a points-based rate-limiting model that tracks usage in hourly intervals. Complex queries cost more points. Once the quota is reached, Atlassian returns HTTP 429 with a Retry-After header until the next reset window. Build your extraction scripts to read and respect that header.
Quip Import Limitations and API Rate Limits
This is where most Confluence-to-Quip migrations stall or fail.
The Import Tool Is Gone
Quip's native Upload/Import option — the button in the Compose menu that accepted .docx, .xlsx, and other files — was retired on January 19, 2024. The corresponding Import API endpoint was retired at the same time. There is no native bulk import mechanism left. The only programmatic way to create content in Quip is the Automation API. (quip.com)
Quip Automation API: The Hard Limits
| Constraint | Limit | Notes |
|---|---|---|
| Per-user rate limit | ~50 requests/min | Per access token |
| Per-company rate limit | 600 requests/min | Shared across all API consumers |
| Content per request | 1 MB | For new-document calls (quip.com) |
| Message body size | 100 KB | For /1/messages/new calls (quip.com) |
| Admin API rate limit | 100 req/min, 1,500 req/hr | Separate from Automation API |
| Bulk export limit | 36,000 documents/hour | Export only; not relevant for import |
| Max API keys per company | 100 | Across all integrations |
| HTTP response on rate limit | 503 (not 429) | Breaks standard retry logic |
| Image upload | Must be uploaded as blobs before referencing in HTML | Separate /1/blob/{thread_id} call |
| Content format | HTML or Markdown | HTML is the default |
| Spreadsheet limits | 100,000 cells max; 1,000 rows per API call | Best performance at ≤30,000 cells (quip.com) |
The HTTP 503 Trap
This is the single most common failure mode in DIY Confluence-to-Quip scripts. When you exceed the rate limit, Quip returns HTTP 503, not the industry-standard HTTP 429. Most HTTP client libraries and retry middleware treat 503 as a server error ("service unavailable") and either fail immediately or retry aggressively — the exact opposite of what you should do when rate-limited.
You need custom retry logic that:
- Reads the
X-Ratelimit-RemainingandX-Ratelimit-Resetheaders from every response - Treats 503 responses as rate-limit signals, not server errors
- Implements exponential backoff with jitter, using
X-Company-Retry-Afterwhen available
import time
import requests
def quip_request(method, url, **kwargs):
"""Wrapper that handles Quip's non-standard 503 rate limits."""
max_retries = 5
for attempt in range(max_retries):
resp = requests.request(method, url, **kwargs)
if resp.status_code == 503:
# Quip uses 503 for rate limits, not 429
retry_after = resp.headers.get("X-Company-Retry-After")
wait = int(retry_after) if retry_after else (2 ** attempt)
time.sleep(wait)
continue
resp.raise_for_status()
return resp
raise Exception(f"Failed after {max_retries} retries: {url}")For more on Quip's API quirks, see How to Export Data from Quip: Methods, API Limits & Migration Prep and our Quip to Notion Migration guide, which documents the same 503 behavior in detail.
Content and Parser Quirks
Quip's new-document endpoint accepts HTML or Markdown with a 1 MB content cap per request. If you want a spreadsheet, the content must be wrapped in an HTML <table>. Quip's parser treats <th> as <td>, and when more than one <tr> is supplied, the first row is automatically interpreted as the header row. (quip.com)
CSV/XLSX is a staging format, not a true Quip import format. Your pipeline still needs to convert rows into HTML table markup. For large sheets, stay under the documented cell and row thresholds.
Images and files require a separate pass. Quip's blob upload (/1/blob/{thread_id}) uploads an image or binary and returns a URL you embed into the document body. Large comment histories need pagination — the recent-messages endpoint returns 25 messages by default with a maximum of 100 per call. (quip.com)
Operational Details
A few details that trip up migration scripts in production:
- Tokens expire every 30 days. For long-running migrations, build token refresh into your pipeline. (quip.com)
- Use a bot or placeholder user for API integrations. If you use a real employee's token and that employee is deprovisioned, ownership of all API-created content becomes orphaned.
- If you omit
member_idswhen creating a document, Quip creates it in the authenticated user's Private folder. This is a classic cause of "invisible" migration output — documents created successfully but visible to no one except the API token holder. (quip.com)
Three hard limits to design around: 1 MB per new-document request, 100 KB per message, and 50 req/min/user. If your script tries to create one giant page, dump an entire comment history into one message, or blast parallel workers without a scheduler, it will fail.
Field Mapping: Confluence → Quip
The hardest part of the migration is not moving bytes — it is deciding what maps to what.
| Confluence Field | Quip Equivalent | Handling |
|---|---|---|
| Page title | Thread title | Direct map |
| Page body (storage format) | Thread HTML content | Convert XHTML → clean HTML; strip macros |
| Blog post | Thread (document type) | Treated as regular document; place in /Blog/YYYY/MM folder |
| Page tree hierarchy | Folder nesting | Scripted folder creation preserving canonical path |
| Inline comments | Conversation messages | Lossy — no positional anchoring in Quip |
| Page-level comments | Conversation messages | Map via /1/messages/new |
| Attachments | Blob uploads | Upload via /1/blob/{thread_id}, then reference in HTML |
| Inline images | Blob upload + HTML <img> |
Must upload blob first, get URL, inject into HTML |
| Labels/tags | Folder membership or metadata block | One folder per label risks taxonomy explosion |
| Page author | Not mapped natively | Quip attributes creation to the API token holder; store original in doc header |
| Created/updated timestamps | Not mapped natively | Quip sets its own timestamps; store originals in metadata |
| Page restrictions | Folder sharing | Map Confluence groups → Quip folder membership |
| Macros (TOC, status, expand, etc.) | No equivalent | Render to static HTML, strip, or convert to placeholder |
| Confluence layouts (sections/columns) | HTML <table> or flat content |
Multi-column layouts lose structure |
| Original URL | External redirect manifest | Store confluence_page_id → quip_thread_id mapping |
| Versions / watchers / likes | External archive | Keep outside Quip unless legally required |
The core rule: preserve business meaning first, platform-specific features second. Quip's create-document API exposes content, format, title, members, and type — not arbitrary historical author or created-at fields. If historical attribution matters (and it usually does), store it explicitly in each document's header or an external manifest. (quip.com)
Macro Handling: What Survives and What Does Not
Confluence's storage format uses <ac:structured-macro> elements for everything from code blocks to Jira issue links. Quip has no macro system. You have three choices for each macro type:
- Render to static HTML — works for
code,info,warning,note, andpanelmacros. Convert them to styled<div>or<pre>blocks. - Strip entirely — appropriate for
pagetree,children,recently-updated, and other dynamic/navigation macros that have no meaning outside Confluence. - Convert to a human-readable placeholder — for
jira,status, androadmapmacros, insert a visible text note like[JIRA: PROJ-123 — link: https://...].
Before migration, scan all page bodies for <ac:structured-macro> elements and build a catalog. Decide on render/strip/placeholder for each type. This catalog becomes a configuration input to your transformation pipeline.
For a detailed breakdown of macro mapping across platforms, see our Confluence to SharePoint Migration guide, which covers similar challenges.
Step-by-Step: API-Driven Confluence to Quip Migration
Here is the technical workflow for a full API-driven migration.
Step 1: Inventory and Map
Before touching any creation API:
- Export the full page tree from Confluence using the REST API. Record each page's
id,title,spaceId,parentId,status, andancestorsarray. Use IDs as your primary key, not titles. - Build the canonical folder map — decide which Confluence paths map to which Quip folder structure.
- Catalog macros — scan all page bodies for
<ac:structured-macro>elements and decide on render/strip/placeholder for each type. - Measure scale — count total pages, blog posts, attachments, and total attachment size. This determines your migration time budget based on Quip's 600 req/min company limit.
- Check export permissions — on restricted spaces, use a site-admin-backed token so visibility rules do not silently remove pages from the inventory. (support.atlassian.com)
Step 2: Create the Quip Folder Structure
Using the Quip Automation API, create your target folder hierarchy:
curl -X POST https://platform.quip.com/1/folders/new \
-d "title=Engineering" \
-d "parent_id=<root_folder_id>" \
-H "Authorization: Bearer ${QUIP_TOKEN}"Store the returned folder IDs in your mapping table. Each Confluence space or sub-tree gets a corresponding Quip folder. Serialize folder creation in tree order — wait for parent folder IDs before creating children, or you will end up with a flat structure.
Step 3: Extract and Transform Content
For each Confluence page:
- Fetch the storage-format body via the Confluence REST API.
- Parse the XHTML — use an XML parser (not regex) to handle Confluence's custom
ac:namespace elements. - Transform macros — render, strip, or replace each
<ac:structured-macro>per your catalog. - Extract image references — find all
<ac:image>elements, download the referenced attachments from Confluence, and prepare them for Quip blob upload. - Clean the HTML — strip Confluence-specific attributes, namespaces, and layout markup. Output clean HTML that Quip's API will accept:
<h1>–<h3>,<p>,<ul>,<ol>,<table>,<img>,<a>,<b>,<i>,<code>,<pre>. - Chunk if necessary — if the cleaned HTML exceeds 1 MB, split the page by heading or section. Create a parent index document that links to the child documents.
Step 4: Upload Attachments and Images
For each image or file attachment:
with open("diagram.png", "rb") as f:
resp = quip_request(
"POST",
f"https://platform.quip.com/1/blob/{thread_id}",
files={"file": ("diagram.png", f, "image/png")},
headers={"Authorization": f"Bearer {QUIP_TOKEN}"}
)
blob_url = resp.json()["url"]Replace the Confluence image references in your cleaned HTML with the returned Quip blob URLs.
Image Upload Order Matters: Quip requires images to be uploaded as blobs before they can be referenced in document HTML. If you create the document first and try to add images later via edit-document, you will need the document's thread_id — plan your call sequence accordingly.
Step 5: Create Documents in Quip
For each transformed page:
resp = quip_request(
"POST",
"https://platform.quip.com/1/threads/new-document",
data={
"content": cleaned_html,
"title": page_title,
"member_ids": target_folder_id,
"format": "html"
},
headers={"Authorization": f"Bearer {QUIP_TOKEN}"}
)
new_thread_id = resp.json()["thread"]["id"]The member_ids parameter places the new document into the specified folder. Quip folders are tag-like, so you can add a document to multiple folders in one call by comma-separating the IDs. Always pass member_ids — omitting it creates the document in the API user's Private folder, invisible to everyone else.
Step 6: Migrate Comments
For each Confluence page that had comments:
quip_request(
"POST",
"https://platform.quip.com/1/messages/new",
data={
"thread_id": new_thread_id,
"content": f"[Migrated comment by {author} on {timestamp}]\n{comment_body}"
},
headers={"Authorization": f"Bearer {QUIP_TOKEN}"}
)Inline comments lose their positional anchoring — they become conversation-pane messages. This is a fundamental limitation of Quip's data model. Include original author and timestamp in the message body, since Quip attributes all API-created messages to the token holder.
Remember the 100 KB message body limit. Large comment histories need to be chunked across multiple messages. For compliance-heavy migrations, preserve the complete comment transcript even if it requires multiple API calls per page.
Step 7: Rewrite Internal Links and Validate
Confluence internal links use <ac:link> elements with <ri:page> resource identifiers. After migration, these need to be rewritten to Quip URLs. This requires a two-pass approach:
- First pass: Migrate all documents and build a complete
confluence_page_id → quip_thread_idmapping. - Second pass: Iterate through all Quip documents and replace any remaining Confluence links with the corresponding Quip URLs using the
edit-documentAPI.
Quip threads have stable IDs even if the user-facing secret path changes. Anchor your redirect manifest on thread IDs, not display paths.
Post-Migration QA and Troubleshooting
Migration without validation is just moving problems from one platform to another. Run these checks before declaring success.
Validation Checklist
- Page count match — compare total Confluence pages + blog posts against total Quip threads created.
- Folder structure audit — walk the Quip folder tree and compare against your canonical mapping table.
- Attachment integrity — spot-check 10% of documents with attachments. Open each in Quip and verify it is not corrupted.
- Image rendering — open 20+ documents in Quip's web UI and confirm inline images display correctly.
- Table fidelity — check complex Confluence tables (merged cells, nested tables) for structural integrity after HTML conversion.
- Macro placeholders — search for your placeholder text (e.g.,
[JIRA:) to confirm macros were handled, not silently dropped. - Comment presence — for pages that had inline comments, verify the conversation pane in Quip contains the migrated messages.
- Permissions — confirm folder sharing matches the intended access model.
- Visibility — confirm documents are not trapped in the API user's Private folder.
- Idempotency — verify your manifest correctly maps
confluence_content_id → quip_thread_idso reruns do not create duplicates.
Common Failure Modes
| Symptom | Cause | Fix |
|---|---|---|
| Documents created but empty | HTML content exceeded Quip's 1 MB per-request limit | Chunk large pages into header + edit-document APPEND calls |
| Images show as broken icons | Blob uploaded to wrong thread, or blob URL not substituted in HTML | Verify thread_id matches between blob upload and document creation |
| Random documents missing | 503 errors treated as fatal instead of rate-limit | Implement 503-aware retry logic |
| Folder structure flat | Folder creation script did not wait for parent folder IDs | Serialize folder creation in tree order |
| Confluence links point nowhere | <ac:link> references not rewritten to Quip URLs |
Build a page-ID → thread-ID lookup and rewrite all links post-migration |
| Special characters garbled | Encoding mismatch between Confluence UTF-8 and Quip API | Ensure Content-Type: application/x-www-form-urlencoded; charset=utf-8 on all POST requests |
| Documents invisible to team | member_ids omitted; Quip created docs in Private folder |
Re-assign folder membership via edit-thread |
| Too many duplicates | Reruns keyed on title instead of source ID | Maintain an idempotent confluence_content_id → quip_thread_id manifest |
| Long pages truncated | Hit 1 MB content limit | Split by section and rebuild navigation |
| Comment replay failing | Exceeded 100 KB message limit | Chunk comments into multiple messages |
| Spreadsheet layout broken | <th> parsed as <td>, header row misinterpreted |
Recheck header handling and row batching (quip.com) |
Performance Considerations for Large-Scale Migrations
| Workspace Size | Estimated Duration | Key Bottleneck |
|---|---|---|
| <500 pages | 1–3 hours | Quip per-user rate limit (50 req/min) |
| 500–5,000 pages | 3–8 hours | Quip per-company rate limit (600 req/min) |
| 5,000–20,000 pages | 8–24 hours | Attachment upload volume; 503 backoffs |
| 20,000+ pages | 1–3 days | Must request Quip rate-limit increase from Salesforce Support |
Rate-Limit Budgeting
At 600 requests per minute per company, budget your throughput per page:
| Operation | API Calls per Page | Pages/min at 600 rpm |
|---|---|---|
| Create document | 1 | 600 |
| Upload 3 images | 3 | 150 |
| Add 2 comments | 2 | 100 |
| Create doc + 3 images + 2 comments | 6 | 100 |
For a 5,000-page Confluence space with an average of 3 images and 2 comments per page, that is 30,000 API calls — roughly 50 minutes at sustained maximum throughput with zero 503 backoffs. In practice, with backoff delays, expect 2–4 hours.
For large migrations (10,000+ pages), contact Salesforce Support to request a rate-limit increase. To parallelize, use multiple Quip user tokens (each gets its own per-user bucket) while staying under the company-wide 600 rpm ceiling. Use a scheduler, not brute-force parallelism — share rate-limit signals across workers and back off with jitter instead of letting each worker fail independently.
DIY Scripts vs. iPaaS vs. Managed Service
DIY Custom Scripts
Pros: Full control over mapping, transformation, and pacing. No vendor lock-in. Can be adapted to specific macro handling requirements.
Cons: You own the 503 retry logic, the macro parser, the blob upload sequencing, and the Confluence-to-HTML transformation. Engineering time is typically 40–80 hours for a medium workspace (1,000–5,000 pages), plus testing and QA.
Zapier / Make / n8n (iPaaS)
Zapier offers a Confluence ↔ Quip integration that can trigger Quip document creation when a new Confluence page is published. This is useful for ongoing sync of new content but is not a bulk migration tool. (zapier.com)
Limitations:
- Triggers on new pages only — no backfill of existing content
- No attachment handling
- No macro conversion
- Basic HTML only — Confluence storage format is not parsed
- Limited control over retries and idempotency
A cautionary note: Quip's own release notes indicate legacy integrations such as Zapier were retired on July 18, 2025, while Zapier still markets current Quip connectors. Test end-to-end before committing to a no-code path. (quip.com)
ClonePartner Managed Migration
For teams that need the migration done correctly the first time — especially under time pressure with Quip's EOL approaching — a managed migration eliminates the engineering risk.
What we handle that DIY scripts typically do not:
- Non-standard 503 backoff logic tuned to Quip's undocumented retry behavior
- Canonical folder resolution — mapping Confluence's nested page trees into Quip's multi-folder tagging without losing navigational context
- Large attachment extraction — bypassing Confluence's 100 MB indexing limit to ensure every file migrates
- Macro and formatting translation — parsing Confluence's XHTML storage format and converting it to Quip-compatible HTML while preserving tables, code blocks, and inline images
- Comment migration with author attribution and timestamp preservation
- 1 MB content chunking — splitting oversized pages without breaking document coherence
We have completed 1,200+ migrations across knowledge bases, help desks, and CRMs. If your Confluence-to-Quip project involves more than a few hundred pages or has tight compliance or timeline requirements, talk to us.
Should You Migrate to Quip at All?
We believe in giving honest advice, even when it means less migration work for us.
Quip is being retired. Salesforce has been explicit about this. If your Confluence content has a lifespan beyond 2028, migrating to Quip means migrating twice — once now, and once when Quip shuts down. For most teams, migrating directly to the long-term target (Notion, SharePoint, Coda, Slack Canvases) saves time and money.
But if you have a valid short-term reason — a Salesforce integration dependency, a contractual obligation, or a phased migration plan where Quip is an interim stop — the API-driven approach described above works. Just plan the exit at the same time you plan the entry.
For teams evaluating CSV-based approaches for any part of this workflow, our guide on Using CSVs for SaaS Data Migrations explains why CSVs break down for hierarchical wiki content.
Frequently Asked Questions
- Can you import Confluence pages into Quip?
- Not directly. Quip retired its Upload/Import option and Import API on January 19, 2024. The only way to programmatically create content in Quip is through the Automation API, which accepts HTML or Markdown content via the /1/threads/new-document endpoint.
- What are the Quip API rate limits for migration?
- The Quip Automation API defaults to roughly 50 requests per minute per user token and 600 requests per minute per company. It returns HTTP 503 (not 429) when rate-limited, which breaks standard retry logic. You must implement custom backoff using X-Ratelimit-Reset and X-Company-Retry-After headers.
- Is Quip being discontinued?
- Yes. Salesforce announced that all Quip products are being retired. Subscriptions cannot be renewed after March 1, 2027. After expiration, sites enter a 90-day read-only phase, then blocked logins, then data deletion.
- How long does a Confluence to Quip migration take?
- It depends on volume and content complexity. A 500-page space takes roughly 3–8 hours via API due to Quip's 600 requests/minute company limit. Workspaces with 20,000+ pages can take 1–3 days and typically require a rate-limit increase from Salesforce Support.
- What Confluence data is lost when migrating to Quip?
- Confluence macros (TOC, page tree, Jira links, status badges) have no Quip equivalent and must be rendered as static HTML or stripped. Inline comments lose positional anchoring. Original author attribution and timestamps are not preserved natively — Quip attributes creation to the API token holder. Store originals in a metadata block or manifest.