Rex Automaton
All posts
Marketing & Content AutomationSeptember 16, 20268 min read

How We Automated Press-Quote Placement for Jacky

Case study: our drafts-only expert sourcing engine finds journalist requests daily, drafts pitches, and books quotes without risking credits or reputation.

By Jacky Lei

We built and shipped a drafts-only expert sourcing pipeline that monitors journalist requests daily, triages them, drafts tailored pitches, and reminds us to submit on time. In production it separates credit-gated platforms from API-first ones, so we never waste pitch credits and still move fast on opportunities.

Press-quote placement automation is the systemized collection, triage, drafting, and tracked submission of expert pitches to journalists so you earn third-party citations consistently without manual inbox policing.

The problem it solves

You want authoritative, third-party quotes that AI search and prospects trust, but manual sourcing is a grind: browsing platforms, copying briefs, drafting from scratch, and missing deadlines. Our engine turns that into a morning checklist of pre-drafted pitches with clear deadlines and a single click to finalize.

Manual workflowAutomated workflow
Check multiple portals sporadically, miss windowsScheduled daily harvest with deadlines captured and surfaced
Re-type the same bio and proof pointsTemplate engine composes on-brand, brief-specific pitches
Risk burning pitch credits by clicking too earlyDrafts-only guard: never auto-submit on credit-gated portals
Forget to follow up or run out of timeSLA timers and reminders on approaching deadlines
No tracking of what workedOutcome log across sources, topics, and pitch styles

How the automation works

The architecture runs two lanes in parallel: a browser-harnessed, drafts-only lane for credit-gated portals and an authenticated lane for API-first sourcing. A classifier chooses viable matches, a templater composes on-brand pitches, and a reminder layer prevents deadline misses. Nothing submits without a human click.

  • Credit-gated lane: Runs a dedicated Chrome profile, captures briefs, and drafts privately. It never presses submit so we avoid burning credits when forms fail or briefs change.
  • API-first lane: Pulls eligible briefs where programmatic access is allowed, then feeds the same classifier and templater. Drafts appear in our queue with live deadlines.
  • Classifier and templater: Tags expertise fit, urgency, and required assets. Composes a 120 to 180 word pitch that mirrors the brief, with a proof block and bio.
  • Reminder and SLA timers: Sets per-brief countdowns, escalates 2 hours before the window closes, and defers anything that asks for off-topic expertise.
  • Outcome log: Captures status across discoverable replies, submissions, and bookings so we learn what converts.

Press-quote placement automation workflow: sources feed a triage and AI templater, produce drafts-only for credit-gated portals and ready-to-send for API-first, with reminders and an outcome log

Step-by-step: how to build it

1) Schedule a daily harvesting run

Run a single scheduled job with jitter so you do not look like a bot. We run at 06:30 local with a randomized delay and a dedicated browser profile for the drafts-only lane.

# Windows Task Scheduler wrapper
powershell -ExecutionPolicy Bypass -File scripts\sourcing-daily.ps1 -JitterSeconds 420 -Profile "PressDrafts"

Key point: keep one persistent browser profile for automation. Rotating profiles breaks saved sessions and increases friction on credit-gated portals.

2) Normalize briefs into a common shape

Different portals describe requests differently. Normalize to a minimal schema and keep it internal so you can swap sources later without refactors.

// normalize.js
export function normalizeBrief(raw) {
  return {
    id: hash(raw.title + raw.deadline + raw.publisher),
    title: trim(raw.title),
    outlet: trim(raw.publisher || raw.outlet),
    topic: guessTopic(raw.text),
    deadlineAt: parseDeadline(raw.deadline),
    asks: extractAsks(raw.text),
    contactMode: raw.contact || "portal",
    lane: raw.creditGated ? "drafts_only" : "api_first"
  };
}

Do not hardcode field names from vendors. Treat everything as untrusted text and extract what you need.

3) Filter by fit and risk

Reject briefs that do not match your real expertise or that carry unclear credit or scope. This is where you protect brand and credits.

# classifier.py
RULES = {
  "max_words": 180,
  "forbidden_themes": ["politics horse race", "medical diagnosis"],
  "must_match_any": ["AI automation", "workflow integration", "B2B ops"],
}
 
def is_viable(brief):
  if brief.topic in RULES["forbidden_themes"]:
    return False
  if not any(tag in brief.topic for tag in RULES["must_match_any"]):
    return False
  return brief.deadlineAt and hours_until(brief.deadlineAt) > 1

Be conservative. A smaller number of high-fit pitches outperforms broad spraying.

4) Compose a tight, on-brief pitch

Use a strict template and keep the word count. We cap at 120 to 180 words with a clear proof block and an easy-to-copy quote line.

