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.
You'll need:
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.
Canny and ProductLift use the word "board" differently:
You have two reasonable migration shapes:
Pick the shape that matches how you actually want users to browse feedback going forward, not how Canny happened to be structured.
Canny offers two export paths:
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.
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:
/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.
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.
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) |
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:
Example: 3 voter emails + Number of Votes = 47 → 3 real votes + 44 bonus = 47 total.
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.
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:
Same flow for categories that don't yet exist.
The job runs in the background. When it finishes, click View Imported Posts to see the batch.
Repeat for every Canny board.
feedback.yourcompany.com, point it at ProductLift. See Custom domain.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.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:
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.
See Importing feedback posts for the full importer reference, supported columns, and error troubleshooting.