All docs
3 min read

Auto-categorization

Every submission on a Pro+ form gets an auto-generated category — a single short label like support, sales, bug-report, partnership, feedback, spam. The label lives on the submission record itself, surfaces in the UI, and is queryable via the API and MCP.

It's the difference between an inbox of 500 unread submissions and an inbox you can filter to "show me only the bug reports from this week".

Where the category lands

On the database level, the submissions.category column stores the model's pick. It's a free-text string, but the model is constrained to a predefined vocabulary so you can rely on WHERE category = 'support' queries returning what you expect.

The default vocabulary is:

support, sales, partnership, bug-report, feature-request,
feedback, hiring, press, spam, other

If the model isn't confident, it picks other rather than guessing.

Where it appears in the UI

  • Submission list — a coloured pill next to each row.
  • Submission detail — the category is on the metadata sidebar, alongside the AI moderation score.
  • Form filters — the inbox has a dropdown to filter by category.
  • Insights page — top categories with counts is one of the weekly digest sections.

Where it appears in the API

Every submission resource includes:

{
  "id": "subm_01H...",
  "status": "received",
  "category": "support",
  "ai_moderation": { "score": 0.04, "category": null },
  "payload": { ... }
}

You can also filter the list endpoint by category:

curl -H "Authorization: Bearer $TOKEN" \
  "https://formspring.io/api/v1/forms/{form_id}/submissions?category=bug-report"

Customizing the vocabulary

The default vocabulary fits most public contact forms. If you have a specialized form (job application, beta signup, support escalation) you can override the category list per form on the form settings page → Categories.

Custom categories are validated:

  • 1–20 categories per form
  • Lowercase letters, numbers, and dashes only
  • Max 32 chars each

The model is re-prompted with your list on every submission. New submissions use the new vocabulary immediately. Existing submissions keep their original categories — re-categorize them via the MCP prompt below.

Re-categorizing in batch

The MCP server includes a categorize-submissions prompt that takes a form ID and a date range and re-runs categorization across every submission in the range. Useful when:

  • You changed the vocabulary and want historical submissions relabeled.
  • You added a new form and imported submissions from elsewhere.
  • A new model version released and you want existing data scored against it.
Use the categorize-submissions prompt for form_id=frm_abc123, range=last-30-days

The prompt walks you through it: confirms the count, shows a 10-row sample of what would change, and only applies once you approve. Categorization is idempotent — re-running on already-categorized submissions overwrites with the latest model's pick.

Plan gating

  • Free, Starter, Procategory is always null on submissions.
  • Pro+ — every submission gets a category at receive time.

Downgrading from Pro+ leaves existing categories on submissions but stops categorizing new ones.

What's next