Skip to main content
Most CX leaders already know CSAT is down. The harder question is what keeps coming up. Themes is Forepost’s answer: a small surface that tracks repeated topics over weeks and tells engineering when a topic stops being noise.

What a theme looks like

Each theme is a workspace-scoped row with:

Label and slug

Human name (“Billing portal access”), auto-slugged for dedup.

Description

One sentence on what the theme covers.

Status

emerging · tracked · resolved · dismissed.

Auto-Linear threshold

Mentions per week before Forepost files a Linear bug. Default 10.
A companion table records theme_mentions per ISO week. A mini-bar on each card shows the last 8 weeks at a glance.

Three ways to add mentions

1

Manual +1

Click the +1 button on a theme card. Use this when you read a ticket and recognise it as another instance.
2

API call

POST /themes/:id/mention — useful from a helpdesk webhook or a tag-watcher script.
3

Suggested from samples

Click Suggest from samples on the Themes view to let Forepost cluster the last 7 days of worst-CSAT conversations into proposed themes. See below.
Each mention can carry an optional ticketId; Forepost keeps up to 5 sample ticket ids per week per theme for context.

Model-suggested themes

Requires a connected Intercom workspace.
Click Suggest from samples on the Themes view. Forepost pulls the last seven days of low-CSAT (rating ≤ 3) conversations from Intercom, runs them through a Haiku clustering prompt with strict JSON output, and proposes up to three distinct themes. Suggestions are not auto-created — the leader stays in control. Each card shows:
  • The proposed label and one-sentence description
  • An estimated mention count from the sample
  • 1–3 example topics from the sample that fed the cluster
Two buttons per suggestion:

Track

Creates the theme via POST /themes with the default threshold of 10. Shows up in the regular Themes grid.

Dismiss

Removes the suggestion from this view. Doesn’t blacklist — it can return on the next suggest pass.
Themes already in your workspace are filtered from suggestions, so re-running won’t re-propose billing-portal-access if you already track it.
Rate-limited at 6 suggest calls per hour per workspace.

Auto-filing to Linear

Auto-filing requires a connected Linear integration. See Linear.
When the current ISO week’s mention count crosses auto_linear_threshold AND the theme doesn’t already have a Linear issue id, Forepost calls Linear’s GraphQL issueCreate mutation with:
  • Title: [CX theme] <label> — N mentions this week
  • Description: Auto-filed by Forepost because this theme crossed N mentions in week YYYY-Www. Review in Forepost → Themes.
The first team in your Linear workspace is used. The created issue’s identifier (e.g. ENG-123) is stored on the theme row and the status flips to tracked. Subsequent mentions don’t re-file.

How themes feed the brief

When themes exist with non-zero mentions in the current or previous ISO week, the brief context includes:
EMERGING THEMES (last 14 days):
• Billing portal access — 14 mentions this week (up from 2). Linear ENG-481 filed.
• Slack export — 6 mentions, sustained across 3 weeks
• Webhook retries — 3 mentions (new this week)
The brief is told to call out emerging themes by name when they correlate with CSAT or volume movement.

API

GET    /themes                   # list with last 8 weeks of mentions per theme
POST   /themes                   # create — body { label, description?, autoLinearThreshold? }
POST   /themes/suggest           # owner/admin: cluster recent worst-CSAT into 1-3 suggested themes
PATCH  /themes/:id               # edit label / description / status / threshold
POST   /themes/:id/mention       # increment current ISO week — body { count?, ticketId? }
DELETE /themes/:id               # soft-archive

Privacy

Themes are workspace-scoped. Sample ticket ids are stored but not conversation bodies. If you uninstall Linear, previously-filed issues stay there (Forepost can’t delete them); the linear_issue_id on the theme row remains as a breadcrumb.