Docs
After submitTriage (AI review)
View as Markdown(opens in a new tab)

Triage (AI review)

On claimed sites, Kibble reads every completed response once and writes down what a person on your team would want to know before opening it:

  • summary: up to three sentences (320 characters): who this is, what they want, and anything in Kibble's signals that changes how to read it, like a repeat sender, a personal address on a business request or the campaign they came from
  • category: one of your form's categories (Sales lead, Support, Partnership, Job seeker, Vendor pitch, Other by default)
  • fit: high, medium or low against your description of a great response, with a one-clause reason
  • facts: company, role, team size, budget, timeline and urgency, only when the person stated them
  • spam: a second opinion, for pitches and junk that the rule-based checks let through
"review": {
  "summary": "Head of research at a 220-person health company wants weekly interview tooling, starting this month. Came from your spring Google campaign.",
  "category": "Sales lead",
  "fit": "high",
  "fitReason": "Runs research weekly at a 220-person company and wants to start this month.",
  "facts": { "company": "Lumen Health", "role": "Head of research", "teamSize": "220", "timeline": "This month" },
  "spam": { "likely": false, "reason": null },
  "model": "gpt-6-luna",
  "reviewedAt": "2026-10-15T09:12:03Z"
}

The review is part of every submission record (read API, CSV columns ai_summary, ai_category, ai_fit and ai_group_<key> per group, webhook payloads, and the Postgres destination's kibble_review, kibble_ai_category, kibble_ai_fit and kibble_ai_<key> columns). Email and Slack notifications lead with the summary, then the fit, the category and each group's pick on one line ("High fit · Sales lead"), and why it fits on the line under it.

Turn it on

It is on by default for every form. Its settings live in Kibble, not in the schema file: set them in the dashboard (the form's Setup → Triage) or from the CLI:

npx kibble review demo-request --ideal "Research or product teams at companies with 50+ people who run customer research at least monthly and want to start this quarter."
npx kibble review demo-request --summary "Lead with what they want to buy and when. Mention their budget if they gave one."   # optional
npx kibble review demo-request --categories "Sales lead,Support,Partnership,Job seeker,Vendor pitch,Other"   # optional, 2 to 12
npx kibble review demo-request --off      # turn it off for this form (--on to turn it back on)
npx kibble review demo-request            # show the current settings

The API is GET / PUT /v1/project/forms/:slug/review: PUT sends the full settings { idealResponse?, summary?, categories?, enabled? } and replaces what is there (responses come back as { review, effective }). Without an ideal response, responses still get a summary, a category and facts, but no fit. summary (3 to 500 characters) tells triage what each summary should focus on, leave out or be written in; without it the summary says who the person is and what they want. Schemas that still declare settings.review keep working for one release: the first push imports it when Kibble has nothing set for the form, then prints a note to remove it from the file.

Writing a good idealResponse

The fit level is only as good as this sentence. Describe the response you would drop everything for, in terms the person could actually write in your form:

  • Name observable things. "50+ people", "runs research monthly", "wants to start this quarter" can be checked against answers. "A great customer" cannot.
  • Match your questions. If you care about team size, ask for it. Kibble judges fit only from what the person wrote; it never looks people up.
  • One or two sentences. List the two or three things that matter most; leave out nice-to-haves.
  • Say what is not a fit when it is common: "Agencies and students are not a fit."

Good: B2B SaaS teams of 20 to 500 people replacing a spreadsheet-based onboarding process within the next two months. Too vague: Serious companies that would get value from our product.

More groups

Besides the category and fit, you can have triage sort responses into up to five groups of your own, like Urgency (This week, This quarter, Later, Not stated) or Lead type (Company, Agency, Individual). Triage picks exactly one option in each, the same way it picks a category, and follows an optional "how to choose" hint. Each pick shows in the response and can be changed like the category; the Responses tab can filter by it, the table and CSV show it as a column, Insights charts it, and email and Slack notifications can be filtered by it. The review stores picks by group key:

"groups": { "urgency": "This quarter", "lead_type": "Agency" }

Set them in Setup → Triage → More groups, from the CLI (npx kibble review demo-request --group "Urgency: This week, This quarter, Later, Not stated", repeat --group for more, --remove-group "Urgency" to drop one), or with groups: [{ name, options, hint? }] in PUT /v1/project/forms/:slug/review. A group's key is made from its name when it is added and kept when it is renamed (send the key back), so earlier picks still match. The names "Category" and "Fit" are taken.

Categories and fit in notifications

Each email and Slack destination can be limited to some categories and fit levels, so the sales channel only gets high-fit sales leads while support questions go elsewhere. See Destinations. Webhooks and databases always receive everything.

Spam

When the review says a response is very likely spam (an unsolicited pitch, SEO offers, gibberish, an attempt to manipulate the review), Kibble moves it to the spam tab with reason ai_review and sends no notifications. Nothing is deleted: "Not spam" in the dashboard moves it back and delivers it. Low-quality but genuine responses are never marked spam; they get a low fit instead.

Corrections

When the category, fit or a group's pick is wrong, change it: from the response in the dashboard, or through the API:

curl -X PATCH "$API/v1/project/forms/demo-request/submissions/sub_…" \
  -H "Authorization: Bearer $KIBBLE_SECRET_KEY" -H 'Content-Type: application/json' \
  -d '{ "category": "Support", "fit": "low", "groups": { "urgency": "This week" } }'

The review is marked corrected, and the latest eight corrections for the form are shown to the model as examples on every later review, so it adapts to how your team sorts responses.

Acting on it

The category and fit are filters on a form's Responses tab and in the API. Email and Slack destinations can be filtered by category and fit.

Limits

Every workspace gets up to 1,000 reviews a month during the beta (see Usage). A review has an 8-second budget. If it times out, errors, or the monthly cap is reached, the response is delivered without a review; a review never delays or blocks a response beyond that budget. Test responses on a claimed site are reviewed (so you can see the read while building) and count toward the cap; partial, spam and sandbox responses are never reviewed.

Privacy

  • Provider. Reviews run on OpenAI (gpt-6-luna by default) through the Responses API with store: false. OpenAI is a subprocessor: under its API terms it doesn't train on this data, and it may keep it for up to 30 days to monitor abuse.
  • Where. Responses are stored in the EU (Frankfurt), but triage runs on OpenAI's standard API, which processes in the US. Transfers are covered by the DPA. If a form shouldn't leave the EU, turn its triage off.
  • What is sent. The form's name, description and question labels; your idealResponse, summary instructions and categories; the summaries of recently corrected responses; this response's answers by question label, except that an email address is replaced by its domain and a phone number by "(given)"; and Kibble's own signals (work or consumer email and the company behind a work domain, duplicate count, submissions from the same network in the last hour, where the person came from as the UTM source, medium and campaign or the referring site's domain, the path of the page the form was on, the country code, a declared AI agent's name and who it acted for, flags). Not sent: email addresses and phone numbers, hidden fields, IP addresses or hashes, full URLs or query strings, other UTM parameters, user agents, or other respondents' answers.
  • Answers are data. The model is told that answers are written by the public and never instructions; responses that try to steer the review are treated as spam.
  • Off switch. npx kibble review <slug> --off (or enabled: false via the API, or the dashboard) turns review off for a form; nothing from that form is sent.