Migrating from Canny

How to get there: Go to Settings → Import tab.

Move your feedback, votes, and statuses from Canny to ProductLift in three steps: export each Canny board to CSV, upload to ProductLift, let AI map the columns.

Before you start

You'll need:

  • Admin access to your Canny workspace (to export data).
  • A ProductLift portal with at least one board to import into.

Plan to migrate one Canny board at a time. ProductLift's importer asks you to pick a target board on each upload, and Canny exports best when filtered to one board.

Boards vs categories: a terminology heads-up

Canny and ProductLift use the word "board" differently:

  • A Canny board is a single feedback collection like "Feature Requests" or "Bug Reports".
  • A ProductLift board is closer to a workspace section that can hold multiple categories.

You have two reasonable migration shapes:

  • Each Canny board → its own ProductLift board. Good if you only have 2-4 Canny boards. Create matching boards in ProductLift first (Settings → Boards), then import one CSV per board.
  • All Canny boards → categories inside a single ProductLift board. Good if you have many narrow Canny boards (e.g. "iOS bugs", "Android bugs", "Web bugs"). Map the Canny board name into a Category column in your CSV instead.

Pick the shape that matches how you actually want users to browse feedback going forward, not how Canny happened to be structured.

Step 1. Export your data from Canny

Posts

Canny offers two export paths:

  • Filtered export (recommended). Open the Feedback page, filter to a single board (and optionally by status, tag, owner). Click the Download icon to export the filtered set as CSV.
  • Full board export. Go to Settings → Boards in Canny and use Export Data.

The Canny posts CSV contains:

Canny column What it contains
Post Title Post title
Post Detail Post description (markdown)
Post Status Open, Under Review, Planned, In Progress, Complete, Closed
Score Total vote count (aggregate, not per-user)
Comment Count Number of comments (text not included)
Date created Created timestamp
Image URLs Links to Canny-hosted attachments
Post URL Original Canny post URL
Tags Comma-separated tags
Post Author Author name/email
Category Board category
Post Owner Assigned teammate
Associated MRR Revenue (only populated if a CRM/Stripe integration is connected)

Repeat for each board.

Voter lists (optional, most people skip this)

The simplest migration just brings vote totals across, not individual voters. Canny's Score column maps directly to ProductLift's Number of Votes field, your post leaderboards stay in the same order, and you're done.

You only need per-voter attribution if you want each customer's voting history preserved (so they see "you voted on this" when they log in to ProductLift). For that, you have two options:

  1. Per-post manual export. Open each post, open its voter list, click Export List in the bottom-left to download a CSV of voters for that post. Practical only for your top posts.
  2. API export. Use Canny's API (/posts/list + /votes/list) to script a per-post voter export. Best path for large workspaces.

If you skip voter attribution, ProductLift still preserves the total vote count via Canny's Score column. You just won't know who individually voted.

Comments

Canny's posts CSV exports a comment count, not the comment text. If you need the actual comment threads, you have to pull them through the Canny API.

Step 2. Prepare the CSV for ProductLift

You don't need to rename Canny's columns. ProductLift's importer uses AI to map them automatically. Most Canny columns map cleanly:

Canny column ProductLift field
Post Title Title
Post Detail Description
Post Status Status
Score Number of Votes
Post Author Author Email
Tags Tags
Category Category
Date created Created Date
Post Owner Assigned To
Post URL (ignore, or paste into Description if you want a backlink)
Comment Count (ignore, counts aren't useful without the text)
Image URLs (ignore, re-upload attachments manually if needed)
Associated MRR MRR per Post (preserved on the post, surfaces on prioritization views)

Bringing voter emails along (optional)

Skip this section if you're happy preserving vote totals only. If you did export per-post voter lists in Step 1 and want individual voter attribution, add a Voter Emails column with semicolon-separated emails per row:

title,description,status,number_votes,author_email,tags,created,voter_emails
"Add dark mode","Users want a dark theme.","Planned",47,"customer@example.com","ui,design","2025-10-12","a@ex.com;b@ex.com;c@ex.com"

ProductLift will:

  • Auto-create users for any voter email it hasn't seen.
  • Cast a real vote from each voter.
  • Compare the explicit voter count against your Number of Votes column. Whichever is higher wins, with the difference stored as a manual bonus so the displayed total matches Canny's Score.

Example: 3 voter emails + Number of Votes = 47 → 3 real votes + 44 bonus = 47 total.

Bringing MRR across

If Canny's Associated MRR column is populated (Stripe/CRM integration), include it as a column in your CSV. ProductLift stores per-post MRR (total_mrr, total_ltv) and surfaces it on prioritization and revenue-weighted views. See Stripe integration for connecting Stripe so future revenue keeps updating automatically.

Status names

You don't need to rename Canny's statuses in your CSV. On the preview step, the importer detects any status that doesn't exist on the target board and lets you, per status:

  • Create new, name + color picker, attached to the target board.
  • Map to existing, pick an equivalent status that already exists.

Same flow for categories that don't yet exist.

Step 3. Import into ProductLift

  1. Go to Settings → Import.
  2. Click Choose CSV or Excel file and pick your prepared CSV.
  3. Under Import into board, select the ProductLift board this Canny board should land in.
  4. Click Upload and Continue.
  5. On the Map Your Columns step, review the AI's suggested mappings and adjust anything that looks wrong.
  6. On the Preview step:
    • Confirm post counts and sample rows look correct.
    • Use the Missing categories and Missing statuses panels to create or remap anything not already on the board.
  7. Click Import.

The job runs in the background. When it finishes, click View Imported Posts to see the batch.

Repeat for every Canny board.

After the import

  • Spot-check a handful of posts. Open them and verify title, description, status, votes, tags, and author look right.
  • Update your DNS. If Canny was on a subdomain like feedback.yourcompany.com, point it at ProductLift. See Custom domain.
  • Re-create integrations. Connect Jira, Slack, HubSpot etc. under Settings → Integrations. See Integrations overview.
  • Swap your Canny SDK for the ProductLift SDK. If your app used Canny's Canny('identify', ...) snippet to auto-log users into the Canny widget, replace it with ProductLift's equivalent ProductLiftIdentify({ email, uid, name, ... }). Users stay auto-logged in when they open feedback from your app, just on ProductLift now. See Single sign-on (SSO) for the snippet, and Install widgets to embed the widget itself.
  • Bring users across. See Inviting customers.

Advanced: API-based migration

For large Canny workspaces (10k+ posts) or where the CSV path drops too much (per-voter attribution on every post, full comment threads, attachment files), use the API instead of the importer wizard:

  • Pull posts, votes, voters, and comments via Canny's API.
  • Push them into ProductLift via the ProductLift API.
  • No row cap, full comment text, and per-user vote attribution without the per-post export busywork.

Prefer we handle it? Migration concierge

If you'd rather not run the migration yourself, our team can do it for you. Send us your Canny export (or API credentials) and we'll handle the mapping, voter attribution, and post-import cleanup. Email support@productlift.dev to start a migration concierge request.

If something goes wrong

  • Wrong target board? Filter All Posts by the import batch and bulk-delete, then re-import.
  • Status or category mismatches after import? Use Bulk post operations to retag or restatus.
  • Want to test first? Import the first 10 rows of one board as a separate file, verify everything looks right, then run the full import.

See Importing feedback posts for the full importer reference, supported columns, and error troubleshooting.