Grade a specific marketing surface and get a prioritized fix list. Pick what to audit: your site's SEO health, your visibility in AI search engines like ChatGPT and Perplexity, a landing page scored on six dimensions, or a form that's leaking conversions. Every finding ranked by impact and ease.
Scanned 9/19/2026
Install to Claude Code
npx -y skills add gethouston/houston --skill audit-a-surface --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Audit A Surface?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gethouston-audit-a-surface)More formats (shields.io, HTML) on the badges page.
---
name: audit-a-surface
description: "Grade a specific marketing surface and get a prioritized fix list. Pick what to audit: your site's SEO health, your visibility in AI search engines like ChatGPT and Perplexity, a landing page scored on six dimensions, or a form that's leaking conversions. Every finding ranked by impact and ease."
version: 1
category: Marketing
featured: no
image: megaphone
integrations: [firecrawl, semrush, ahrefs, perplexityai]
x_houston:
created_by: houston
skill_schema: 1
---
# Audit A Surface
Four possible audit surfaces. `surface` param picks probe;
## Parameter: `surface`
- `site-seo` - on-page + technical + content audit of configured
domain via Semrush / Ahrefs / Firecrawl.
- `ai-search` - ChatGPT / Perplexity / Gemini / Google AI Overviews
visibility probe + GEO recs.
- `landing-page` - fetch via Firecrawl, score 6 dimensions 0-3,
prioritized fix list.
- `form` - flag unnecessary fields, rewrite labels + helper text,
sequence by friction (non-signup forms - demo / contact / lead /
checkout).
User names surface in plain English ("SEO audit", "GEO", "teardown my landing page", "fix my demo form") -> infer. Ambiguous -> ask ONE question naming 4 options.
## When to use
- Explicit: "run an SEO audit", "audit AI search visibility", "GEO
audit", "critique {URL}", "audit my lead form".
- `ai-search` triggers: "do I show up in ChatGPT?", "are we visible
in Perplexity / Gemini for our category?", "who shows up when
someone asks about {category} in ChatGPT?".
- `form` triggers: "audit my demo form", "my contact form is
leaking", "this lead form is too long - what can I cut?",
"rewrite the labels on this form", "review the fields on the
application / checkout form".
- Implicit: inside `plan-a-campaign` (paid / launch) when routed
landing page needs sharpening, or inside `check-my-marketing` (content-gap)
when baseline site health unknown.
- Per-surface cadence: site-seo weekly max, ai-search monthly max,
landing-page on demand, form on demand.
## Connections I need
I run external work through Composio. Before this skill runs I check that the categories below are linked. Missing -> I name the category, ask you to connect it from the Integrations tab, stop.
- **Web scrape (Firecrawl)** - optional. If not connected I fall back to basic HTTP fetch for `landing-page`, `form`, and the on-page pass of `site-seo`, rougher but workable on static pages.
- **SEO (Semrush or Ahrefs)** - on-page audit, indexation, content-fit, ranking data. Required for `site-seo` - no fallback, that data is proprietary.
- **AI search (Perplexity / search providers)** - probe ChatGPT / Perplexity / Gemini / AI Overviews for your visibility. Required for `ai-search` - no useful fallback, the engines need API access.
For `site-seo` I stop if no SEO tool is connected. For `ai-search` I stop if no AI-search provider is connected. For `landing-page` and `form`, basic HTTP fetch covers the scrape fallback so I keep going.
## Information I need
I read your marketing context first. For every required field that's missing I ask ONE plain-language question (best modality: connected app > file drop > URL > paste) and wait.
- **Your positioning** - Required. Why I need it: every audit grades content against who you serve and what you stand for. If missing I ask: "Want me to draft your positioning first? It's one skill, takes about five minutes."
- **Your ideal customer** - Required for `landing-page` and `form` (so I can grade objection handling and field choices). If missing I ask: "Who is the customer you want this page or form to convert? A short paragraph or paste from your CRM works."
- **Your website domain** - Required for `site-seo` and `ai-search`. If missing I ask: "What's the domain you want me to audit? Paste the URL."
- **Your SEO tool** - Required for `site-seo` and `ai-search`. If missing I ask: "Open Integrations and connect Semrush or Ahrefs, or paste a list of pages you want me to grade."
## Steps
<!-- houston-workflow:v1 -->
1. **Read ledger + positioning.** Gather missing required fields per
above (ONE question each, best-modality first). Write atomically.
2. **Discover tools via Composio.** Run `composio search seo` /
`composio search web-scrape` / `composio search ai-search` /
`composio search perplexity` per surface. For `site-seo` and
`ai-search`, stop if no proprietary tool is connected (SEO data
and AI-search probes can't be replicated). For `landing-page` and
`form`, fall back to basic HTTP fetch when Firecrawl is missing
and flag JS-heavy pages where the result is thin.
3. **Branch on surface.**
- `site-seo`: execute discovered tool slugs against domain +
key URLs, three passes:
- **On-page** - title tags, meta descriptions, H1/H2 hierarchy,
canonical tags, schema, alt text, internal linking.
- **Technical** - robots.txt / sitemap, indexation, Core Web
Vitals, mobile usability, HTTPS, broken links, redirects.
- **Content** - top-performing pages, thin content,
cannibalization, content-vs-positioning fit.
- `ai-search`: build query set (3 buckets of 3-5 queries each):
**Brand** ("what is {product}", "{product} vs {competitor}",
"{product} pricing"), **Category** (top JTBD questions from
positioning), **Problem** (ideal customer pain-point phrasings). Query each
engine via discovered slugs - minimum ChatGPT / Perplexity /
Gemini / Google AI Overviews. Per query-engine pair capture:
cited (yes / mentioned / no), citing URL, who cited instead,
AI's category framing.
- `landing-page`: execute web-scrape slug to fetch URL
(rendered HTML + visible text + primary images + meta + any
page-speed signals). Score 6 dimensions 0-3 with one-sentence
reason quoting page:
1. **Headline clarity** (WHO + WHAT in <=12 words).
2. **Value prop above fold** (outcome visible without
scrolling).
3. **Social proof** (credibility + proximity to CTA).
4. **Primary CTA** (one unambiguous action matching primary
conversion).
5. **Objection handling** (FAQ / guarantee / pricing against
top 2-3 ideal customer objections from positioning).
6. **Visual hierarchy** (eye-path -> CTA, no competing CTAs).
Bonus: page-speed signals if tool returns them.
- `form`: accept URL, screenshot, or pasted field list. URL ->
execute web-scrape slug. Identify form type (lead / contact /
demo / application / survey / checkout - NOT signup, that's
`write-my-page-copy` surface=signup-flow). Ask ONE question on
business context if unclear (what happens to submissions,
which fields get used in follow-up, compliance). Field-by-field:
**Verdict** (keep / drop / defer / make-optional /
compliance-required), **Reason**, **Label rewrite**
(conversational, one question per field), **Input-type fix**
(mobile keyboard, inline validation, smart defaults, email
typo detection). Rewrite value prop above form. Name
anti-patterns (cognitive-load, privacy-anxiety-no-trust,
missing-value-prop, too-many-fields, poor-mobile-keyboard,
error-shaming, captcha-above-submit, no-progress-signal).
Replace "Submit" with action + outcome.
4. **Score + prioritize.** Tag every finding `{severity: critical /
high / medium / low}` x `{effort: quick-win / medium / heavy}`.
Surface top 5 critical-or-high quick-wins at top. For
`landing-page`, include the per-dimension scorecard so the total
is self-evident:
```
Headline clarity 1/3
Value prop above fold 1/3
Social proof 3/3
Primary CTA 1/3
Objection handling 2/3
Visual hierarchy 2/3
Total 10/21
```
Always show all six rows + total. Never show just the total alone.
5. **Write** atomically to
`audits/{surface}-{slug}-{YYYY-MM-DD}.md` (`*.tmp` -> rename).
Slug: `site-seo` / `ai-search` use domain; `landing-page` /
`form` use kebab of URL or form name. Structure: Executive
summary -> Top 5 quick wins / biggest leak -> Findings by pass ->
Recommended 30-day plan (site-seo) / Prioritized fix list
(landing-page, form) / GEO recommendations (ai-search).
6. **Append to `outputs.json`** - read-merge-write atomically:
`{ id (uuid v4), type: "audit", title, summary, path, status:
"ready", createdAt, updatedAt }`.
7. **Summarize to user.** One paragraph with top 5 quick-wins
(or single biggest fix) and path.
## What I never do
- Invent findings, cite rates, form field counts. Every claim ties
to real tool response or URL observation. Missing data -> marked
UNKNOWN or TBD.
- Promise lift percentage - audits surface hypotheses.
- Drop legally required form field (ask if uncertain).
- Hardcode tool names - Composio discovery at runtime only.
## Outputs
- `audits/{surface}-{slug}-{YYYY-MM-DD}.md`
- Appends entry to `outputs.json` with type `audit`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!