From event-marketing
Build and maintain a line-item budget for a single B2B marketing event — customer dinners, prospect happy hours, field events, executive retreats, ancillary tradeshow events, hackathons, curated VIP experiences. On first run either parses an uploaded budget spreadsheet or interviews the organizer to construct one. As the organizer drops spend evidence into the thread (PDF invoices, image invoices, screenshots of email receipts, or screenshots of bank/credit-card transactions — including bank-list screenshots with multiple transactions at once), the skill extracts vendor and total, auto-categorizes each into the right line item, and updates Projected / Actual / Variance numbers. Generates a read-only HTML view styled like a finance tracker. Use whenever a B2B event marketer is planning event spend, asking about budget, uploading or pasting an invoice/receipt/transaction screenshot, or asking "how much have we spent on X". Trigger on phrases like "budget", "event budget", "line items", "I have an invoice", "here's a receipt", "log this charge", "categorize this", "how much have we spent", "are we over budget", "screenshot of my Amex". Designed to live in a per-event folder alongside the workback-schedule skill so the same thread can run both. Do NOT trigger for personal-finance, company-wide opex, or non-event spend.
How this skill is triggered — by the user, by Claude, or both
Slash command
/event-marketing:budgetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Maintains a line-item budget for a single B2B marketing event. The budget lives in a per-event folder picked on first run; the same skill is invoked repeatedly across the planning window in a pinned thread to:
Maintains a line-item budget for a single B2B marketing event. The budget lives in a per-event folder picked on first run; the same skill is invoked repeatedly across the planning window in a pinned thread to:
budget.md in the event folder is the source of truth. budget.html is a generated view.
This skill is paired with workback-schedule in the same event folder. Each skill owns its own file and never writes to the other's.
Event budget
├── Category (e.g., Venue, F&B, Gifts & Swag)
│ ├── Line item (e.g., Location Rental, AV Equipment)
│ │ ├── Projected (allocated $)
│ │ ├── Actual (sum of invoices)
│ │ ├── Variance (Actual − Projected; negative = under budget)
│ │ ├── Comments (freeform)
│ │ └── Invoices (each with date, vendor, amount, file, confidence, note)
Variance convention: Variance = Actual − Projected. Negative means under budget (good). Positive means over budget (red).
| User intent | Operation |
|---|---|
| "Build a budget for X" / first run | create |
| "Where are we on spend?" / "Status" / no other instruction | status |
| User uploads or pastes an invoice (PDF / image / pasted text) | intake-invoice (auto-trigger) |
| "Move that invoice to " / "That's not Venue, it's F&B" | recategorize |
| "Bump to $X" / "Move $500 from X to Y" | reallocate |
| "Add a line item for under " | add-line |
| "Remove " | remove-line |
| "Add an invoice manually" (no file) | add-invoice |
| "Regenerate the HTML" | view |
| "Give me a stakeholder summary" / "Report" | report |
If invoked without context, default to status when there's an active budget, or create otherwise.
Same model as workback-schedule:
budget.md, switch to it.create, run the first-run flow (Step 2).If the workback-schedule skill has already established an active event folder in the thread, use that same folder — never create a parallel folder.
create)Ask all of these in a single follow-up — do not iterate one at a time. The user explicitly asked for this.
customer-dinner, prospect-happy-hour, field-event, ancillary-tradeshow, executive-retreat, hackathon, curated-experience (if a workback exists, read it from there)Acknowledge anything the user already provided in their original message; ask only for what's missing.
If no active event folder exists yet in the thread, ask the user for the parent directory and create:
<parent-dir>/<event-slug>/
budget.md
budget.html
assets/
invoices/ # uploaded invoice files land here
notes.md # placeholder shared with workback skill
Slug format: YYYY-MM-DD-<kebab-cased-event-name>, same as workback. If a workback folder already exists in this thread, reuse it — write budget.md and budget.html into the same folder, and create assets/invoices/ if missing.
Two paths — ask the user which they want, in the same batched question from 2a:
Path A — User uploads an existing budget (sheet, CSV, screenshot of Smartsheet/Excel, markdown table, pasted text)
Path B — Interview to build from scratch
assets/categories/<event-type>.md to get the standard category + line-item structure for this event type (Step 11).Misc / Contingency category if not already present.budget.md and generate budget.html.Always show the user the draft (compact markdown table) before writing the file. Wait for confirmation OR apply requested edits, THEN write budget.md and generate budget.html. Report the paths and a one-line summary: "Wrote budget.md with N categories and M line items totaling $X. View it at budget.html."
Accept: markdown tables, CSV/TSV, plain bullet hierarchies, Excel-like text dumps, screenshots, PDF exports of budget templates.
Extract per row:
For screenshots and PDFs, use the Read tool (it handles both). Transcribe rows into the canonical 3-level structure.
If a row is ambiguous (no clear category, or projected is non-numeric like "TBD"), surface it in a single batch and ask the user to resolve.
Numeric parsing: strip currency symbols, commas, and parens. Treat ($X) (parens) as negative.
---
event: CISO Dinner NYC
date: 2026-09-15
location: New York, NY
attendees: 25
currency: USD
total_budget: 25000
contingency_pct: 16
owner: vedha
created: 2026-05-18
vendor_categories:
"Le Bernardin": "Venue > Location Rental"
"Acme Signs": "Décor & Print > Signage"
"BoxFox": "Gifts & Swag > Branded gifts"
---
## Budget
### Venue
- Location Rental | projected: 8200 | comments: dinner private room
- AV Equipment | projected: 500 | comments:
- AV Staff | projected: 0 | comments:
- Wi-Fi | projected: 0 | comments:
### F&B
- Catering | projected: 6000 | comments:
- Beverages | projected: 2500 | comments: open bar
### Décor & Print
- Signage | projected: 400 | comments:
- Floral / centerpieces | projected: 800 | comments:
- Menus / printed materials | projected: 300 | comments:
### Gifts & Swag
- Branded gifts | projected: 2500 | comments: top 10 attendees
### Photography
- Photographer | projected: 800 | comments:
### Transportation
- Rideshare credits | projected: 600 | comments:
### Staffing
- Onsite event manager | projected: 1200 | comments:
### Misc / Contingency
- Contingency | projected: 1200 | comments: ~5% buffer
## Invoices
| Date | Vendor | Amount | Category | Line item | File | Confidence | Note |
|---|---|---|---|---|---|---|---|
| 2026-06-10 | Le Bernardin | 7500 | Venue | Location Rental | assets/invoices/le-bernardin-deposit.pdf | high | venue deposit (final) |
| 2026-06-15 | Acme Signs | 420 | Décor & Print | Signage | assets/invoices/acme-signs.pdf | high | |
## Notes
<freeform log>
Line item grammar:
- <line item name> | projected: <number> | comments: <text>
projected is in whole units of the budget's currency (no decimals, no $ sign in the file — formatted only in the HTML).comments may be empty.###). Line items are bullets under them.Invoices table:
Confidence is one of high, medium, low — set when the invoice is first categorized.File is a relative path inside the event folder (typically assets/invoices/<vendor-date>.pdf).Use Edit for incremental changes. Use Write only when generating fresh or doing a full rewrite.
Actual and Variance are derived — never stored in the markdown line. Always compute on read:
line_item.actual = sum of invoices.amount where invoice.line_item == this line item
line_item.variance = line_item.actual − line_item.projected
category.projected = sum of line_items.projected in this category
category.actual = sum of line_items.actual in this category
category.variance = category.actual − category.projected
total.projected = sum of categories.projected
total.actual = sum of categories.actual
total.variance = total.actual − total.projected
Negative variance = under budget = good. Positive variance = over budget = surface in red.
After every change to budget.md, regenerate budget.html.
Read the template at assets/budget-template.html (relative to this skill's folder). It contains a <script id="budget-data" type="application/json">{{DATA}}</script> placeholder.
JSON payload shape:
{
"event": {
"name": "CISO Dinner NYC",
"date": "2026-09-15",
"location": "New York, NY",
"attendees": 25,
"currency": "USD",
"currency_symbol": "$",
"owner": "vedha"
},
"categories": [
{
"name": "Venue",
"line_items": [
{
"name": "Location Rental",
"projected": 8200,
"actual": 7500,
"variance": -700,
"comments": "dinner private room",
"invoices": [
{ "date": "2026-06-10", "vendor": "Le Bernardin", "amount": 7500, "file": "assets/invoices/le-bernardin-deposit.pdf", "confidence": "high", "note": "venue deposit (final)" }
]
}
],
"subtotals": { "projected": 8700, "actual": 7500, "variance": -1200 }
}
],
"totals": { "projected": 25000, "actual": 7920, "variance": -17080 }
}
Per-row rendering in the HTML:
$X,XXX (no decimals if amounts are whole), or $X,XXX.XX if any non-integer amounts exist.Write the result to <event-folder>/budget.html. Tell the user the path and suggest open <path> on macOS to view.
The HTML view is read-only. All edits go through the skill via chat.
intake-invoice)This is the most common operation after create. The organizer drops an invoice (PDF, image, or pasted text) into the thread. Steps:
The user may share spend evidence in any of these forms — handle all of them:
| Input shape | What it looks like | Handling notes |
|---|---|---|
| PDF invoice | Formal invoice from a vendor with line items, totals, due dates | Most info-rich. Read with the Read tool; for >10 pages request pages: "1-3". |
| Image of an invoice | Photo or scan of a paper invoice | Read the file path with the Read tool (it handles images). |
| Screenshot of an email receipt | E.g., Stripe/Square/Shopify confirmation, Amazon/FedEx order email, restaurant receipt email | Look for "Receipt", "Order confirmation", "Payment received". Vendor is usually in the from-address or first line. |
| Screenshot of a bank or credit card transaction | Single transaction or a list view from a bank app, Mercury, Brex, Ramp, Amex, etc. | See "Transaction-string normalization" below. May contain multiple transactions — treat each as a separate invoice. |
| Pasted text | User pastes the text of a receipt or transaction into the chat | Same extraction rules; no file to copy in 7c. |
| Inline-attached image in the chat message | User drops an image directly into the conversation without saving it first | The image is visible in conversation context — extract from it directly. Before copying it into the event folder (7c), ask the user to save it OR offer to write it to assets/invoices/<slug>.png based on what you can see. |
Extract these fields from whichever shape was provided:
Transaction-string normalization (for bank/CC screenshots):
Merchant strings on bank statements often have processor prefixes and noise — strip these before matching:
| Pattern | Means | Strip / convert |
|---|---|---|
SQ *<NAME> or SQ* <NAME> | Square | Drop SQ * |
TST* <NAME> | Toast | Drop TST* |
SP <NAME> or SP* <NAME> | Shopify Payments | Drop |
PYP* <NAME> or PAYPAL *<NAME> | PayPal | Drop |
AMEX*, VISA* | Card brand | Drop |
<NAME> 0000-0000 | Trailing reference number | Drop trailing digits / dashes |
| All-caps with weird spacing | Bank formatting | Title-case and clean spacing |
<NAME> #1234 | Store / location number | Keep the name, drop the # — note location in Note if useful |
Examples: SQ *LE BERNARDIN NY → Le Bernardin. TST*ACME CATERING → Acme Catering. AMZN MKTP US*A1B2C → Amazon.
Batches: if a screenshot shows multiple transactions (e.g., a bank's transaction list view), parse each row as a separate invoice and process them as a batch — present all rows with their proposed categorization at once and ask the user to approve all / approve some / reject some, rather than asking one at a time.
If any required field can't be extracted with confidence, ask the user before proceeding. Don't silently guess. For inline-attached images, if visual quality is poor, ask the user to retype the vendor and amount.
Determine the right Category > Line item using this priority order:
vendor_categories[<vendor>] exists in frontmatter, use that. Confidence: high.For bank/CC screenshots and email receipts, downgrade confidence by one notch (high → medium, medium → low) unless the vendor is already in vendor_categories. Reason: these formats lack line items, so the merchant string alone is weaker evidence than a full invoice. A bank line that says "AMZN MKTP" could be swag, food, AV cables, or office supplies — ask if the line item isn't obvious from the workback or prior context.
Save the source file at <event-folder>/assets/invoices/<slug>.<ext>. Slug: <vendor-kebab>-<YYYY-MM-DD> plus a type suffix when it's not a full invoice — e.g., le-bernardin-2026-06-10.pdf, acme-catering-2026-07-02-receipt.png, amex-2026-08-15-statement.png. The suffix helps the organizer find context later when expanding a line item in the HTML.
File blank. Don't silently invent a file.File blank.assets/invoices/amex-2026-08-15-statement.png). The HTML will link all of them to the same screenshot.Add a new row to ## Invoices in budget.md with all extracted fields and the chosen Category > Line item.
Always surface the decision so the user can correct:
Logged invoice from Le Bernardin for $7,500 on 2026-06-10. Categorized as Venue > Location Rental (confidence: high). If that's wrong, say "move it to > ".
If confidence is low, phrase it as a question instead of a statement:
I see an invoice from Acme LLC for $1,200. I can't tell from the invoice alone whether this is Venue > AV Equipment or AV & rentals. Which line item should it go under?
After writing budget.md, regenerate budget.html. In the response, mention if this invoice flipped any line item or category from under-budget to over-budget — that's the kind of thing the organizer needs to know immediately.
recategorize)When the user corrects a categorization:
vendor_categories[<vendor>] in frontmatter to point to the corrected Category > Line item. Next invoice from that vendor will use the corrected category with high confidence.reallocate — Change projected on a line item, or move dollars between line items. Confirm before applying if it changes total budget. Show before/after variance for the affected lines.add-line — Add new line item under an existing category, OR add a new category. Ask for projected amount (default 0). Insert in alphabetical-within-category order unless user specifies position.remove-line — Refuse if invoices are attached to that line item — ask user to first recategorize those invoices or confirm deletion of both. Log the removal in notes.md.statusDefault response when invoked with no specific instruction. Show:
budget.htmlreportStakeholder-friendly markdown summary, suitable for pasting into a status update:
# CISO Dinner NYC — Budget as of 2026-07-20
Event date: 2026-09-15 (57 days out)
Total budget: $25,000
Spent to date: $7,920 (32%)
Remaining: $17,080
Variance: −$17,080 (under)
Over budget (0):
— none —
At risk (>80% used) (1):
- Venue > Location Rental: $7,500 of $8,200 (91%)
Largest spends so far:
1. Le Bernardin (Venue) — $7,500
2. Acme Signs (Décor) — $420
Full breakdown: <event-folder>/budget.html
When no upload is provided, load assets/categories/<event-type>.md (relative to this skill's folder) and use the recommended structure.
Template format:
# Customer Dinner — budget categories
Default 3-level structure for a customer dinner. Percentages are starting suggestions of total budget.
- Venue (~35%)
- Location Rental
- AV Equipment
- AV Staff
- Wi-Fi
- F&B (~28%)
- Catering (~75% of F&B)
- Beverages (~25% of F&B)
...
Available templates:
customer-dinner.mdprospect-happy-hour.mdfield-event.mdancillary-tradeshow.mdexecutive-retreat.mdhackathon.mdcurated-experience.mdWhen applying a template:
~% of the user's total budget.Tell the user which template was used and that they should review for things specific to this event.
The workback-schedule skill lives in the same event folder. The budget skill should:
workback.md if it exists, to align categories/line items with cost-relevant workback tasks (venue deposit, swag order, etc.).workback.md.status if a workback task is overdue and the corresponding budget line still has $0 actual.The budget has a single currency (set in frontmatter). If an invoice comes in a different currency, ask the user:
Default to asking; don't silently convert.
assets/invoices/.workback.md.npx claudepluginhub zuddl/claude-plugin-event-marketingCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.