Measured by reading every app’s source, not from memory. Two rails doing two different jobs — and the distinction between them is the thing to get right.
| Rail | Job | Where it runs today |
|---|---|---|
| Resend | Transactional email — sending mail to anyone | 15 of 16 apps |
| SureContact | Boom’s own CRM — people who might become Boom customers | 2 places: boommedia.us and BOO |
All 13 SaaS apps have their own src/lib/email.ts
and send through Resend, as do BOO and bm-portal. There is no second provider to consolidate and
nothing to migrate — the rail already is what you wanted it to be.
bm-vercel sends through nodemailer and a Gmail account, not Resend — the only app in the estate that does. So the site most likely to email a prospect is the one with the weakest deliverability and no delivery logs.
Gmail SMTP also carries send limits and throttles silently. Moving it to Resend is contained, and it would bring the shared branded template along with it.
The obvious reading is that this is a gap to close. It is not. A lead captured by a client’s Replyee bot belongs to the client, not to Boom. Pushing it into Boom’s CRM would mix your prospects with your clients’ customers and leave you holding their contact data with no basis for it.
The question that settles every case: is this a potential Boom customer, or the client’s customer? Only the first belongs in SureContact.
| Surface | Whose lead? | Goes to |
|---|---|---|
| boommedia.us contact / audit / careers | Boom’s | SureContact |
| Replyee chat on boommedia.us | Boom’s | SureContact (wired 29 Jul) |
| BOO signup / checkout / contact | Boom’s — a restaurant becoming a customer | SureContact |
| Replyee chat on a client site | The client’s | Client portal webhook |
| A diner ordering food on BOO | The restaurant’s | Stays in BOO |
| Localey reviews, Rewardee members | The client’s | Stays in the app |
You own both lifetime deals. This guide maps out every high-value use case across your 10 SaaS products and Boom Online Ordering — so nothing sits idle.
SureContact is a full-featured email marketing platform and CRM. It handles contact lists, broadcast campaigns, multi-step automation sequences, and revenue tracking. It was built with WordPress in mind but connects to any app via SMTP, webhooks, and Ottokit.
Ottokit is a Zapier alternative with 1,000+ integrations and a key advantage: it's MCP-native, meaning Claude (this AI) can directly trigger Ottokit automations in real time. Events in your Next.js apps fire webhooks → Ottokit routes them to SureContact, Slack, Google Sheets, Stripe, and more — no code needed.
execute_integration_action — Claude runs one-off actions without full automationsSureContact handles the email side (lists, campaigns, sequences). Ottokit is the glue that connects your apps to SureContact — and to everything else. The power is in the combination: events in your Next.js apps trigger Ottokit workflows that update SureContact, log data, and notify your team — all without you touching a line of code.
| App | Trigger Event | Action(s) | Tools | Priority |
|---|---|---|---|---|
| Boom Ordering | New order placed | Send order confirmation email to customer Log order to Google Sheets Slack alert to kitchen staff |
OttokitSureContact | ★ Critical |
| All Apps | New user signup | Add to SureContact list (by product) Trigger onboarding email sequence Slack notification to you |
OttokitSureContact | ★ Critical |
| All Apps | Stripe — subscription cancelled | Move contact to "Churned" list in SureContact Trigger 3-email win-back sequence Log churn with reason to Sheets |
OttokitSureContact | ★ Critical |
| All Apps | Stripe — plan upgraded | Move to new plan list in SureContact Send "Welcome to [Plan]" email Log upgrade event to Sheets |
OttokitSureContact | ★ Critical |
| Signnee | Document signed | Email both parties completion confirmation Log to Sheets with timestamp Update Supabase doc status |
OttokitSureContact | ★ Critical |
| Dashee | Invoice unpaid after 7 days | Trigger payment reminder email via SureContact | OttokitSureContact | Medium |
| Aprovee | Client leaves annotation | Instant email to agency designer with comment text and link | OttokitSureContact | Medium |
| Aprovee | Project approved by client | Congratulations email to agency Log approval to Sheets Optional: Slack notification |
OttokitSureContact | Medium |
| QRcodee | QR code hits 1,000 scans | Send milestone congratulations email with analytics summary | OttokitSureContact | Medium |
| Rankee | SEO audit completes | Email user with link to results and top 3 recommendations | OttokitSureContact | Medium |
| Replyee | Bot hits conversation limit | Upgrade prompt email — "You've had 500 conversations this month" | OttokitSureContact | Medium |
| All Apps | User inactive 14 days | SureContact re-engagement sequence — 2 emails, if no open → tag as at-risk | SureContact | Medium |
| Boom Ordering | Restaurant no orders in 30 days | SureContact automated check-in + tips email to restaurant owner | SureContact | Low |
| Displayee | Screen goes offline | Immediate email alert + optional SMS via Ottokit → Twilio | OttokitSureContact | Low |
| Bloggy | Post published to WordPress | Confirmation email to agency with live URL Optional: log to content calendar Sheets |
OttokitSureContact | Low |
| Email Type | SureContact | Resend | Recommendation |
|---|---|---|---|
| Password reset / magic link | Via Supabase SMTP config | Native — works out of box | Keep Resend — Supabase auth emails are already wired |
| Order confirmation | Excellent — SMTP or API | Works fine | Switch to SureContact — get revenue tracking + no cost |
| Welcome email (1 email) | Yes — with SureContact list | Simple with Resend | Use SureContact — user lands in your CRM automatically |
| Onboarding sequence (5+ emails) | Built for this | Requires custom code | SureContact — no contest |
| Win-back / churn campaigns | Visual builder, conditions | Not designed for this | SureContact — no contest |
| Newsletter / broadcast | Built for this | Not a broadcast tool | SureContact — no contest |
| Document signed / app alert | Via Ottokit trigger | Direct API call | Either — use Ottokit → SureContact to avoid code per product |
| Webhook-triggered notification | Via Ottokit | Requires custom API route | Ottokit → SureContact — no code needed |
Configure lists, SMTP, and your first automation sequence
Connect your apps to SureContact and build your first trigger
// lib/ottokit.ts — call this anywhere in your server code const OTTOKIT_WEBHOOK = process.env.OTTOKIT_WEBHOOK_URL export async function fireOttokit( event: 'user.signup' | 'user.cancelled' | 'order.placed' | string, payload: Record<string, unknown> ) { if (!OTTOKIT_WEBHOOK) return await fetch(OTTOKIT_WEBHOOK, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event, ...payload, timestamp: new Date().toISOString() }), }) }
// app/api/auth/signup/route.ts import { fireOttokit } from '@/lib/ottokit' export async function POST(req: Request) { const { email, name } = await req.json() // ... your existing signup logic ... // Fire to Ottokit → adds to SureContact list → triggers welcome sequence await fireOttokit('user.signup', { email, name, product: 'dashee', // Ottokit uses this to route to the right list plan: 'free', }) return Response.json({ success: true }) }
// app/api/webhooks/stripe/route.ts (add alongside your existing Stripe handler) import { fireOttokit } from '@/lib/ottokit' const EVENT_MAP: Record<string, string> = { 'customer.subscription.deleted': 'user.cancelled', 'customer.subscription.updated': 'user.upgraded', 'invoice.payment_failed': 'payment.failed', } // Inside your existing Stripe webhook handler, add: const ottokitEvent = EVENT_MAP[stripeEvent.type] if (ottokitEvent) { await fireOttokit(ottokitEvent, { email: customer.email, plan: subscription.items.data[0].price.nickname, product: subscription.metadata?.product ?? 'unknown', stripeId: customer.id, }) }
# One Ottokit webhook URL per automation you build OTTOKIT_WEBHOOK_URL=https://connect.ottokit.com/webhook/your-id-here # If also using SureContact SMTP directly (optional — for transactional only) SURECONTACT_SMTP_HOST=smtp.yourprovider.com SURECONTACT_SMTP_USER=your-smtp-user SURECONTACT_SMTP_PASS=your-smtp-pass
OTTOKIT_SIGNUP_URL, OTTOKIT_CANCEL_URL, OTTOKIT_ORDER_URL — so Ottokit can route to the right workflow and the right SureContact list.
| Week | Task | Tool | Why First |
|---|---|---|---|
| Week 1 | Set up SureContact: create product lists, configure SMTP provider, write welcome email for Dashee and Boom Ordering | SureContact | Every new user from day 1 enters your CRM — retroactive contact lists are hard |
| Week 1 | Connect Stripe to Ottokit. Build "Stripe cancel → SureContact Churned list" automation | Ottokit | Churn recovery is highest revenue impact — every cancelled user costs money |
| Week 2 | Add fireOttokit('user.signup', ...) to signup routes in Dashee and Boom Ordering |
Ottokit | These two products have the most active users — highest impact fastest |
| Week 2 | Build 5-email onboarding sequence in SureContact for Dashee users | SureContact | Onboarding sequences increase activation and reduce churn — biggest retention lever |
| Week 3 | Add signup webhook to remaining SaaS products (Addee, QRcodee, Rankee, etc.) | Ottokit | Copy-paste work — 15 min per app once the pattern is in place |
| Week 4 | Build Signnee document-signed automation and Aprovee comment notification | Ottokit | These are high-value user moments — real-time notifications drive engagement |