Meta Description Grader
Score and compare meta descriptions using OpenAI GPT models on key SEO criteria.
#about
Four-dimension GPT grading: emotional hook/power verbs (0-10), clear benefit statement (0-10), active voice usage (0-10), urgency/interest creation (0-10).
Total score out of 40.
Model selection: gpt-4o-mini (default), gpt-4o, gpt-4.1.
Single and bulk modes with column mapping.
Streamlit appRequires an API key
- Platform
- Browser-based (no installation required)
- Input
- OpenAI API keyMeta description text (single) or file (bulk)Optional: URL for context
- Output
- Per-criterion scores (0-10): hook, benefit, voice, urgency. Total /40 with summary stats (average, max, min) for bulk.
- Category
- Content
Use cases
- Auditing meta descriptions at scale
- Comparing your descriptions vs competitors
- Finding weak descriptions to improve
- Training teams on meta description best practices
#features
- Four 0-10 criteria: emotional hook, benefit, active voice, urgency (total /40)
- Models: gpt-4o-mini (default), gpt-4o, gpt-4.1 with strict JSON schema output
- Compare mode scores up to 4 description columns per row and picks a winner
- Single-mode length check (120-160 characters flagged as good)
- Bulk CSV/Excel with summary statistics
- 0.5s pause between API calls
#how-to-use
- Enter your OpenAI API key
- Select GPT model (gpt-4o-mini recommended)
- Paste description or upload CSV/Excel
- Map columns for bulk analysis
- Review color-coded criterion scores
- Download with total scores and averages
#faq
- Will the same description get the same score every time?
- Not necessarily. The API call does not pin the temperature, so scores can vary slightly between runs. The response is forced into a strict JSON schema of four integers, but the judgement itself is the model's, guided only by a rubric in the prompt (10 is exceptional, 7-8 good, 5-6 average, below 5 needs improvement).
- How long does a bulk run take and what does it cost?
- One API call per description with a hard-coded 0.5 second pause between rows, so expect a bit under 100 rows per minute plus model latency. In compare mode it makes one call per description column, up to 4 per row, which quadruples both time and token spend.
- Does it check description length?
- Only in single mode, where it flags under 120 characters as too short, 120-160 as good and over 160 as risking truncation. Bulk mode returns scores only and does not report lengths, so run a separate length check on your file if that matters.
- What is compare mode for?
- Tick 'Compare multiple descriptions per row' and select up to 4 description columns, for example original vs rewritten variants. Each is scored on the same four criteria and the highest total out of 40 is recorded in winning_description and winning_score columns per row.
- What happens to rows that fail?
- Failed rows are kept in the output with the URL, the description text and an error column instead of scores, so nothing is silently dropped, but there is no retry. The summary statistics only average rows that scored successfully.
/contact
Want me to run this for you? I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.