Canny integration for feature request collection
Canny is a platform for collecting and prioritizing feature requests from users. Embeds in your product via SDK, allows authorized users to create requests, vote, and subscribe to updates.
SSO integration with your product
Canny supports SSO via JWT so users don't create a separate account:
// CannyTokenController
public function generate(): JsonResponse
{
$user = auth()->user();
$userData = [
'avatarURL' => $user->avatar_url,
'email' => $user->email,
'id' => (string) $user->id,
'name' => $user->name,
// Optional: companies for B2B segmentation
'companies' => [[
'id' => (string) $user->company_id,
'name' => $user->company->name,
]],
];
$token = \Firebase\JWT\JWT::encode(
['userData' => $userData],
config('services.canny.private_key'),
'HS256'
);
return response()->json(['token' => $token]);
}
Embedding the widget
// In React component
useEffect(() => {
// Load Canny SDK
(function(w, d, i, s) {
// ... Canny SDK loader
})(window, document, 'Canny', 'https://cdn.canny.io/sdk.js');
const initCanny = async () => {
const { token } = await fetch('/api/canny-token').then(r => r.json());
window.Canny('identify', {
appID: process.env.NEXT_PUBLIC_CANNY_APP_ID,
user: { ssoToken: token },
});
window.Canny('render', {
boardToken: 'YOUR_BOARD_TOKEN',
basePath: '/feedback',
ssoToken: token,
});
};
initCanny();
}, []);
Webhook for notifications
Canny sends webhooks when request status changes:
Route::post('/webhooks/canny', function (Request $request) {
// Verify signature
$signature = hash_hmac('sha256', $request->getContent(), config('services.canny.webhook_secret'));
if (!hash_equals($signature, $request->header('Canny-Signature'))) abort(401);
$event = $request->json('type');
$post = $request->json('object');
if ($event === 'post.statusChanged' && $post['status'] === 'complete') {
// Notify all voters via email
// Canny does this automatically, but you can add custom logic
Log::info("Canny feature completed: {$post['title']}");
}
return response('ok');
});
Timeline
Canny integration with SSO and webhooks: 1–2 working days.







