Google Ads Search-Term Intent Classification
Classify paid-search terms by intent while protecting high-spend and low-confidence cases with human review.
An editorial workflow for adding typed intent labels to Google Ads search-term exports. It is a reviewable pattern, not an automated account-change tool.
- Provider
- Type Safe Workflow
- Reviewed
- September 23, 2026
- Project status
- Community
- Verification
- Needs review
- Categories
- sales, analytics
- Compatibility
- JEV, Laya, Bespoke Nimble, CSV
Inputs
- ✓Search term
- ✓Campaign and ad group context
- ✓Spend and conversion metrics
- ✓Approved intent taxonomy
Outputs
- ✓Intent label
- ✓Per-label probabilities
- ✓Review decision
- ✓Reason code
Workflow steps
- 1Remove customer identifiers and normalize whitespace without changing the query text.
- 2Define labels such as brand, product, competitor, informational, irrelevant, and ambiguous.
- 3Send the term plus campaign context and the closed label set to the selected decision model.
- 4Route high-spend rows, ambiguous labels, or confidence below the tested threshold to a reviewer.
- 5Write approved labels to a separate column and keep the original export unchanged.
- 6Measure reviewer agreement before using labels in reporting or negative-keyword research.
Decision tasks
- ✓Classify
Workflow implementation guide
This editorial pattern requires local evaluation before operational use. Empty tested-version fields mean the directory has not run it against a pinned model release.
Business problem
Search-term reports contain noisy language that is difficult to group consistently before analysis or keyword review.
Who this is for
Paid-search analysts and growth teams that already export Google Ads search-term data.
Model selection notes
Choose a model only after testing the exact taxonomy on your account data. Hosted access favors faster setup; local models favor data control.
Tested model versions
Unknown
- Industry
- Advertising, Growth
- Difficulty
- intermediate
- Estimated setup time
- 2 to 4 hours for a reviewed pilot
- Compatible model candidates
- jev, laya, bespoke-nimble
- Required integrations
- Google Ads CSV export, Review spreadsheet
- Recommended model
- No single model recommended before local evaluation
Detailed execution steps
- 1Remove customer identifiers and normalize whitespace without changing the query text.
- 2Define labels such as brand, product, competitor, informational, irrelevant, and ambiguous.
- 3Send the term plus campaign context and the closed label set to the selected decision model.
- 4Route high-spend rows, ambiguous labels, or confidence below the tested threshold to a reviewer.
- 5Write approved labels to a separate column and keep the original export unchanged.
- 6Measure reviewer agreement before using labels in reporting or negative-keyword research.
Confidence policy
Begin with review-only operation. Set thresholds from a labelled holdout set, and always review high-spend terms regardless of confidence.
Human review policy
A trained ads operator approves ambiguous, high-spend, competitor, and negative-keyword candidates before any account action.
Privacy notes
Remove customer identifiers and avoid sending conversion details that are not required for intent classification.
Cost notes
Estimate cost from exported row count, input size, retry policy, and reviewer time. No cross-provider cost claim is made here.
Common failure modes
- ✓Overlapping intent labels produce unstable classifications.
- ✓Missing campaign context makes short queries ambiguous.
- ✓A global threshold hides costly errors on high-spend terms.
Troubleshooting
- ✓Audit disagreements by label and rewrite criteria with concrete boundaries.
- ✓Add an ambiguous label instead of forcing every term into a business category.
Structured request example
{"state":{"query":"free crm spreadsheet","campaign":"CRM Software"},"questions":{"intent":{"type":"choice","criteria":{"commercial":null,"informational":null,"irrelevant":null,"ambiguous":null}}}}Apply a review threshold
typescript · TypeScript 5.9
type Intent = 'commercial' | 'informational' | 'irrelevant' | 'ambiguous';
type Decision = { intent: Intent; confidence: number; spend: number };
export function routeIntent(result: Decision) {
const needsReview = result.confidence < 0.8 || result.spend >= 100;
return { ...result, action: needsReview ? 'review' : 'label' };
}Implementation guidance
Keep the declared inputs and outputs visible in code review. Validate every model response before it reaches a database, API, or customer-facing action.