{"id":11918,"date":"2026-08-19T14:43:02","date_gmt":"2026-08-19T18:43:02","guid":{"rendered":"https:\/\/canny.io\/blog\/?p=11918"},"modified":"2026-08-19T14:45:11","modified_gmt":"2026-08-19T18:45:11","slug":"so-you-want-to-build-a-feedback-portal","status":"publish","type":"post","link":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/","title":{"rendered":"So you want to build a feedback portal?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">It sounds simple enough. A website where people can post, comment, and vote on <a href=\"https:\/\/canny.io\/features\/portal\">feedback<\/a>. How hard can it be?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s go through it together. We&#8217;ll keep a running tally of engineering hours and monthly costs as we go.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Posting, commenting, and voting<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Fable can legitimately build this in 15 minutes. Easy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;re going to need to host this website somewhere, and store the data somewhere. Claude will recommend Next.js on Vercel and Postgres on Supabase Pro, which costs about $45\/mo. Add a domain, a code review, and a second pair of eyes. It&#8217;s live in half a day.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 4 hours. Running total: 4 hours. Cost: $45\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User authentication<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First, you need to authenticate users. Feedback is useless if you can&#8217;t tie it back to the user it came from.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Best case, you can leverage the existing user authentication from your app. That&#8217;s less effort than rolling auth from scratch. But be careful. Get it wrong and you&#8217;ve introduced a security hole into your production application. Claude writes the integration fast. You still have to test it like your production app depends on it, because it does.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 16 hours. Cost: $45\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Statuses<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Feedback is coming in. Our PM asks: can we mark posts as &#8220;planned&#8221; and &#8220;in progress&#8221;? Sure. We add five statuses. Shipped by lunch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two weeks later, product wants &#8220;under review.&#8221; Support wants &#8220;needs more info.&#8221; A month after that, someone wants &#8220;won&#8217;t do&#8221; split from &#8220;closed.&#8221; Every team has opinions about statuses, and the list never stops growing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then someone asks: when a post gets marked &#8220;complete,&#8221; shouldn&#8217;t everyone who voted find out?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They should. Which means we need email.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 8 hours. Running total: 24 hours. Cost: $45\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Email<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">How hard can email be? Sign up for a provider, call their API. An hour, tops.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Except a status change on a post with 400 voters just timed out the request. Okay, we need a queue. Plus unsubscribe links, because CAN-SPAM isn&#8217;t optional. Plus a preferences page to put behind those links.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A month in, our emails start landing in spam folders. We&#8217;ve been sending to addresses that bounced, and our sender reputation is bleeding out. Now we&#8217;re handling bounces and complaints and reading blog posts about domain warming. We&#8217;re an email deliverability company now. Nobody planned this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One more thing while we&#8217;re here. Anything a user posts can end up in an email from our trusted domain. If spam ever hits the portal, our notifications become its delivery service. So every user-generated string that touches an email gets sanitized first. Remember this. It comes up later.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 28 hours. Running total: 52 hours. Cost: $65\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Deduplication<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Good news: our top request has 80 votes. Dark mode. Customers really want dark mode.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad news: below it are 14 more posts that are also dark mode. &#8220;Night mode.&#8221; &#8220;Dark theme please.&#8221; &#8220;my eyes hurt.&#8221; Two or three votes each. Nobody searches before they post.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we build merging. Votes and comments carry over, subscribers combine. Done. But catching duplicates by hand is tedious. Let&#8217;s have Claude flag them automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First version: hand Claude each new post along with everything already on the board. Works at 50 posts. Falls apart at 1,000. Detecting duplicates at scale needs real search infrastructure behind it, and that means more moving parts, more tuning, and a bigger AI bill. Call it $25\/mo, climbing with volume.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 28 hours. Running total: 80 hours. Cost: $90\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Spam<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Things are humming. Feedback is organized, statuses are flowing, emails are landing. Project complete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh no, the <a href=\"https:\/\/canny.io\/blog\/defending-your-startup-against-email-spammers\/\">spam bots<\/a> have found our feedback portal and are advertising gambling websites publicly to all of our customers&#8230; that&#8217;s not good.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No biggie, we&#8217;ll pass all new submissions to Claude and automatically block anything that Claude thinks is spam. Problem solved.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wait, now Claude is marking some legitimate customer feedback as spam. Well, we can just use Fable, which gets it right nearly every time. But now it\u2019s very expensive to see if a feature request or comment is spam. Spam isn&#8217;t something that is just &#8220;done&#8221; and we&#8217;ll need to do some benchmarking and prompt engineering to get to a cost-effective place. Call it $25\/mo once we&#8217;ve tuned it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh, and remember the email thing? Their phishing links almost went out in our notification emails, from our domain. That sanitization just earned its keep.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whew, finally our spam problem is solved.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 92 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Company associations<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Scrolling the top request, we notice something. Nine voters have @acmecorp.com addresses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To our portal, that&#8217;s nine people. To our business, that&#8217;s one very interested customer. We&#8217;re B2B. Nine people at one company is one signal, not nine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So: a companies table, user-to-company mapping, rollups. Then every view we&#8217;ve built gets rebuilt to group by company.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 16 hours. Running total: 108 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Spend data<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now that feedback rolls up by company, someone asks the obvious question. Which of these companies actually pay us?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We pull MRR from billing and attach it to each company. Suddenly a feature with 10 votes worth $500k beats one with 100 votes worth $10k. Leadership loves this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Which is exactly why the numbers can&#8217;t be wrong. If they drift, we&#8217;re steering the roadmap with bad money data. No pressure.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 8 hours. Running total: 116 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CRM integration<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;This is great, but can it pull from <a href=\"https:\/\/canny.io\/integrations\/salesforce\">Salesforce<\/a>? That&#8217;s where the real accounts live.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sigh. Okay. OAuth, field mapping, sync jobs, rate limits, retries. It works! We demo it. Everyone claps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three weeks later, Salesforce changes something and the sync breaks on a Friday at 4pm. Someone on the team now owns &#8220;the Salesforce sync.&#8221; Forever. They know who they are.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 40 hours. Running total: 156 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Opportunity data<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sales again. &#8220;Can we link deals to feature requests? I want to show that this $200k deal is blocked on SSO.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Honestly, great idea. It&#8217;s the most valuable data in the whole system. It&#8217;s also another object type, another sync, another UI. Deal data is sensitive too, so it needs its own internal permissions. Not every teammate should see pipeline numbers.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 168 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User segmentation<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CS asks a fair question: &#8220;Can I see feedback from just our enterprise plan?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We have company revenue now. But the portal still has no idea what plan anyone is on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we sync user traits from our app. Plan, signup date, role. We keep them fresh, because stale data is worse than none. Then we build the filtering UI.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 180 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"display: flex; justify-content: center;\"><div class=\"hs-cta-embed hs-cta-embed-127905612377\" style=\"max-width:100%; max-height:100%; width:650px; height:313.4505275px; display: block; margin: 0 auto;\" data-hubspot-wrapper-cta-id=\"127905612377\">\n<link rel=\"stylesheet\" href=\"https:\/\/js.hscta.com\/embeddable_cta_placeholder_v1.css\">\n<div class=\"hs-cta-loading-dot__container\">\n<div class=\"hs-cta-loading-dot\"><\/div>\n<div class=\"hs-cta-loading-dot\"><\/div>\n<div class=\"hs-cta-loading-dot\"><\/div>\n<\/div>\n<div class=\"hs-cta-embed__skeleton\"><\/div>\n<picture>\n<source srcset=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" media=\"(max-width: 480px)\" \/>\n<img decoding=\"async\" alt=\"Form CTA\" loading=\"lazy\" src=\"https:\/\/no-cache.hubspot.com\/cta\/default\/5705808\/interactive-127905612377.png\" style=\"height: 100%; width: 100%; object-fit: fill\" onerror=\"this.style.display='none'\" \/>\n<\/picture>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Reporting<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An exec asks: &#8220;What are our top requests by revenue this quarter?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We don&#8217;t have a page for that. We have a database and vibes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we build <a href=\"https:\/\/canny.io\/features\/analyze-feedback\">dashboards<\/a>. Charts, date ranges, CSV export. Then a second exec wants the same data cut by segment. A third wants it by product area. Every exec wants a slightly different slice, and every slice is a ticket.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 28 hours. Running total: 208 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jira\/Linear integration<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Engineering has been ignoring the portal. We ask why. &#8220;It&#8217;s not in <a href=\"https:\/\/linear.app\/integrations\/canny\">Linear<\/a>.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Of course. So we build two-way sync. Link posts to issues. When the issue ships, the post flips to &#8220;complete&#8221; and voters get notified. Beautiful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two-way sync sounds simple. It never is. Conflicts, webhooks, edge cases where both sides changed at once. We find each edge case the fun way: in production.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 40 hours. Running total: 248 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>MCP access<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The team is living in Claude now, and they want to ask it things. &#8220;What are the top requests from enterprise customers this month?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we build an <a href=\"https:\/\/canny.io\/features\/mcp\">MCP server<\/a>. Tool definitions, authentication, read-only access, updates every time the schema changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We pause to appreciate the moment. We are building AI tooling for the feedback portal we built to avoid buying AI tooling.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 8 hours. Running total: 256 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Slack notifications<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Can new feedback go to <a href=\"https:\/\/canny.io\/integrations\/slack\">Slack<\/a>?&#8221; Sure, that&#8217;s a webhook. One afternoon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Can it be filtered by board?&#8221; Okay.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Only for customers over $10k?&#8221; Fine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Can replies in the thread sync back to the portal?&#8221; The afternoon is now a few days.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 8 hours. Running total: 264 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Data imports and exports<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We want to get the entire company using our tool. A product manager from a different team starts setting up their portal. First question: &#8220;Can you import our existing feedback?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While we&#8217;re at it, someone finally mentions the spreadsheet. Three years of feature requests in a Google Sheet, plus a Notion doc named &#8220;feature requests FINAL v2.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we build an importer. CSV parsing, field mapping, matching rows to users who don&#8217;t have accounts yet. Half the votes belong to people who churned in 2023. We import it anyway.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The importer runs. It just created 300 new duplicates. Good thing we built merge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then a customer asks to export all their feedback. Then legal reminds us that under GDPR, anyone can request their data, or its deletion. Export just went from a favor to a feature.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 16 hours. Running total: 280 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Board privacy<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sales pings us. They want a private board for enterprise customers. Then legal chimes in: the security feedback board should not be public. Reasonable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So now every query in the app needs permission checks. Roles, access rules, the works. Claude adds them in an afternoon. Verifying it didn&#8217;t miss one takes much longer. One missed check means a customer sees another customer&#8217;s roadmap requests, and we find out from an angry email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh, and the MCP server we already shipped? It needs to respect these rules too. Hope nobody asked it anything private last week.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 20 hours. Running total: 300 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Product announcements<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We shipped the thing everyone voted for. Nobody noticed. We announced it in a tweet and a hope.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we build a <a href=\"https:\/\/canny.io\/features\/product-changelog\">changelog<\/a>. An editor, drafts, scheduling, email to voters, an in-app widget. Somewhere around draft scheduling, we realize we&#8217;re building a second product. We build it anyway.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 28 hours. Running total: 328 hours. Cost: $115\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Smart Replies<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Someone has an idea: what if Claude drafted our responses to feedback?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Genuinely nice. Also: another prompt to engineer, another API cost to watch, and a human review step. The one time we let it auto-send, it thanked a churning customer for their &#8220;exciting feedback.&#8221;<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 8 hours. Running total: 336 hours. Cost: $125\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>API access<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our data team pings us: &#8220;Can we pipe the feedback into the warehouse? We want it next to product usage.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude scaffolds the endpoints in an hour. The endpoints were never the problem. The problem is API keys, rate limits, pagination, board privacy enforcement, and the part nobody budgets for: documentation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once one team builds against it, we can never casually change it again. The dashboard that breaks when we rename a field belongs to someone else now. We maintain two programmatic surfaces, counting the MCP server. Every schema change touches both.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 20 hours. Running total: 356 hours. Cost: $125\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Mobile<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A customer emails a screenshot. The portal on their phone. It&#8217;s&#8230; not good. The vote button is somewhere off the right edge of the screen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Half our traffic is mobile. Nobody checked. So: a responsive pass on every screen we&#8217;ve built, and every screen from now on, forever.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 368 hours. Cost: $125\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dark theme<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Remember dark mode? Our top request, 80 votes, plus 14 merged duplicates?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Still the top request. For the feedback portal. Fine. We&#8217;ll build it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every component needs theme support. It&#8217;s not hard. It&#8217;s just hundreds of small changes, and there&#8217;s always one white flash somewhere that a customer will find.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 380 hours. Cost: $125\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Performance<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The portal has been live for a year, and the feedback has piled up: 5,000 posts and counting. Awesome! Pages now take 8 seconds to load. Not awesome. Turns out we&#8217;re computing vote counts on every page load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we add indexes, caching, and pagination. Under pressure, while customers watch spinners. Meanwhile, the database has quietly outgrown our Supabase tier. We upgrade compute and turn on point-in-time recovery, because the portal now holds years of customer input and revenue data. Backups aren&#8217;t a feature. They&#8217;re insurance we pay for monthly.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 16 hours. Running total: 396 hours. Cost: $250\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Security<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It hits us one night. This thing holds customer identities, revenue data, and deal data. It&#8217;s wired into our production auth. It sends email from our trusted domain. It has a public API. We built an attack surface and gave it a cute name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The good news: there are no servers to patch. Vercel handles the infrastructure. The bad news: nobody patches our npm packages for us, and a Next.js app ships with hundreds of them. Dependabot opens PRs every week. Someone reviews and merges them. A few times a year, a critical CVE drops and someone patches and redeploys that same day, no matter what they were supposed to be shipping. The framework itself once shipped an auth bypass. Fun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rate limiting, injection, XSS, session handling, dependency patching. Not once. Every week. Forever.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 408 hours. Cost: $250\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>SOC 2<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A prospect&#8217;s security team sends a questionnaire. One question: &#8220;Is the feedback tool in scope for your SOC 2 audit?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is now. Access reviews, change management, vendor documentation, evidence collection. The portal gets wired into our compliance platform. The annual pen test covers one more application, which adds a few thousand dollars a year. We add vulnerability scanning. The audit itself gets a bit pricier, because auditors bill by scope.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">None of these is big on its own. Together, call it another $300\/mo once the annual bills are amortized. Our homegrown portal just added real money to our compliance budget, and our compliance lead just learned it exists.<\/p>\n\n\n\n<p class=\"has-background wp-block-paragraph\" style=\"background-color:#eef0f8\">Effort: 12 hours. Running total: 420 hours. Cost: $550\/mo.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>And this is just the start<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everything above is only the problems we could see coming. The first dozen or so.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There will be more. There are always more. The customer who wants the portal in French. The accessibility audit. The admin who deletes a board by accident and asks if we have undo. We don&#8217;t have undo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Software you build is never finished. It&#8217;s just quiet for a while.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The real cost<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It was never the hours or the dollars.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s the context switching. Every gap and issue above arrives on its own schedule, not yours. When the sync breaks or the board leaks, your team has two options. Drop what they&#8217;re doing to fix the feedback tool, which is terrible for productivity. Or ignore it, and live with the consequences. Both cost more than the fix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s a reason you&#8217;re looking at a tool like Canny and not some $20\/mo widget. You&#8217;re a serious business with serious requirements. You&#8217;ll run into those requirements one way or another. The only question is whose problem they are when you do.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ve already dealt with them. So you don&#8217;t have to.<\/p>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>So, how hard can it be?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first 15 minutes are real. Claude genuinely builds the demo that fast.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So is the rest. 420 hours is real engineering time even when Claude writes most of the code, because the code was never the hard part. The hours go to code review, QA, testing auth, tuning prompts, verifying permissions, and untangling syncs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Those are focused hours, too. Nobody gets focused hours. Spread across a normal calendar of standups, launches, and actual product work, this is two quarters of elapsed time and about $31,500 of engineering cost. Plus $550\/mo to run it once compliance is counted. Plus the maintenance nobody tallied: the Salesforce sync that breaks, the deliverability dip, the dependency patches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Canny has been building this product, and only this product, for over ten years. A full team of engineers working on nothing else, with an R&amp;D budget that dwarfs what this project would cost you. We use Claude Code too. Whatever you can build in a day, so can we. So the gap between your portal and ours doesn&#8217;t close over time. It grows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Can you meet 80% of your requirements with 20% of the effort? Probably. But 20% of the effort is still hundreds of hours. The missing 80% is exactly the part your customers touch: the deliverability, the permissions, the syncs that don&#8217;t break. That math doesn&#8217;t add up to saving money over just buying Canny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The portal was never the product. The product is everything around it. Meanwhile, the person who owns it isn&#8217;t building your actual product.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Build your product. Buy your feedback portal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div style=\"text-align: center;\"><div class=\"hs-cta-embed hs-cta-embed-122984161548\" style=\"display: inline-block; max-width:100%; max-height:100%; width:700px;height:225.8854182470703px\" data-hubspot-wrapper-cta-id=\"122984161548\">\n<link rel=\"stylesheet\" href=\"https:\/\/js.hscta.com\/embeddable_cta_placeholder_v1.css\">\n<div class=\"hs-cta-loading-dot__container\">\n<div class=\"hs-cta-loading-dot\"><\/div>\n<div class=\"hs-cta-loading-dot\"><\/div>\n<div class=\"hs-cta-loading-dot\"><\/div>\n<\/div>\n<div class=\"hs-cta-embed__skeleton\"><\/div>\n<picture>\n<source srcset=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" media=\"(max-width: 480px)\" \/>\n<img decoding=\"async\" alt=\"Get a free walkthrough\" loading=\"lazy\" src=\"https:\/\/no-cache.hubspot.com\/cta\/default\/5705808\/interactive-122984161548.png\" style=\"height: 100%; width: 100%; object-fit: fill\" onerror=\"this.style.display='none'\" \/>\n<\/picture>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>AI can build a feedback portal demo in 15 minutes. Here&#8217;s the 420 hours of auth, permissions, syncs, and deliverability work that comes after.<\/p>\n","protected":false},"author":3,"featured_media":11917,"comment_status":"closed","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"content-type":"","footnotes":""},"categories":[2,6],"tags":[78,15],"class_list":["post-11918","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-building-saas","category-founder-stories","tag-customer-feedback","tag-product-management"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 5.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"AI can build a feedback portal demo in 15 minutes. Here&#039;s the 420 hours of auth, permissions, syncs, and deliverability work that comes after.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Andrew Rasmussen\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Canny Blog - How to build a more informed product\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"So you want to build a feedback portal? - Canny Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"AI can build a feedback portal demo in 15 minutes. Here&#039;s the 420 hours of auth, permissions, syncs, and deliverability work that comes after.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1520\" \/>\n\t\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-08-19T18:43:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-08-19T18:45:11+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"So you want to build a feedback portal? - Canny Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"AI can build a feedback portal demo in 15 minutes. Here&#039;s the 420 hours of auth, permissions, syncs, and deliverability work that comes after.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@a13n\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#blogposting\",\"name\":\"So you want to build a feedback portal? - Canny Blog\",\"headline\":\"So you want to build a feedback portal?\",\"author\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/author\\\/a13n\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/building-portal.avif\",\"width\":1520,\"height\":800,\"caption\":\"Cover image for a blog post exploring what goes into building a feedback portal. Shows a man looking at a basic portal surrounding by icons representing missing features.\"},\"datePublished\":\"2026-08-19T14:43:02-04:00\",\"dateModified\":\"2026-08-19T14:45:11-04:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#webpage\"},\"articleSection\":\"Building SaaS, Founder Stories, customer feedback, product management\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/canny.io\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/category\\\/building-saas\\\/#listItem\",\"name\":\"Building SaaS\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/category\\\/building-saas\\\/#listItem\",\"position\":2,\"name\":\"Building SaaS\",\"item\":\"https:\\\/\\\/canny.io\\\/blog\\\/category\\\/building-saas\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#listItem\",\"name\":\"So you want to build a feedback portal?\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#listItem\",\"position\":3,\"name\":\"So you want to build a feedback portal?\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/category\\\/building-saas\\\/#listItem\",\"name\":\"Building SaaS\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/#organization\",\"name\":\"Canny Blog\",\"description\":\"How to build a more informed product\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/author\\\/a13n\\\/#author\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/author\\\/a13n\\\/\",\"name\":\"Andrew Rasmussen\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#authorImage\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/andrew.png\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/a13n\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#webpage\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/\",\"name\":\"So you want to build a feedback portal? - Canny Blog\",\"description\":\"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/author\\\/a13n\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/author\\\/a13n\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/building-portal.avif\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#mainImage\",\"width\":1520,\"height\":800,\"caption\":\"Cover image for a blog post exploring what goes into building a feedback portal. Shows a man looking at a basic portal surrounding by icons representing missing features.\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/so-you-want-to-build-a-feedback-portal\\\/#mainImage\"},\"datePublished\":\"2026-08-19T14:43:02-04:00\",\"dateModified\":\"2026-08-19T14:45:11-04:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/canny.io\\\/blog\\\/\",\"name\":\"Canny Blog\",\"description\":\"How to build a more informed product\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/canny.io\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>So you want to build a feedback portal? - Canny Blog<\/title>\n\n","aioseo_head_json":{"title":"So you want to build a feedback portal? - Canny Blog","description":"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.","canonical_url":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#blogposting","name":"So you want to build a feedback portal? - Canny Blog","headline":"So you want to build a feedback portal?","author":{"@id":"https:\/\/canny.io\/blog\/author\/a13n\/#author"},"publisher":{"@id":"https:\/\/canny.io\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif","width":1520,"height":800,"caption":"Cover image for a blog post exploring what goes into building a feedback portal. Shows a man looking at a basic portal surrounding by icons representing missing features."},"datePublished":"2026-08-19T14:43:02-04:00","dateModified":"2026-08-19T14:45:11-04:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#webpage"},"isPartOf":{"@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#webpage"},"articleSection":"Building SaaS, Founder Stories, customer feedback, product management"},{"@type":"BreadcrumbList","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/canny.io\/blog#listItem","position":1,"name":"Home","item":"https:\/\/canny.io\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/canny.io\/blog\/category\/building-saas\/#listItem","name":"Building SaaS"}},{"@type":"ListItem","@id":"https:\/\/canny.io\/blog\/category\/building-saas\/#listItem","position":2,"name":"Building SaaS","item":"https:\/\/canny.io\/blog\/category\/building-saas\/","nextItem":{"@type":"ListItem","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#listItem","name":"So you want to build a feedback portal?"},"previousItem":{"@type":"ListItem","@id":"https:\/\/canny.io\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#listItem","position":3,"name":"So you want to build a feedback portal?","previousItem":{"@type":"ListItem","@id":"https:\/\/canny.io\/blog\/category\/building-saas\/#listItem","name":"Building SaaS"}}]},{"@type":"Organization","@id":"https:\/\/canny.io\/blog\/#organization","name":"Canny Blog","description":"How to build a more informed product","url":"https:\/\/canny.io\/blog\/"},{"@type":"Person","@id":"https:\/\/canny.io\/blog\/author\/a13n\/#author","url":"https:\/\/canny.io\/blog\/author\/a13n\/","name":"Andrew Rasmussen","image":{"@type":"ImageObject","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#authorImage","url":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/andrew.png"},"sameAs":["https:\/\/x.com\/a13n"]},{"@type":"WebPage","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#webpage","url":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/","name":"So you want to build a feedback portal? - Canny Blog","description":"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/canny.io\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#breadcrumblist"},"author":{"@id":"https:\/\/canny.io\/blog\/author\/a13n\/#author"},"creator":{"@id":"https:\/\/canny.io\/blog\/author\/a13n\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif","@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#mainImage","width":1520,"height":800,"caption":"Cover image for a blog post exploring what goes into building a feedback portal. Shows a man looking at a basic portal surrounding by icons representing missing features."},"primaryImageOfPage":{"@id":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/#mainImage"},"datePublished":"2026-08-19T14:43:02-04:00","dateModified":"2026-08-19T14:45:11-04:00"},{"@type":"WebSite","@id":"https:\/\/canny.io\/blog\/#website","url":"https:\/\/canny.io\/blog\/","name":"Canny Blog","description":"How to build a more informed product","inLanguage":"en-US","publisher":{"@id":"https:\/\/canny.io\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Canny Blog - How to build a more informed product","og:type":"article","og:title":"So you want to build a feedback portal? - Canny Blog","og:description":"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.","og:url":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/","og:image":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif","og:image:secure_url":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif","og:image:width":1520,"og:image:height":800,"article:published_time":"2026-08-19T18:43:02+00:00","article:modified_time":"2026-08-19T18:45:11+00:00","twitter:card":"summary_large_image","twitter:title":"So you want to build a feedback portal? - Canny Blog","twitter:description":"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.","twitter:creator":"@a13n","twitter:image":"https:\/\/canny.io\/blog\/wp-content\/uploads\/2026\/08\/building-portal.avif"},"aioseo_meta_data":{"post_id":"11918","title":null,"description":"AI can build a feedback portal demo in 15 minutes. Here's the 420 hours of auth, permissions, syncs, and deliverability work that comes after.","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-08-19 17:45:14","updated":"2026-08-19 18:46:31","seo_analyzer_scan_date":"2026-08-19 18:46:31","reviewed_by":"0","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/canny.io\/blog\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/canny.io\/blog\/category\/building-saas\/\" title=\"Building SaaS\">Building SaaS<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\tSo you want to build a feedback portal?\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/canny.io\/blog"},{"label":"Building SaaS","link":"https:\/\/canny.io\/blog\/category\/building-saas\/"},{"label":"So you want to build a feedback portal?","link":"https:\/\/canny.io\/blog\/so-you-want-to-build-a-feedback-portal\/"}],"_links":{"self":[{"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/posts\/11918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/comments?post=11918"}],"version-history":[{"count":2,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/posts\/11918\/revisions"}],"predecessor-version":[{"id":11930,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/posts\/11918\/revisions\/11930"}],"wp:attachment":[{"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/media?parent=11918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/categories?post=11918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canny.io\/blog\/wp-json\/wp\/v2\/tags?post=11918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}