// templater.js
export function draftPitch(brief, profile){
  return [
    `${brief.title}: quick note on ${brief.topic}`,
    `Hi ${brief.outlet} team,`,
    profile.positioning,
    `Perspective: ${profile.point}`,
    `Proof: ${profile.proofOne}; ${profile.proofTwo}.`,
    `If helpful: 1 to 2 lines you can lift: "${profile.pullQuote}"`,
    `Bio: ${profile.bio}`,
  ].join("\n\n");
}

Keep the pull quote short and specific. Journalists can paste that line verbatim.

5) Enforce drafts-only on credit-gated portals

Never auto-submit where pitch credits are consumed on click. Open the compose view, paste the draft, save locally, and stop. Human presses send.

# drafts_only.py
browser = attach_profile(profile_dir)
open_compose_view(browser, brief)
fill_fields(browser, draft_pitch)
save_local_snapshot(brief.id, draft_pitch)
# Intentionally no submit call here

This single guard saved us real money. On one platform the credit is charged at the first compose step, not on final send.

6) Queue reminders and measure outcomes

Deadlines kill most opportunities. Set timers and record what happens so your system gets smarter.

-- outcome_log.sql
CREATE TABLE IF NOT EXISTS outcomes (
  id TEXT PRIMARY KEY,
  source TEXT,
  topic TEXT,
  drafted_at TIMESTAMP,
  submitted_at TIMESTAMP,
  status TEXT,
  notes TEXT
);

We escalate at T minus 2 hours and close the loop after submission with a final note on booked quotes.

Where it gets complicated

  • Credit-gated platforms burn credits early: Some portals consume a pitch credit when you open the composer. Our drafts-only lane prevents accidental spend and lets a human decide to submit.
  • Backlog expirations are the dominant failure: We saw 65 of 96 opportunities die in a 12 day period solely from expired deadlines. SLA timers are not a nice-to-have.
  • API-first sources still require explicit consent: Even when there is an API, account-level consent is required. We block pulls until a human authorizes the connection.
  • Browser harness reliability: A dedicated Chrome profile with a stable remote control port avoids session loss. Changing profiles breaks saved sessions and triggers friction.
  • Do not trust form state: Editors can swallow text or reset fields. Always save a local snapshot of what you intend to submit before you click.

What this actually changes

For our own program, we shifted from opportunistic pitching to a daily, reliable cadence. Drafts are waiting when we sit down, deadlines are visible, and we submit with intention instead of haste. Third-party quotes are materially more citeable in AI surfaces than on-domain posts, which is the whole point of this investment.

One external benchmark: a large study of email outreach found an average reply rate of 8.5 percent for cold emails, which is a useful ceiling if you spray generic pitches. Tight fit and short, on-brief copy beat that baseline in our experience. Source: https://backlinko.com/email-outreach-study

Operational observations we logged:

  • AI cites third-party mentions roughly 6.5x more than on-domain mentions in our tracking.
  • On a 12 day backlog, 65 of 96 dropped opportunities died purely from expired deadlines.
  • We keep platform pitch credits safe by default: the system never auto-submits on credit-gated portals and ends with drafts only.

Frequently asked questions

Does this auto-submit pitches to journalists?

No. It intentionally does not. The engine drafts and reminds. A human always presses send. This protects your brand voice and prevents accidental credit spend on portals that charge when you open the composer rather than when you submit.

What platforms does this work with?

We run two lanes. A drafts-only lane for credit-gated portals that require a browser session and human send. An authenticated lane for sources that allow programmatic pulls with explicit account consent. The drafting, reminders, and logging are identical across both lanes.

How do you prevent missed deadlines?

Every brief gets a deadline timestamp, an SLA target, and a T minus 2 hours escalation. The morning queue shows a countdown. If we decide not to pitch, we record a reason so we can refine fit rules rather than missing windows accidentally.

What does this cost monthly to operate?

The engine itself is lightweight. You are paying for a small amount of compute to run the daily job and whatever platform subscriptions you already have. The real value is in saved time and in booking quotes that compound brand authority over time.

Can a non-technical owner run this?

Yes. You do not need to touch code to use it. The only technical bits are the one-time setup of the scheduled job and connecting accounts with explicit consent. Daily use is a queue of drafts with deadlines and a button to submit.

Will this reduce burned pitch credits?

Yes. The drafts-only lane exists to avoid accidental charges and lost form states. You review and submit. If a form or portal behaves unexpectedly, you still have a local snapshot of your pitch to paste or reuse elsewhere.

If you want consistent third-party quotes without living in multiple portals, we already built this and run it daily. See how we approach AI Search and SEO and how we structure AI distribution in our post on how to get your business in AI search results. When you are ready to turn earned media into a repeatable pipeline, book a 15 minute call.

Want us to build this for you?

Nine questions, about 90 seconds. You see the hours it is costing you, then pick a time. No pitch.

Get your free assessment

Related reading