Productboard Integration for Feature Prioritization
Productboard is a product management tool: collect insights from various sources, prioritize using scoring frameworks (RICE, Value/Effort), build roadmaps, and provide public portals for users.
Embedding Customer Portal
Productboard provides a public portal with feature voting. It can be embedded via iframe or custom domain:
<!-- Portal via iframe -->
<iframe
src="https://portal.productboard.com/YOUR_TOKEN"
frameborder="0"
width="100%"
height="800px">
</iframe>
For SSO user identification, use a custom button with JWT:
// ProductboardTokenController
public function token(): JsonResponse
{
$user = auth()->user();
$payload = [
'iss' => config('services.productboard.api_key'),
'iat' => time(),
'exp' => time() + 3600,
'email' => $user->email,
'name' => $user->name,
];
$token = \Firebase\JWT\JWT::encode($payload, config('services.productboard.secret'), 'HS256');
return response()->json([
'token' => $token,
'portal_url' => 'https://portal.productboard.com/YOUR_TOKEN?jwt=' . $token,
]);
}
REST API: Creating Note (Insight)
class ProductboardService
{
private const BASE = 'https://api.productboard.com';
public function createNote(string $content, string $userEmail, array $tags = []): array
{
return Http::withToken(config('services.productboard.token'))
->withHeaders(['X-Version' => '1'])
->post(self::BASE . '/notes', [
'title' => substr($content, 0, 100),
'content' => $content,
'user' => ['email' => $userEmail],
'tags' => array_map(fn($t) => ['name' => $t], $tags),
'source' => ['origin' => 'website_feedback'],
])
->json();
}
}
// Automatically create Note when feedback is received
public function handleFeedback(FeedbackSubmitted $event): void
{
$tags = [];
if ($event->score <= 3) $tags[] = 'low-satisfaction';
if (str_contains(strtolower($event->comment), 'slow')) $tags[] = 'performance';
app(ProductboardService::class)->createNote(
$event->comment,
$event->user->email,
$tags
);
}
Webhook for Roadmap Updates
Route::post('/webhooks/productboard', function (Request $request) {
// Signature verification
$computed = hash_hmac('sha256', $request->getContent(), config('services.productboard.webhook_secret'));
if (!hash_equals($computed, $request->header('X-Productboard-Signature'))) abort(401);
$data = $request->json();
if ($data['data']['type'] === 'feature.status.updated') {
$feature = $data['data']['feature'];
// Update public roadmap on the site
Cache::forget('public_roadmap');
Log::info("Feature updated: {$feature['name']} → {$feature['status']}");
}
return response('ok');
});
Timeline
Embedding Customer Portal, REST API for Note insights, and webhook synchronization: 2 business days.







