Интеграция Productboard для приоритизации функций
Productboard — инструмент продуктового менеджмента: сбор инсайтов из разных источников, приоритизация через scoring-фреймворки (RICE, Value/Effort), построение roadmap и публичные порталы для пользователей.
Встраивание Customer Portal
Productboard предоставляет публичный портал с голосованием за функции. Встраивается через iframe или кастомный домен:
<!-- Портал через iframe -->
<iframe
src="https://portal.productboard.com/YOUR_TOKEN"
frameborder="0"
width="100%"
height="800px">
</iframe>
Для SSO-идентификации пользователей — кастомная кнопка с 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: создание Note (инсайта)
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();
}
}
// Автоматически создаём Note при получении отзыва
public function handleFeedback(FeedbackSubmitted $event): void
{
$tags = [];
if ($event->score <= 3) $tags[] = 'low-satisfaction';
if (str_contains(strtolower($event->comment), 'медленн')) $tags[] = 'performance';
app(ProductboardService::class)->createNote(
$event->comment,
$event->user->email,
$tags
);
}
Webhook для обновлений roadmap
Route::post('/webhooks/productboard', function (Request $request) {
// Проверка подписи
$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'];
// Обновляем публичный roadmap на сайте
Cache::forget('public_roadmap');
Log::info("Feature updated: {$feature['name']} → {$feature['status']}");
}
return response('ok');
});
Сроки
Встраивание Customer Portal, REST API для Note-инсайтов и webhook-синхронизация: 2 рабочих дня.







