feat: sponsor outreach email system with CRM pipeline #316
Labels
No labels
domain:backend
domain:devops
domain:frontend
status:approved
status:in-progress
status:needs-fix
status:qa
type:bug
type:devops
type:feature
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
forgejo_admin/basketball-api#316
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Type
Feature
Lineage
Standalone — discovered from Marcus's manual sponsor email campaign (GroupMe stakeholders chat, 2026-04-03). Maps to WS-S14 on project-westside-agency and sponsor-agent (pathway #8).
Repo
forgejo_admin/basketball-apiUser Story
As an admin,
I want to send branded sponsorship outreach emails to local businesses and track their response status,
So that I can build partnerships and funding for the program without manually copy-pasting emails.
Context
Marcus has been manually copy-pasting 4 email template variants to 50+ local businesses (restaurants, banks, construction companies, tire shops, etc.) asking for sponsorships. He has a tiered sponsorship model ($500-$5,000+) and categorizes businesses by type (food, financial, retail, automotive, construction, fitness, dental, grocery).
The platform already has MJML email infrastructure (templates, gmail-sdk, email logging, load_email_template) but it only targets internal contacts (parents/players). This feature extends the email system to external business contacts with a proper CRM-like pipeline.
Design spec:
docs/superpowers/specs/2026-04-03-sponsor-outreach-system-design.md(in pal-e-platform)File Targets
Files the agent should modify or create:
src/basketball_api/models.py— Sponsor model, SponsorStatus/SponsorCategory enums, EmailType additionsrc/basketball_api/services/sponsor_service.py— new: CRUD, blast logic, category pitch defaults, rate-limited sendingsrc/basketball_api/routes/sponsors.py— new: REST endpoints (CRUD + blast + seed)src/basketball_api/app.py— register sponsor routeralembic/versions/xxx_add_sponsors.py— migration: sponsors table + EmailType enum updatetests/test_sponsors.py— new: model, CRUD, blast endpoint testsFiles the agent should NOT touch:
src/basketball_api/services/email.py— existing email service; sponsor_service.py imports from here but doesn't modify itsrc/basketball_api/routes/admin.py— sponsor routes are their own routerAcceptance Criteria
Test Expectations
pytest tests/test_sponsors.py -vConstraints
Checklist
Related
project-westside-agency— sponsor-agent is pathway #8project-westside-basketball— parent projectarch-email— email system architecturesop-email-send— email approval workflow