---
name: "cfp_opportunity_tracking"
description: "Track open calls for speakers (CFPs) that fit a specific speaker: build a layered source list of CFP trackers and event directories, sweep it weekly, score each call on topic fit, audience, deadline, and speaker terms, keep a deduplicated tracker that only resurfaces a listing when its deadline is closing, and hand the best matches off as proposal-ready briefs. Use when someone wants to find speaking opportunities systematically, asks what CFPs are open for their topics, wants a weekly CFP sweep, or needs to stop missing deadlines. For writing the proposal itself, use a CFP writing skill; this skill stops at the handoff."
---

# CFP Opportunity Tracking

## Purpose

Keep a speaker fed with the right open calls and no noise: a maintained source list, a weekly sweep, a scored tracker, and a short handoff of the matches worth drafting for. The tracker never shows the same listing twice unless its deadline is closing or its state changed, so a weekly report stays readable month after month.

## Workflow

1. **Build the speaker profile first.** Write down: 3 to 6 topics the speaker can actually deliver, talk formats they will do (session, workshop, lightning, panel), audience levels they suit, regions or online only, travel limits, and the minimum terms they accept (for example, pass plus travel, or online only so terms do not matter). Every score later reads off this profile. No profile, no scoring.
2. **Build the source list in layers.** Aggregators, submission platforms that double as directories, field lists and newsletters, and a personal watch list of target events. The layered list with per source notes is in [references/source-list.md](references/source-list.md). Keep it short enough to sweep in one sitting.
3. **Sweep weekly, on a fixed day.** Work the layers in order. For each candidate: open the event's own CFP page, not just the aggregator listing, and read off the close date with its timezone, event dates, formats on offer, topics and tracks, audience level, review type (fixed deadline or rolling), submission limits, and the speaker terms exactly as stated. Aggregator data is a lead. Sessionize says on its own pages that it is not responsible for event data accuracy, and newsletter roundups carry false positives, so the event page is the only scoring source.
4. **Add each verified call to the tracker.** `python3 scripts/cfp_tracker.py add tracker.csv ...` with the fields from step 3 and the three judgement scores from step 5. The add command refuses a second row for the same event and edition or the same CFP URL, so duplicates die at entry instead of in the report.
5. **Score on four axes, 0 to 5 each.** Topic fit: how many of the event's stated topics match a talk the speaker can deliver, 5 means a ready talk fits a named track, 0 means no overlap. Audience: level and size against the profile, 5 means the stated audience is the speaker's audience. Speaker terms: 5 means pass, travel, and accommodation covered or an honorarium, 3 means pass plus some travel help, 1 means pass only, 0 means nothing stated or the speaker pays to attend. Read terms off the CFP page: organizer pages publish them in comparable form (free access, meals, speakers dinner, travel help are typical lines). Deadline: scored by the script from days left, with the sweet spot at 15 to 45 days, a penalty inside 14 days unless a ready talk fits, and rolling review treated as one band more urgent than the raw date because early proposals get read first at rolling events.
6. **Act on the band.** Total is out of 20. 16 and up: propose, draft this week. 12 to 15: propose if a ready talk fits, otherwise watch. 8 to 11: watch, revisit when the deadline nears or terms improve. Under 8: skip and mark the row skipped so it stops surfacing. Never inflate a score to justify a trip the speaker wants. The terms and fit axes exist to say no.
7. **Surface without repeating.** `python3 scripts/cfp_tracker.py list tracker.csv` prints a row only if it was never surfaced, or its close date is inside the closing window (14 days by default). `--all` prints everything open for a full review, which belongs at most once a month. This rule is the whole point of the tracker: a listing earns a second mention by getting urgent, not by still existing.
8. **Hand off the best matches.** `python3 scripts/cfp_tracker.py brief tracker.csv --top 2` prints a proposal handoff per match: score, close date and days left, CFP page, format, review type, terms, and the draft inputs (closest ready talk, the fit case to put in reviewer notes, the form limit). Drafting itself belongs to a CFP writing skill. This skill ends with matches a drafter can start on without re-reading the CFP page.
9. **Close the loop after each deadline.** Mark rows submitted, skipped, or expired. When a result comes back, record accepted or rejected on the row. A rejected event with a good score stays on the watch list for next year. An accepted one goes to the top of it.

## Output Contract

One weekly sweep produces:
- New tracker rows for every verified open call found, each with close date and timezone, event dates, format, review type, source, terms as stated, and a four axis score out of 20 with its band.
- A surfaced list containing only new rows and rows closing inside 14 days. Nothing else repeats.
- Proposal handoff briefs for the top matches (2 by default): everything a proposal draft needs, pulled from the CFP page, with the terms line quoted as the event stated it.
- A one line sweep note: sources checked, calls found, calls added, duplicates refused.

The tracker CSV is the durable record. Reports are views of it, never separate lists that can drift from it. See [references/worked-sweep.md](references/worked-sweep.md) for a full sweep with real commands and output, ending in two handoffs and one honest watch decision.

## Operating Rules

1. The event CFP page outranks every aggregator, newsletter, and social post. If they disagree on a date or a term, the event page wins and the tracker row gets corrected.
2. Deadlines are stored with the timezone the event printed. Organizer pages close calls at a stated hour in a named zone, and a date without its zone loses talks at the boundary.
3. Terms are scored as stated, never as assumed. "Not stated" scores low and reads "not stated" in the brief. Plenty of good events state terms poorly, and the fix is asking the organizer, not guessing in the tracker.
4. Sales pitches are out of scope for scoring. Major organizer families state plainly that sales or marketing proposals get rejected, so a talk whose topic fit depends on pitching a product scores 0 on topic no matter how well the keywords match.
5. Respect submission caps. Some events limit how many proposals one speaker may appear on and remove all of them if the cap is broken. Check the cap on the CFP page before the handoff turns into three drafts for one event.
6. One row per call, ever. If a deadline extends, edit the row and let the score move. Two rows for one call is how a speaker submits twice or misses the real date.
7. Weekly means weekly. CFPs often open 6 to 10 months before the event, well before the event markets itself, so a monthly sweep misses short calls entirely. If a week is skipped, say so in the sweep note instead of backdating rows.
8. Keep the profile honest. When the speaker ships a new talk or drops a topic, update the profile and rescore open rows in the same pass. Scores against a stale profile are fiction with numbers on.
