Automated Content  Ranks

I built CherryPickr after running into a simple, expensive truth: most AI content does not rank because it is written first and validated later. The fix was not “better writing.” It was better inputs.

"Ninety days after implementation, organic traffic was up 41%."

The Challenge

CherryPickr flips the flow. We start at the SERP, extract what winners are doing, turn those findings into constraints, then generate content that explicitly exceeds the competitive bar. In the first 90 days across three topic clusters:

  • Cut time to publish per article by 57 percent (from ~7.0 hours to ~3.0 hours).
  • Improved average position from 28.4 to 14.2 within 8 weeks.
  • Grew organic sessions to cluster pages by +41 percent quarter over quarter.
  • Reduced cost per article by ~48 percent while increasing depth and structure.

The rest of this case study explains why I built it, how it works, what I learned, and what I’d change next.

The  Problem

  • SEO
  • Content Automation
  • AI integration

I was shipping good-looking content that still underperformed. Patterns kept repeating:

  • Drafts ignored what actually ranked. We ideated from keywords, not from SERP evidence.
  • Search intent mismatches. The SERP wanted how-to checklists and comparison tables. We gave essays.
  • Missing technical basics. FAQs, schema, internal link targets were ad hoc.
  • Scaling pain. Briefs took hours. Editors argued taste instead of data.

Hypothesis

If we engineered content from measured SERP constraints - not gut feel - we would publish fewer pages, each more likely to rank. That meant:

  1. Quantify exactly what the top 10 pages do.
  2. Translate those signals into generation constraints.
  3. Force content to clear that bar before it reaches the CMS.

Success looked like faster throughput, stronger early rankings, and lower rework. Main considerations at the starts were as followed:

  • APIs vs scrapers
    Serper, SerpAPI, DataForSEO provide SERP results. Use Playwright or Puppeteer to render JavaScript for sites that hydrate content client-side.
  • Robots and rate limiting
    Respect robots.txt and throttle requests. Use exponential backoff, rotating proxies, and a polite concurrent fetch cap.
  • Storage and caching
    Cache SERP JSON by query+locale+date. Store page HTML and parsed artifacts with fingerprint hashes to avoid duplicate processing.

What I Actually Built

1) SERP Intelligence

  • Inputs: query, locale, device.
  • Data captured per URL: exact word count, content type, H2/H3 counts, title and meta lengths, schema types, FAQ presence, semantic noun phrases (2 to 4 words), internal and external link counts, media.
  • Why exact pages: snippets lie. The winning structure lives in full-page content and links.

2) Ranking Factor Analysis

  • Compute averages, min/max, prevalence rates.
  • Derive targets: if the average page in top 3 results is 2,100 words, we set target word count = 2,100 × 1.2 ≈ 2,520 to legitimately exceed depth without padding.
  • Separate positions 1-3 from 4-10 to isolate what leaders do differently.

3) Competitive Deep-Dive

  • Extract section headings across the top results.
  • Map which subtopics recur and which are missing.
  • Pull “People Also Ask” style questions that are answered on winners and those no one covers.

4) Generation With Constraints

  • Prompts are structured. I don’t ask “write an article.” I pass a JSON payload the model must honor.

Example payload you can use in LLMs to get similar results:

{
  "query": "laser hair removal vs waxing cost",
  "targets": {
    "content_type": "comparison+guide",
    "word_count": 2200,
    "h2_min": 9,
    "h3_min": 12
  },
  "semantic_phrases": [
    {"phrase":"pain level comparison","required":true},
    {"phrase":"treatment frequency","required":true},
    {"phrase":"long-term cost","required":true},
    {"phrase":"skin types and contraindications","required":true}
  ],
  "competitors": {
    "titles":[
      "Laser vs Waxing: Which Is Cheaper Long-Term?",
      "Waxing vs Laser Hair Removal Cost Comparison"
    ],
    "has_faq_rate": 0.7,
    "schema_types":["Article","FAQPage"]
  },
  "faq":[
    "Is laser hair removal worth it long-term?",
    "Does waxing cause ingrown hairs more than laser?"
  ],
  "tech": {
    "title_max": 60,
    "meta_max": 155,
    "schema":["Article","FAQPage"]
  },
  "internal_links":[
    {"anchor":"treatment prep checklist","url":"/pre-treatment-checklist/"},
    {"anchor":"aftercare guide","url":"/aftercare/"}
  ]
}

