Revenue webhooks tell you money moved. They do not tell you why you sent the email at 9:00 or that a partner thread went live while you were in a dentist chair. A marketing webhook drops a marker on your pulse timeline, same project as visitors and checkout, so next week’s retro does not devolve into “which Tuesday was the carousel?”
Part of the webhook ROI guides. Pair with marketing pulse pins and the guide on unified ingestion.
Markers vs money events
| Type | Example | Chart effect |
|---|---|---|
| Revenue | Stripe checkout.completed | Revenue line / feed |
| Visit | Pageview | Visitor line |
| Marker | campaign.sent | Vertical pin, label, optional date range |
Markers must never increment revenue. Confusing them corrupts RPV and makes you look silly in front of cofounders.
When to fire a marketing webhook
Good triggers:
- Newsletter provider send (Buttondown, Mailchimp automation HTTP step).
n8n/ Zapier after scheduled tweet thread posts (UTM automation naming).- Manual “big launch” button in internal admin before you post PH.
- Partner co-marketing email handed off.
Skip markers for:
- Every individual tweet (noise).
- Bot traffic spikes you did not cause.
- Test sends to yourself (tag
environment: test).
Payload shape (keep it boring)
{
"type": "campaign.marker",
"id": "newsletter_issue_48",
"label": "Newsletter #48, pricing myth",
"occurred_at": "2026-03-25T09:00:00Z",
"range_start": "2026-03-25T09:00:00Z",
"range_end": "2026-04-01T09:00:00Z",
"metadata": {
"utm_campaign": "newsletter_48",
"channel": "email",
"owner": "founder"
}
}id enables idempotency, resend same issue tag without duplicate pins. range_end optional for auto-suggested pin windows (pin newsletter send week).
Authenticate like revenue webhooks: shared secret header, HTTPS, reject replay.
Wiring from automation tools
Zapier: Webhooks by Zapier POST step after Mailchimp “Campaign Sent.” Map campaign name to label; map internal campaign id to id.
n8n: HTTP Request node; store secret in credentials; branch on failure to Slack.
GitHub Actions: On release published, POST marker release_v2_4, ties changelog traffic to version pin.
Do not put secrets in workflow YAML; use repo secrets.
Alignment with UTMs
Marker utm_campaign should match link tags in the send (UTM guide). Then breakdown by utm_source in weekly script lines up with pin label without forensic archaeology.
For thread carousels use utm_content per slide (utm_content for threads); marker can note thread_pricing_myth while each link differs.
Reading markers beside revenue lag
Newsletter markers at 9:00; traffic hump 9:03; revenue hump same day afternoon or D+3 for SaaS trial. Marker explains traffic; webhook revenue explains money: different clocks, same chart (detect campaign spikes).
Live launch day: marker for “PH live” plus live visitor view (live launch guide); watcher checks paths, not marker aesthetics.
Abuse and garbage prevention
- Rate limit marker endpoint per API key.
- Allowlist
typevalues. - Max label length 120 chars.
- Reject markers dated >1 day in future unless
scheduled: trueflag for planning.
Founders will accidentally POST loop in broken Zapier; idempotency saves you.
Markers without revenue webhooks yet
You can start with markers + traffic only while billing integration catches up. Order of operations:
- Tracker on site.
- Marketing markers for sends.
- Stripe/Paddle revenue webhooks.
Weekly script then gains revenue line later (weekly stats API) without redoing pin history.
Hybrid billing launches
When Paddle and Stripe both change checkout UI, POST marker checkout_migration_mar_2026 so traffic dip is interpreted correctly (Paddle + Stripe guide).
Privacy
Markers should not contain subscriber emails or PII lists. Campaign id and public title suffice.
Retro template (copy)
Pin: newsletter_48
Traffic vs baseline: +28% week of send
Revenue vs baseline: +11%
RPV: flat (more readers, same buyers)
Decision: repeat subject line pattern; tighten CTA on slide 3Markers make the pin name automatic in exports.
Multiple markers in one week
Dense launch weeks stack: newsletter Monday, partner blog Wednesday, PH Friday. Three markers beat one vague “launch week” pin because each channel has different lag to revenue. In retro, compare:
- Marker-to-traffic delay (minutes).
- Marker-to-first-checkout delay (hours or days).
- Whether overlapping markers blurred UTMs (fix naming next time).
If markers collide visually on chart, shorten range_end or use distinct colors in tool settings, cosmetic, but readability matters when you screenshot for cofounders.
Coordinating with live launch dashboard
Hour zero is not the time to debug Zapier. Pre-wire markers for known events (ph_launch_2026_q1, newsletter_48). Watcher sees marker + live traffic + paths together (live launch guides). Post-hoc markers (“we forgot to mark send”) are still useful, backdate occurred_at only if product allows and you document honesty in retro notes.
Legal and compliance footnotes
Markers are internal analytics events, not consent records. They do not replace email send logs required by ESPs. They do not prove GDPR legitimate interest. They simply align marketing actions with traffic curves so indie teams argue less.
Failure stories (learn cheap)
- Infinite Zap loop: 400 markers named
untitled; fix with idempotency and Zap filters. - Marker titled with subject line PII: “Congrats Sarah on your raise” in label; use campaign ids instead.
- Treating marker as revenue: RPV becomes nonsense; enforce
typeseparation in code review.
Checklist
- Marker type distinct from revenue in ingest
- Idempotent
idper campaign - UTMs match outbound links
- Automation failure alerts
- Test marker in staging project
Versioning campaign ids
Treat id like database primary keys: newsletter_48 not newsletter-latest. When you rerun a subject line test, use newsletter_49_subject_b instead of overwriting history. Overwrites make year-ago pins meaningless when you try to compare annual patterns.
Publish a one-page campaign dictionary in Notion linked from your UTM guide. Markers and UTMs should cite the same string.
Pairing markers with newsletter UTMs through redirects
Some ESPs strip query params on redirect chains. If your marker says newsletter_48 but traffic arrives as utm_campaign=undefined, the pin still saved the send moment, use it to debug tagging before blaming copy. Cross-read newsletter UTMs after redirects the same week you enable marketing webhooks.
Budgeting founder time
Wiring the first marketing webhook takes longer than writing the blog post about it, plan an afternoon. Maintenance is near zero if ids are stable. Compare that to weekly arguments about “which send was which” across twelve spreadsheet tabs. The ROI is argument reduction, not magic attribution.
Once markers work, your weekly founder script can list active pins automatically; you stop typing issue numbers by hand in Slack. Small automation compounds like interest, except you actually notice it.
If a marker misfires, delete or supersede it with a corrected id suffix rather than editing history silently. Your future self reviewing year-over-year sends will thank you for the paper trail.
Naming marketing events
Use the same utm_campaign string on the pulse marker and on outbound links that week, future you greps one token across tools. Mismatched names are how “email failed” becomes a week-long argument. Write the campaign slug in the calendar invite for the send, not only in analytics.