Skip to content

SupportOS v1.5.0 — Client Segmentation & Outreach

Choose a tag to compare

@kimpearce888 kimpearce888 released this 27 Sep 09:52
· 16 commits to main since this release

v1.5.0 — the contact-first release

Client Segmentation & Outreach (the full spec), vector search over tickets/threads, business-hours-aware SLA alerts on the Issue Radar, and optional end-to-end encrypted sync for multi-device — built under a fresh independent audit that found and fixed 7 real bugs before shipping. 259/259 tests green (+35).

📣 Client Segmentation & Outreach

  • Contact-first deterministic segment engine over the local mirror — properties answer "which customers?", tags answer "which tickets?", the resolver answers "which customers own those tickets?". The AI may suggest or explain a segment, but it can never decide who gets emailed.
  • Conversation-level tag semantics (ANY / ALL / NONE) resolved before mapping to contacts: "has ALL of timezone, bug" requires ONE conversation carrying both tags — locked by the spec's critical test cases.
  • Why-selected evidence on every row: matched property values, matching tickets with tags/status/dates — the recipient review shows it inline, with a matching-tickets drawer linking into the inbox.
  • Customer property VALUES are now synced (with a raw_json backfill that heals pre-1.5 databases), plus background/age/gender/location on customers.
  • Saved versioned segments (structured condition trees, never SQL); campaign recipients are a static snapshot with the evidence that selected them.
  • One individual Help Scout conversation per customer via POST /v2/conversations — never a shared BCC send; customer identified by id (no accidental duplicate contacts); sends ride the same rate-limited queue as manual replies in small batches.
  • Safe lifecycle: validation before queueing, Do-Not-Contact enforcement, duplicate-send protection, per-recipient states with attempt log + audit trail, timeout → unknown → reconcile-before-retry (never blindly resent), pause/resume/cancel/retry, crash recovery.
  • Personalization with preview ({{first_name}}, {{last_ticket_number}}, …) through the same code path as the send; reply intelligence from the local mirror, honestly labeled.
  • UI: 4-stage wizard (audience → recipient review → compose → explicit final review), campaign monitor with audit events + reports, segments & DNC managers, real-time SSE progress.

🧮 Vector search over tickets/threads

Conversations (subject + customer + tags + thread bodies) are chunked and embedded locally; POST /api/search fuses FTS5 + semantic retrieval with Reciprocal Rank Fusion. Qdrant accelerates when connected; a local cosine scan answers without it. Every hit records which retriever found it.

🚨 Business-hours-aware SLA alerts

GET /api/issues/sla-alerts ages open conversations in business minutes since the last customer message against per-mailbox first-response/resolution targets — breached and at-risk states with per-mailbox rollups, rendered at the top of the Issue Radar. Unconfigured mailboxes are labeled honestly; nothing is guessed.

🔐 Optional end-to-end encrypted sync

.sosync bundles (AES-256-GCM + scrypt): export with a passphrase, move the file however you like, import with integrity + schema checks and an automatic safety backup. No relay server exists by design — a privacy-first product is end-to-end encrypted by construction. Attachments re-download from Help Scout automatically on the other device.

🛡️ Fixed by the fresh independent audit (not the existing test suite)

  • hostile deeply-nested condition trees crashed the whole server (DoS) → depth/node caps, clean 422
  • malformed JSON bodies returned 500 → clean 400
  • POST /api/outreach/dnc with a negative id → FK 500 → validated
  • a mid-batch crash stranded recipients in sending forever → reclaimed at batch start, proven by a crash-recovery test
  • campaign validation/report counts truncated at 1000 recipients → SQL aggregates
  • property backfill expected the wire shape while raw_json stores the normalized shape → both accepted
  • campaign monitor inbox links used the conversation number instead of the local id

Full changelog: https://github.com/kimpearce888/supportos/blob/main/CHANGELOG.md
Docs: README · API integration · Testing


Installers

Download the installer for your platform below (built on native OS runners in CI):

  • Windows: SupportOS_1.5.0_x64_en-US.msi (or the NSIS -setup.exe)
  • macOS: SupportOS_1.5.0_universal.dmg
  • Linux: SupportOS_1.5.0_amd64.AppImage

First run offers a 2-minute demo mode — no Help Scout credentials needed.