Интеграция UserVoice для сбора обратной связи
UserVoice — платформа для сбора фичереквестов и обратной связи с поддержкой SSO, кастомных полей и интеграции с Jira/Salesforce. Ориентирована на B2B SaaS с роулями администраторов продукта.
Встраивание виджета
<!-- Базовая интеграция через Gadget (sidebar виджет) -->
<script>
UserVoice = window.UserVoice || [];
(function(){
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/YOUR_KEY.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s);
})();
UserVoice.push(['identify', {
email: currentUser.email,
name: currentUser.name,
id: currentUser.id,
account: {
id: currentUser.accountId,
name: currentUser.accountName,
}
}]);
UserVoice.push(['addTrigger', '#feedback-button', {
mode: 'satisfaction',
forum_id: 12345,
}]);
</script>
REST API для управления идеями
class UserVoiceService
{
private string $baseUrl;
private string $token;
public function __construct()
{
$this->baseUrl = 'https://' . config('services.uservoice.subdomain') . '.uservoice.com/api/v2';
$this->token = config('services.uservoice.token');
}
public function getSuggestions(string $forumId, array $params = []): array
{
$response = Http::withToken($this->token)
->get("{$this->baseUrl}/forums/{$forumId}/suggestions", array_merge([
'sort' => 'votes',
'per_page' => 25,
'filter' => 'public',
], $params));
return $response->json('suggestions', []);
}
public function createSuggestion(string $forumId, string $title, string $body, int $userId): array
{
return Http::withToken($this->token)
->post("{$this->baseUrl}/forums/{$forumId}/suggestions", [
'suggestion' => [
'title' => $title,
'body' => $body,
],
'user_id' => $userId,
])->json('suggestion');
}
}
Синхронизация с Jira
UserVoice поддерживает нативную интеграцию с Jira (в платных тарифах). Идеи с определённым статусом автоматически создают задачи в Jira, а изменение статуса задачи обновляет статус идеи в UserVoice.
Для кастомной синхронизации — webhook от UserVoice и Jira REST API:
Route::post('/webhooks/uservoice', function (Request $request) {
if ($request->json('event') === 'suggestion.status_changed') {
$suggestion = $request->json('suggestion');
if ($suggestion['status']['key'] === 'planned') {
// Создаём задачу в Jira
Http::withBasicAuth(config('jira.user'), config('jira.token'))
->post(config('jira.url') . '/rest/api/3/issue', [
'fields' => [
'project' => ['key' => 'PROD'],
'summary' => $suggestion['title'],
'description' => ['type' => 'doc', 'version' => 1,
'content' => [['type' => 'paragraph',
'content' => [['type' => 'text', 'text' => $suggestion['body']]]]]],
'issuetype' => ['name' => 'Story'],
],
]);
}
}
return response('ok');
});
Сроки
Встраивание UserVoice с SSO и синхронизацией статусов: 2–3 рабочих дня.







