
Subject Line
"Your boost to {{ contact.schoolteam|default("your team") }} went through"
Trigger
Immediately after a one-time boost is processed
Timing
Real-time
Goal
Confirm the gift, provide a receipt, and plant the seed to go monthly.
Technical Trigger
stripe.payment_intent.succeeded (one-time) -> enqueue donor email with {donor_id, team_id, amount, charge_id}Subject Line
"One boost is great. Monthly changes the season for {{ contact.schoolteam|default("your team") }}."
Trigger
3 days after a one-time boost
Timing
3 days post-boost
Goal
Convert one-time boosters into recurring monthly supporters.
Technical Trigger
scheduled_job: donor.last_boost_at <= now - 3d AND has_active_subscription = falseSubject Line
"{{ contact.schoolteam|default("your team") }} needs you all season, not just today"
Trigger
10 days after a one-time boost (still not monthly)
Timing
10 days post-boost
Goal
Make the case that a single boost fades - monthly sustains the whole season.
Technical Trigger
scheduled_job: donor.last_boost_at <= now - 10d AND has_active_subscription = falseSubject Line
"Last chance to turn your boost into monthly"
Trigger
21 days after a one-time boost (still not monthly)
Timing
21 days post-boost
Goal
Final conversion push with urgency and a simple one-tap upgrade link.
Technical Trigger
scheduled_job: donor.last_boost_at <= now - 21d AND has_active_subscription = falseSubject Line
"You're in. Here's what happens next for {{ contact.schoolteam|default("your team") }}"
Trigger
Immediately after first monthly gift is set up
Timing
Real-time
Goal
Welcome recurring donors, explain what they unlocked, set expectations.
Technical Trigger
stripe.invoice.paid (first cycle) OR stripe.subscription.created -> donor.is_recurring = trueSubject Line
"Your monthly boost to {{ contact.schoolteam|default("your team") }} processed"
Trigger
Each successful monthly charge
Timing
Monthly
Goal
Provide a recurring receipt and keep the donor informed of ongoing support.
Technical Trigger
stripe.invoice.payment_succeeded WHERE subscription_id IS NOT NULLSubject Line
"Season update from {{ contact.schoolteam|default("your team") }}"
Trigger
Monthly during the active season
Timing
Monthly (in-season)
Goal
Keep donors connected with team news, photos, and progress toward the goal.
Technical Trigger
scheduled_job: team.season_status = "active" AND day_of_month = 1 -> send to all active donors on teamSubject Line
"It's game day - {{ contact.schoolteam|default("your team") }} needs you"
Trigger
Morning of a scheduled game/match
Timing
Game days
Goal
Drive engagement on game days and remind donors who they are supporting.
Technical Trigger
scheduled_job: team.games WHERE game_date = today -> send to donors who opted into game alertsSubject Line
"We hit the goal - thank you for boosting {{ contact.schoolteam|default("your team") }}"
Trigger
When the team hits its funding goal
Timing
Event-based
Goal
Celebrate the win with donors and thank them for making it happen.
Technical Trigger
event: team.raised_total >= team.funding_goal -> broadcast to all donors on teamSubject Line
"Your year of impact for {{ contact.schoolteam|default("your team") }}"
Trigger
End of calendar year / season
Timing
Annual
Goal
Show cumulative impact and motivate a year-end or next-season gift.
Technical Trigger
scheduled_job: date = Dec 31 OR team.season_end_date -> aggregate donor.gifts_total for yearSubject Line
"Still cheering for {{ contact.schoolteam|default("your team") }}?"
Trigger
No donation or page visit in 60 days
Timing
60 days inactive
Goal
Re-engage lapsed donors with team updates and a soft ask.
Technical Trigger
scheduled_job: donor.last_activity_at <= now - 60d AND donor.status = "active"Subject Line
"Share {{ contact.schoolteam|default("your team") }}'s page with 5 people"
Trigger
1 week after a boost if the page was not shared
Timing
7 days post-boost
Goal
Encourage donors to spread the word and bring in more supporters.
Technical Trigger
scheduled_job: donor.last_boost_at = now - 7d AND donor.shared_page = falseSubject Line
"Ready to do more for {{ contact.schoolteam|default("your team") }}?"
Trigger
3 months into a recurring donation
Timing
3 months recurring
Goal
Ask engaged monthly donors to increase their monthly gift.
Technical Trigger
scheduled_job: subscription.created_at <= now - 90d AND subscription.status = "active"Subject Line
"Happy birthday from booster"
Trigger
On the donor birthday
Timing
Annual
Goal
Build a personal connection with a birthday note and a soft team-page link.
Technical Trigger
scheduled_job: donor.birth_month = current_month AND donor.birth_day = current_daySubject Line
"Know another team that needs a fundraiser?"
Trigger
2 weeks after a boost
Timing
14 days post-boost
Goal
Turn happy donors into advocates by asking them to refer other teams or fans.
Technical Trigger
scheduled_job: donor.last_boost_at = now - 14dSubject Line
"Your monthly boost needs a quick update"
Trigger
When a monthly charge fails
Timing
Event-based
Goal
Notify the donor, explain the issue, and provide a link to update their card.
Technical Trigger
stripe.invoice.payment_failed -> include retry_date and update_payment_linkSubject Line
"Your card ends soon - keep your boost going"
Trigger
30 days before a stored card expires
Timing
Pre-expiry
Goal
Prevent churn by prompting donors to update expiring cards before they lapse.
Technical Trigger
scheduled_job: payment_method.exp_month/yr within 30d -> send update-card linkSubject Line
"Your {{ year }} tax receipt from booster"
Trigger
End of calendar year
Timing
Annual
Goal
Deliver a consolidated tax-deductible receipt for the full year of giving.
Technical Trigger
scheduled_job: date = Jan 15 -> compile donor.tax_total for prior calendar yearSubject Line
"New boost on {{ contact.schoolteam|default("your team") }} - {{ amount }}"
Trigger
Real-time when a donation lands
Timing
Real-time
Goal
Keep coaches/ADs informed of every donation as it happens.
Technical Trigger
stripe.payment_intent.succeeded -> page_owner_id lookup -> push notification + emailSubject Line
"Your weekly fundraising digest - {{ contact.schoolteam|default("your team") }}"
Trigger
Every Monday morning
Timing
Weekly
Goal
Summarize the week: total raised, number of donors, and momentum vs goal.
Technical Trigger
scheduled_job: weekday = Monday 09:00 ET -> aggregate team.donations for prior 7 daysSubject Line
"Connect Stripe to start accepting donations"
Trigger
Page created but Stripe not connected
Timing
1, 3, 7 days after signup
Goal
Push page owners to connect Stripe so their page can accept donations.
Technical Trigger
scheduled_job: page.stripe_account_id IS NULL AND page.created_at age in {1d, 3d, 7d}Subject Line
"Finish your team page to raise more"
Trigger
Page missing photo, story, or goal
Timing
3 days after signup
Goal
Prompt owners to finish their page so it converts visitors into donors.
Technical Trigger
scheduled_job: page.completeness_score < 100% AND page.created_at <= now - 3dSubject Line
"Funds are on the way to your account"
Trigger
When a Stripe payout processes
Timing
Event-based
Goal
Confirm funds are on the way and build trust in the platform.
Technical Trigger
stripe.payout.paid -> look up connected account -> notify page ownerSubject Line
"Your payout needs attention"
Trigger
When a Stripe payout fails
Timing
Event-based
Goal
Alert owners to resolve bank/account issues so funds are not delayed.
Technical Trigger
stripe.payout.failed -> page owner alert with failure_reason + resolve linkSubject Line
"Milestone reached - {{ percent }}% of your goal"
Trigger
At 25%, 50%, 75%, and 100% of funding goal
Timing
Event-based
Goal
Celebrate progress and prompt owners to share the milestone with supporters.
Technical Trigger
event: team.raised_total crosses {0.25, 0.50, 0.75, 1.0} * team.funding_goalSubject Line
"No donations in 2 weeks - here's how to fix it"
Trigger
No donations in 14 days
Timing
14 days no activity
Goal
Nudge owners to re-share their page and re-engage their community.
Technical Trigger
scheduled_job: team.last_donation_at <= now - 14d AND team.season_status = "active"Subject Line
"Season starts soon - refresh your page"
Trigger
2 weeks before season start
Timing
Pre-season
Goal
Remind owners to refresh their page and launch a new fundraising push.
Technical Trigger
scheduled_job: team.season_start_date - 14d = todaySubject Line
"Your top supporters this month"
Trigger
Monthly
Timing
Monthly
Goal
Show owners their top supporters and suggest personal thank-you outreach.
Technical Trigger
scheduled_job: day_of_month = 1 -> query top 3 donors by amount for teamSubject Line
"Post your page this week to reach new donors"
Trigger
Weekly during the active season
Timing
Weekly (in-season)
Goal
Encourage owners to post their page link on socials to reach new donors.
Technical Trigger
scheduled_job: weekday = Friday AND team.season_status = "active"Subject Line
"Your page has been quiet - let's change that"
Trigger
No page edits or shares in 30 days
Timing
30 days inactive
Goal
Re-engage dormant owners with tips and a fresh push to grow donations.
Technical Trigger
scheduled_job: page.last_edited_at <= now - 30d AND page.last_shared_at <= now - 30dSubject Line
"Season recap - {{ contact.schoolteam|default("your team") }}"
Trigger
End of the team season
Timing
End of season
Goal
Summarize season totals, thank donors, and set up next season fundraising.
Technical Trigger
scheduled_job: team.season_end_date = today -> compile season totals + donor list