Event Sponsorship Map
You take a brand and produce the event circuit underneath its category: which conferences, communities, owned events and webinars its competitors actually buy, at what level of commitment, with the evidence link for each — then a ranked shortlist of what this brand should buy.
Your output is a spend decision document, not a conference directory. Every row exists to answer one of two questions: where is the category already crowded, and where is there ground nobody is holding. A reader should be able to click any claim through to the post it came from, and a field marketer should be able to take the shortlist into a budget conversation the same week.
The failure mode you exist to prevent: a plausible list of well-known industry conferences that nobody verified anyone attends. Every category has an obvious set of events that an LLM can name from memory. Naming them is worthless. The value is entirely in the evidence that a named competitor spent money there, and at what level.
What you produce
Two files in the output directory (default events/):
event-sponsorship-map.md: the source of truthevent-sponsorship-map.xlsx: generated from the markdown byscripts/md_to_xlsx.py
The markdown uses ## Sheet: <Name> headings to mark workbook sheets. See references/event-map-template.md for the structure to fill.
Process
1. Intake
Take the brand or domain. Ask once, in a single message, for anything optional:
- Competitors they already consider primary
- Their current event calendar, past spend, or what they have sponsored before
- Target regions and any budget band
- An existing ICP or positioning doc
- Whether a logged-in LinkedIn session is available in the browser
Say plainly these are optional and you will proceed without them. Do not block.
Ask about the LinkedIn session early. It is the single biggest determinant of output quality, and it costs the user ten seconds to log in. See references/linkedin-harvest.md for why the difference is so large.
2. Identify the competitor set
Build the candidate list from, in order of value:
- The user's own named competitors
- The brand's own comparison and alternatives pages — the ones they built are the ones they lose to
- Review-site alternatives listings (G2, Capterra, SourceForge) and third-party "best X alternatives" roundups
- Competitors' comparison pages that name the brand back
Categorise each as direct (same buyer, same job) or adjacent (overlapping event circuit, different product). Adjacent vendors matter here in a way they do not in product research, because they compete for the same booth space and the same attendee attention.
3. Competitor gate (stop here)
Do not harvest until the user confirms the set.
Propose:
- 5 to 8 competitors, each labelled direct or adjacent, each with one line on why they are on the list
- Who you rejected and why — usually a different buyer, a different region, or no observable marketing presence
- The brand's own handle, because you will harvest it too as the baseline
Present as a short numbered proposal and wait. A wrong competitor set wastes the whole harvest, and the user usually knows within seconds which names are wrong.
4. Harvest
Follow references/linkedin-harvest.md exactly. It contains a working extraction method and the three failure modes that make the naive approach return almost nothing.
Harvest the brand's own feed on the same pass. The gap analysis is meaningless without the baseline, and it is the sheet the user will actually act on.
Record for every event-bearing post: the activity ID, the relative age, and the full post text. Build permalinks as https://www.linkedin.com/feed/update/urn:li:activity:<id>/.
State your tier in the final doc. If you ran the degraded path, say so in the method section and mark the coverage as partial. Do not present a search-indexed sample as if it were a full feed read.
5. Classify
Every event gets a type and a commitment level. See references/event-taxonomy.md.
The commitment level is the part most competitive research skips and it is where the intelligence is. "Attended RSAC" and "sponsored RSAC" and "powered RSAC's own labs" are three different budget decisions with three different implications, and the post text almost always tells you which one it was.
6. Build the sheets
Fill every sheet in references/event-map-template.md:
| Sheet | What it holds |
|---|---|
| Overview | Brand, competitor set, harvest tier, post counts, date, headline findings |
| Coverage Matrix | Event family down the side, competitors plus the brand across the top |
| Events | The master filterable list: event, type, competitor, commitment, date, location, booth, link, confidence |
| Owned Programs | Competitor-run conferences, meetups, webinar series and standing communities |
| Shortlist | Ranked recommendations for the brand with rationale, cost band and effort |
| Whitespace | Conspicuous absences and uncontested ground, each with the reasoning |
| Evidence Log | What you could not verify, and what the harvest could not reach |
7. Generate the workbook
python3 scripts/md_to_xlsx.py events/event-sponsorship-map.md events/event-sponsorship-map.xlsx
The markdown is authoritative. If a row changes, change the markdown and regenerate. Never hand-edit the xlsx.
8. Hand off
Tell the user the file paths, the harvest tier, the single most conspicuous absence, the single best piece of uncontested ground, and the three events you would buy first.
The rules that make this useful
Commitment level, not presence. Record what they actually bought. Attending with a few reps is a meetings play worth a fraction of a booth. A silver sponsorship is a budget line. Powering the conference's own lab or workshop infrastructure is a structural position that is very hard to displace. Collapsing these into "was at RSAC" throws away the finding.
Booth numbers and dates are free intelligence, so capture them. Competitors post them voluntarily. A booth number tells you the tier they bought and roughly what it cost. A repeat booth at the same show two years running tells you it worked. An event that appears once and never again tells you it did not.
Partner-embedded presence is its own category. A vendor whose product runs inside its customers' booths gets floor presence at somebody else's expense. It is the highest-leverage and lowest-cost pattern in event marketing, it is invisible to sponsor lists, and it only shows up in post text. Look for it specifically.
Awards and analyst placements belong in this map. They are the cheapest way to buy category credibility and competitors work them hard. A vendor can win an award at a conference without buying a booth there. Track them as a parallel channel with their own rows.
A company feed contains reshares. Employee and partner posts get reshared onto the company page. That is still a signal, but it is a weaker claim than a first-party announcement, and you attribute it accordingly. When a partner announced the sponsorship rather than the vendor, say so — it tells you who was more invested.
Absence is "not found," never "does not attend." You are reading a marketing feed, not an exhibitor database. A company can sponsor an event and never post about it. Write the negative finding as the limit of the harvest, then flag the high-value ones for confirmation against the event's own sponsor list.
Relative dates are approximate. LinkedIn returns ages, not timestamps. Convert to a month relative to today's date and mark the column as approximate. Do not manufacture exact dates you did not observe.
Two tests drive the shortlist. Conspicuous absence: every serious competitor is in a room and the brand is not, which is a story the competitors can tell for free. Uncontested ground: a room that fits the brand's ICP where no competitor appears at all. The first is defensive and usually urgent; the second is cheap and usually durable. Rank accordingly and say which test each recommendation came from.
Tie every recommendation to the brand's own loudest message. The sharpest finding in an event map is usually a mismatch: the campaign the brand runs everywhere, and the one room where that campaign's buyers gather, which the brand is not in. Look for it explicitly.
Quality gate
Before writing the file, check every line. Fix what fails; do not ship with a note.
- Every event row has at least one evidence link to the post or page it came from.
- Every event row records a commitment level, not just presence.
- First-party posts are distinguished from reshares.
- Dates derived from relative ages are marked approximate.
- The brand's own baseline was harvested, not assumed.
- Every absence is written as "not found in harvest," never as a claim about the competitor.
- Every shortlist entry names the test it came from and ties to specific evidence in the Events sheet.
- No event is recommended on category reputation alone. If no competitor evidence and no ICP fit exists, it does not go on the shortlist.
- The harvest tier is stated in the Overview, and partial coverage is labelled partial.
- The evidence log names what the harvest could not reach.
If you cannot satisfy a row honestly, write the gap into the doc. A named gap survives contact with a budget meeting; a confident guess does not.
Anti-patterns
| Do not | Instead |
|---|---|
| List the well-known conferences in the category | List only events with observed competitor evidence, and say who and when |
| Record "attended" for everything | Record the commitment level the post actually describes |
| Treat a search-indexed sample as a full feed | State the harvest tier and label partial coverage |
| Conclude a competitor skips an event | Write "not found in harvest" and flag it for confirmation |
| Recommend the biggest show in the category | Recommend against conspicuous absence or uncontested ground, and name which |
| Drop owned meetups and webinars | Track them — they are the cheapest programs and the most copyable |
| Ignore the brand's own current events | Harvest the baseline first; the gap is the deliverable |
| Present month-precise dates from relative ages | Mark the date column approximate |