Skip to content
Back to skills

Canny

ASecurity

Collect and manage product feedback with Canny. Use when a user asks to set up a feature request board, prioritize product feedback, build a public roadmap, or let users vote on features.

  • 142 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added May 27, 2026
businesstypescriptgoreactgitapi

Works with

  • terminal
  • cli
  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add TerminalSkills/skills --skill canny --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Canny?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Canny
[![Security: A β€” Skills Directory](https://www.skillsdirectory.com/api/skills/terminalskills-canny/badge)](https://www.skillsdirectory.com/skills/terminalskills-canny)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: canny
description: >-
  Collect and manage product feedback with Canny. Use when a user asks to set
  up a feature request board, prioritize product feedback, build a public
  roadmap, or let users vote on features.
license: Apache-2.0
compatibility: 'Any web app via SDK/API'
metadata:
  author: terminal-skills
  version: 1.0.0
  category: business
  tags:
    - canny
    - feedback
    - roadmap
    - feature-requests
    - product
---

# Canny

## Overview

Canny collects, organizes, and prioritizes product feedback. Users submit feature requests, vote on ideas, and follow updates. Teams build public roadmaps and close the loop when features ship.

## Instructions

### Step 1: Identify Users

```typescript
// components/CannySdk.tsx β€” Identify logged-in users
'use client'
import { useEffect } from 'react'

export function CannyIdentify({ user }) {
  useEffect(() => {
    if (window.Canny && user) {
      window.Canny('identify', {
        appID: process.env.NEXT_PUBLIC_CANNY_APP_ID,
        user: {
          id: user.id,
          email: user.email,
          name: user.name,
          avatarURL: user.avatar,
          created: new Date(user.createdAt).toISOString(),
          customFields: { plan: user.plan, mrr: user.mrr },
        },
      })
    }
  }, [user])
  return null
}
```

### Step 2: Embed Feedback Widget

```tsx
// Embed the feedback widget in your app
function FeedbackButton() {
  return (
    <button
      data-canny-link
      data-board-token="your-board-token"
      className="fixed bottom-4 right-4 bg-blue-600 text-white px-4 py-2 rounded-full"
    >
      πŸ’‘ Feedback
    </button>
  )
}
```

### Step 3: API Integration

```typescript
// lib/canny.ts β€” Programmatic feedback management
const CANNY_API_KEY = process.env.CANNY_API_KEY!

// Create a post (feature request) programmatically
await fetch('https://canny.io/api/v1/posts/create', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    apiKey: CANNY_API_KEY,
    authorID: userId,
    boardID: 'board-id',
    title: 'Dark mode support',
    details: 'Would love a dark theme option for the dashboard.',
  }),
})

// Retrieve top voted posts
const response = await fetch('https://canny.io/api/v1/posts/list', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    apiKey: CANNY_API_KEY,
    boardID: 'board-id',
    sort: 'score',
    limit: 20,
  }),
})
```

## Guidelines

- Free tier: 1 board, basic features. Growth ($79/mo): unlimited boards, roadmap, integrations.
- Use custom fields to segment feedback by plan (show which features paying customers want).
- Public changelog closes the loop β€” users see when their requested features ship.
- For free alternative, consider using GitHub Discussions or a simple upvote board.

Files in this skill

  • SKILL.md2.8 KB
  • _scores.json1.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…