Native dispatch board plugin — replaces Focalboard
  • Go 53.2%
  • TypeScript 33.7%
  • CSS 10%
  • Makefile 2.1%
  • JavaScript 1%
Find a file
2026-08-06 20:33:32 +00:00
.forgejo/workflows CI: add rolling 'latest' release on every main build 2026-06-09 17:55:52 +00:00
public Replace dispatch icon: envelope -> Calendar SVG 2026-06-03 19:03:09 +00:00
server fix: only notify when an appointment actually changed 2026-08-06 20:06:19 +00:00
webapp feat(web): refetch the board when the websocket reconnects 2026-08-05 17:13:22 +00:00
.gitignore chore: stop committing webapp build artifact 2026-06-12 13:48:17 +00:00
BRANDING_CHANGES.md Scrub sensitive data from public docs 2026-06-02 18:15:50 +00:00
CHANGELOG.md docs: changelog entry for the own-column-first and staleness work 2026-08-05 21:15:42 +00:00
Makefile Makefile: use localhost placeholder in install example, not an internal IP 2026-07-04 02:46:22 +00:00
plugin.json fix: add notification toggles, all default off, and bump to 0.2.1 2026-08-06 20:05:39 +00:00
README.md docs: correct the role-aware claim, and warn that an empty webhook secret disables auth 2026-08-05 21:15:41 +00:00

slash-dispatch-plugin

Native dispatch board plugin for Slash / Mattermost. Replaces Focalboard for field dispatch operations.

What It Does

  • Kanban board grouped by technician — only shows techs with active appointments in the current 7-day window
  • Real-time updates via webhook from n8n/billing system — appointments appear within seconds of a change
  • Own column first - everyone sees every tech's column; the viewer's own column is ordered first on both web and mobile. This is deliberately not a filter.
  • Mobile-optimized — single-column view on small screens
  • Work Order button on each card links directly to the pre-filled work order form

Architecture

Billing system appointment hook
  → n8n automation
    → POST /plugins/com.ncwcom.slash-dispatch/api/v1/webhook
      → Plugin KV store
        → WebSocket broadcast → React frontend

Installation

  1. Download the latest .tar.gz from Releases
  2. System Console → Plugins → Plugin Management → Upload Plugin
  3. Enable the plugin
  4. Click Settings and configure:

Plugin Settings

Setting Description
Webhook Secret Shared secret for the automation to plugin webhook. Set the same value in your automation platform. WARNING: if left empty the signature check is skipped entirely and the webhook accepts unauthenticated writes - anyone who can reach the server can create, update or cancel appointments.
#techs Channel ID Channel ID for dispatch notifications. Find it in the channel URL or via the API.
Tech Name Map (JSON) Maps billing system tech names to Mattermost user IDs — see below

Tech Name Map

The Tech Name Map connects your billing system's tech identifier strings to Mattermost user IDs. Mattermost user IDs can be found in System Console → User Management.

{
  "TECH_BILLING_NAME_1": "mattermost_user_id_1",
  "TECH_BILLING_NAME_2": "mattermost_user_id_2",
  "TECH_BILLING_NAME_3": "mattermost_user_id_3"
}

Keys are billing system tech names (case-insensitive). Values are Mattermost user IDs. Users not in this map (office staff, admins) see all tech columns.

API Endpoints

Method Path Auth Description
GET /api/v1/appointments MM session token Returns active appointments for the next 7 days
POST /api/v1/webhook X-Dispatch-Signature header Receives appointment events from automation
GET /api/v1/me MM session token Returns calling user's resolved tech name and admin status

Webhook Payload (POST /api/v1/webhook)

{
  "appt_id": 12345,
  "_action": "CREATE",
  "tech": "TECH_NAME",
  "first_name": "Customer",
  "last_name": "Name",
  "appt_type": "New Install",
  "start_dt": "2026-06-03 11:00:00",
  "end_dt": "2026-06-03 13:00:00",
  "phone": "555-000-0000",
  "address": "123 Main St, City, State",
  "bm_user": 10000,
  "notes": "Install notes here",
  "internet_package": "Service Package Name",
  "service_status": "Prospective",
  "_jotform_url": "https://form.jotform.com/...",
  "row_hash": "abc123"
}

Notes:

  • appt_id and bm_user may be string or integer — both are accepted
  • start_dt / end_dt accept 2026-06-03T11:00:00 (T separator) and 2026-06-03 11:00:00 (space separator)
  • _action: CREATE | UPDATE | CANCEL

Building from Source

# Requires: Go 1.21+, Node.js 20+, npm
cd server && go build -o dist/plugin-linux-amd64 .
cd ../webapp && npm install && npm run build
tar -czf dist/com.ncwcom.slash-dispatch-$(VERSION).tar.gz \
    plugin.json server/dist/plugin-linux-amd64 webapp/dist/main.js

Or use the Makefile:

make bundle                                        # build + package
make install MM_HOST=http://your-mm-host:8065 MM_TOKEN=yourtoken

n8n Integration

In your n8n Slash-Workorders workflow, update the HTTP Request nodes (Create Board Card, Update Board Card, Mark Card Cancelled) to POST to:

http://<mattermost-host>:8065/plugins/com.ncwcom.slash-dispatch/api/v1/webhook

With header X-Dispatch-Signature: <your-webhook-secret>.

Note: n8n HTTP Request node v4.2 has a known routing issue with specifyBody: json and expression bodies. If appointments are not appearing, replace the HTTP Request nodes with Code nodes that use Node.js http.request() directly.

Configuration Separation

This plugin ships with working defaults and no operator-specific values. All site-specific configuration (tech names, channel IDs, webhook secrets) is set through the Mattermost plugin settings UI and stored in the server config — never in the plugin source.

License

AGPL-3.0 — see LICENSE