Support Desk for Websites

SupDesk Team

Add support to your website with one script tag

SupDesk integrates seamlessly into your website with a single script tag. Embed feedback boards, live chat, and a help center — all customizable to match your brand.

Quick start: JavaScript widget

Add this script to your website:

<script
  src="https://cdn.supdesk.app/widget.js"
  data-portal="https://feedback.yourapp.com"
  defer
></script>

The widget automatically loads in the bottom-right corner of your pages.

Framework-Specific Examples

React:

import { useEffect } from "react";
 
function SupportWidget() {
  useEffect(() => {
    const script = document.createElement("script");
    script.src = "https://cdn.supdesk.app/widget.js";
    script.dataset.portal = "https://feedback.yourapp.com";
    script.async = true;
    document.body.appendChild(script);
    return () => document.body.removeChild(script);
  }, []);
 
  return null;
}

Vue 3:

<script setup>
import { onMounted, onUnmounted } from "vue";
 
onMounted(() => {
  const script = document.createElement("script");
  script.src = "https://cdn.supdesk.app/widget.js";
  script.dataset.portal = "https://feedback.yourapp.com";
  document.body.appendChild(script);
});
 
onUnmounted(() => {
  const script = document.querySelector('script[src*="supdesk.app"]');
  if (script) script.remove();
});
</script>

WordPress:

// Add to your theme's functions.php
function add_supdesk_widget() {
}
add_action('wp_footer', 'add_supdesk_widget');

Or use the plugin from the WordPress plugin repository.

Next.js (App Router):

export default function Layout({ children }) {
  useEffect(() => {
    const script = document.createElement("script");
    script.src = "https://cdn.supdesk.app/widget.js";
    script.dataset.portal = "https://feedback.yourapp.com";
    document.body.appendChild(script);
    return () => document.body.removeChild(script);
  }, []);
 
  return <>{children}</>;
}

Features in the website portal

Feedback board with voting Users post ideas, vote on suggestions, and follow what's coming next. Perfect for product roadmaps.

Live chat integration A widget that shows in your pages. When users chat, it becomes a message in your same inbox as email and portal messages.

Help center widget Searchable knowledge base articles embedded on your support page or throughout your site.

Custom domains Serve your portal from support.yourapp.com with automatic SSL and branding.

Widget customization

Configure the widget appearance:

window.SupDesk = {
  portal: "https://feedback.yourapp.com",
  theme: "light", // or 'dark'
  position: "bottom-right", // or 'bottom-left'
  color: "#3B82F6", // match your brand
};

Ready to add support to your website?

Start for free. No credit card required. Sign up at supdesk.app

Server-side SDKs for backend integration

Live code examples pulled from each SDK's GitHub repository.

RabinApps/supdesk-nodeJavaScript / TypeScript
import { SupDesk } from "supdesk";

const supdesk = new SupDesk({ apiKey: process.env.SUPDESK_API_KEY! });

// Auto-pages: iterating walks every page for you.
for await (const submission of await supdesk.submissions.list({
  status: "open",
})) {
  console.log(submission.title);
}

await supdesk.submissions.create({
  type: "bug",
  title: "Export button does nothing",
  email: "user@example.com",
  body: "Clicking Export on the reports page has no effect.",
});
RabinApps/supdesk-pythonPython
from supdesk import SupDesk

supdesk = SupDesk()  # api_key=... or $SUPDESK_API_KEY

# Auto-pages: iterating walks every page for you.
for submission in supdesk.submissions.list(status="open"):
    print(submission.title)

supdesk.submissions.create(
    type="bug",
    title="Export button does nothing",
    email="user@example.com",
    body="Clicking Export on the reports page has no effect.",
)
RabinApps/supdesk-goGo
import "github.com/rabinapps/supdesk-go/supdesk"

client, err := supdesk.New(os.Getenv("SUPDESK_API_KEY"))
if err != nil {
    log.Fatal(err)
}

page, err := client.Submissions.List(ctx, supdesk.SubmissionsListParams{
    Status: ptr("open"),
})
if err != nil {
    return err
}
// Auto-pages: All walks every page for you.
for sub, err := range page.All(ctx) {
    if err != nil {
        return err
    }
    fmt.Println(sub.Title)
}

_, err = client.Submissions.Create(ctx, supdesk.SubmissionsCreateParams{
    Type:  supdesk.SubmissionTypeBug,
    Title: "Export button does nothing",
    Email: "user@example.com",
    Body:  "Clicking Export on the reports page has no effect.",
})
RabinApps/supdesk-dartDart
import 'dart:io';
import 'package:supdesk/supdesk.dart';

final supdesk = SupDesk(apiKey: Platform.environment['SUPDESK_API_KEY']!);

// Auto-pages: the stream walks every page for you.
final page = await supdesk.submissions.list(status: PostStatus.open);
await for (final submission in page.autoPaging()) {
  print(submission.title);
}

await supdesk.submissions.create(
  type: SubmissionType.bug,
  title: 'Export button does nothing',
  email: 'user@example.com',
  body: 'Clicking Export on the reports page has no effect.',
);

Categories

SupportWebsite

Tags

#support#website#widget#javascript#feedback