The system turns that into a role + instruction prompt with hard requirements for headings, FAQ, schema, phrasing, and internal links.

5) QA And Linting

A draft cannot publish unless it passes:

  • Coverage check: every required semantic phrase appears in a meaningful section.
  • Readability: target band by persona.
  • Uniqueness: shingle similarity below a threshold vs any single competitor.
  • SEO lint: title 50–60 chars, meta 150–155 chars, 1 H1, required H2/H3 counts, valid schema, purposeful internal links.

If any check fails, the job returns with precise fix instructions and the draft is regenerated or lightly edited.

6) Publishing And Tracking

  • Push to CMS as “Needs review”, with meta, schema, and internal links already in place.
  • Optional title A/B tests.
  • Rank tracking, Search Console pulls, engagement metrics, and micro-conversions are monitored in a Looker Studio or Grafana board.

The result was predictable: a lot of publishing energy with thin traffic. I didn’t need a “content writer.” I needed a content system that made the right page, the right way, the first time.

Architecture At A Glance

[Keyword Queue]
      ↓
[SERP Fetcher] → [SERP Cache]
      ↓
[Page Scraper/Renderer] → [Signal Store (Postgres + blobs)]
      ↓
[Ranking Analyzer] → [Gap Detector] → [Outline Scorer]
      ↓
[Prompt Builder] → [AI Generator] → [QA Validator]
      ↓
[CMS Publisher] → [A/B Title Tests]
      ↓
[Search Console + Analytics Collector] → [KPI Dashboard]

Risks And How I Mitigated Them

Scraping fragility: many ranking pages render critical content with JavaScript, so naïve HTML fetches miss headings, FAQs, and schema. I stabilized extraction with Playwright-based rendering, deterministic fallbacks when rendering fails, and a cache-first strategy that stores both raw HTML and parsed artifacts. Polite rate limiting and rotating fingerprints kept the crawler reliable and compliant, while checksum comparisons prevented reprocessing unchanged pages.

Model drift: output quality can degrade as models update or as prompts accumulate subtle changes. I versioned prompts by SERP archetype and locked them to use-case IDs, then tracked QA pass rates per version. When pass rates dipped or variance increased, I could roll back a single prompt family, run A/B validations, or re-tune constraints without touching the rest of the system.

Overfitting to a single SERP snapshot: SERPs are living systems. To avoid building content that perfectly fits yesterday’s winners, I cached snapshots for reproducibility but enforced scheduled refreshes and mandatory rechecks before publishing high-value pages. For volatile keywords, I compared two recent snapshots and only accepted constraints that were stable across both.

Automation for its own sake: automation should remove toil, not judgment. Human editors still review outlines and final drafts with a short, objective checklist: intent alignment, clarity of explanations, evidence and examples, and whether the piece earns the click against current titles. The pipeline handles data gathering, guardrails, schema, and links; editors focus on truth, tone, and usefulness.

Optimizing for LLMs and AI Search

AI assistants reward pages that are explicit, structured, and verifiable. I tuned outputs for LLM discoverability by making claims sourceable, adding concise definitions and step-by-step procedures, and writing headings that map cleanly to questions users actually ask. Every article includes valid JSON-LD (Article plus FAQ or HowTo when SERP prevalence justifies it), tight summaries at the top, and short, self-contained answers inside each section so models can extract helpful snippets without extra context. I reduced ambiguity by preferring concrete nouns over pronouns, naming entities consistently, and using tables for comparisons. Finally, I linked out to authoritative references where facts matter and maintained author bios with real-world experience to satisfy E-E-A-T signals that LLMs increasingly weigh when choosing what to surface.

Results and impact

  • 209%

    More Bookings

    with a higher average customer value thanks to increased sales of premium treatments.

  • 106

    phone calls

    direct response to our high-intent Google Ads campaigns.

  • 110%

    More foor traffic

    customers actively coming in for consultations and treatments.

  • 8X

    Return on Ad Spent

    every dollar spent on ads generated eight dollars in revenue.

Ready to
hire?

Hasan sitting in New York museum of modern art. June 2025.