Skip to content

Promotion campaigns: promote first, measure 30 days, then outreach with the results (0.5.0) - #25

Merged
ralyodio merged 1 commit into
mainfrom
feat/promotion-campaigns
Oct 17, 2026
Merged

ralyodio merged 1 commit into
mainfrom
feat/promotion-campaigns

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Implements the Los Gatos Builders Promotion and Outreach PRD as a feature of the pit.world pro directory, which already lists the 99 campaign builders.

What it adds

  • Snapshot import from OutreachGraph campaign cmp_w12ps27dw6pecnja9n90pc7h94 (the exporter is scripts/outreachgraph-campaign-export.sh, read-only: OutreachGraph has no complete members API). Every row gets one disposition. Merges by domain, imports are idempotent, and a business that leaves keeps its listing.
  • An outreach hold gate, campaign priority in /pros (applied in SQL before pagination), /roundup/<slug>, a spotlight calendar and the myna worker. The worker reconciles before posting and verifies through public APIs, and it only does organic posts.
  • Measurement with no cookies and no stored IPs. Per-business 30-day windows, versioned reports (shareable /r/<token>), CSV comparison and report-based drafts. Sending stays off until it is authorized.
  • API /api/v1/promotion/*, the /admin/promo dashboard, pit promo CLI + TUI, and promo_* MCP tools (only when PIT_ADMIN_TOKEN is set).
  • The privacy page now says what listing measurement keeps.

Tests: 28 new in test/promotion.test.ts, mapped to PRD AC-01..AC-22. They use simulated time across the 2026-11-01 DST change and a fake myna for no-double-post and uncertain-outcome reconciliation. 136/136 pass, tsc clean, threatcrush clean.

🤖 Generated with Claude Code

…r 30 days, then draft outreach with the results (0.5.0)

- Import a complete OutreachGraph campaign snapshot (scripts/outreachgraph-campaign-export.sh):
  every source row gets one disposition, leads at one domain merge into one business, re-imports
  are idempotent, only a complete snapshot can mark a business as having left.
- Members launch only when upstream outreach is held (suppressed, or only in approval campaigns).
- Verified members of a running campaign come first in /pros, in SQL before pagination.
- /roundup/<slug>, a posting calendar of spotlights handed to myna by `pit promo worker`, which
  reconciles against myna history/queue by tracking id before posting and verifies through the
  networks' public APIs. Organic only: ad-buying networks are refused, paid budget defaults to zero.
- Measurement without cookies or stored IPs: listing views, website clicks (/b/<d>/go redirect to the
  listing's own site), phone taps (beacon), quote requests; bots, previews, prefetches, internal and
  marked test traffic excluded; day-salted visitor hash. Roundup views stay campaign-level.
- Per-business 30-day windows (listing live + tracking tested + verified placement), hourly pass,
  one review job per window, versioned reports (HTML/Markdown/JSON, shareable /r/<token>), CSV
  comparison, report-based drafts (introduction vs follow-up from recorded contact), sending off
  until authorized and re-checked at delivery.
- API /api/v1/promotion, /admin/promo dashboard, `pit promo` CLI + TUI, promo_* MCP tools.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 370930c into main Oct 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant