Resend (email) shares SweepOps' API key. WordPress receives city page drafts. Google GBP / Facebook still optional — use Export / Ship for social.
Uses the same Resend account as SweepOps (apps/web). No second account. Outreach, bid packages, and approved emails send as SweeperGuys <matt@sweeperguys.com> · reply-to matt@sweeperguys.com (from MARKETING_FROM_EMAIL).
Using SweepOps Resend account. Live send when key present; keys are often send-only (cannot list domains).
# apps/marketing-account/.env.local (copy key from apps/web) RESEND_API_KEY=re_… # same as SweepOps MARKETING_FROM_EMAIL=SweeperGuys <matt@sweeperguys.com> MARKETING_REPLY_TO=matt@sweeperguys.com # optional fallback if MARKETING_FROM_EMAIL unset: RESEND_FROM=SweepOps <matt@sweeperguys.com> # open/click tracking (from Resend → Webhooks → signing secret) RESEND_WEBHOOK_SECRET=whsec_…
Open / click tracking: In Resend → Domains, enable Open tracking + Click tracking. Then Webhooks → add endpoint:
https://marketing.sweeperguys.com/api/webhooks/resend Events: email.sent, email.delivered, email.opened, email.clicked, email.bounced, email.complained Copy signing secret → RESEND_WEBHOOK_SECRET=whsec_… in .env.local → restart app
Until the secret is set, opens stay at 0 and open-bumps cannot fire from real open data. Opens are imperfect (image blocking / Apple privacy).
| When | To | Subject | Status |
|---|---|---|---|
| 7/21/2026, 9:09:52 PM PDT | publicworks@cityofmissionviejo.org | SweeperGuys rates for Mission Viejo 2026 Slurry Seal bid | opened |
| 7/21/2026, 8:55:49 PM PDT | publicworks@eastvaleca.gov | Street sweeping for Eastvale 2026 Asphalt Overlay bid | opened |
| 7/21/2026, 8:55:07 PM PDT | info@sully-miller.com | Track-out sweeping support for Sully-Miller in Brea | opened ×3 |
| 7/21/2026, 8:54:15 PM PDT | servpro9344@verizon.net | Proposal for Construction Track-Out & Street Sweeping Servic… | sent |
| 7/21/2026, 8:53:59 PM PDT | publicworks@fountainvalley.gov | Newhope St Rehabilitation – Street Sweeping Support | opened |
| 7/21/2026, 8:53:56 PM PDT | procurementcontracting@palmspringsca.gov | Street Sweeping Support for Palm Springs 2026 Slurry Seal | opened |
| 7/21/2026, 7:16:41 PM PDT | matt@sweeperguys.com | [Marketing Account] Resend test 2026-07-22T02:16 | delivered |
| 7/21/2026, 7:04:09 PM PDT | matt@sweeperguys.com | [Marketing Account] Resend test 2026-07-22T02:04 | sent |
| 7/21/2026, 5:13:48 PM PDT | matt@sweeperguys.com | [Marketing Account] Resend test 2026-07-22T00:13 | delivered |
| 7/21/2026, 4:34:40 PM PDT | matt@sweeperguys.com | [Marketing Account] Resend test 2026-07-21T23:34 | sent |
| 7/21/2026, 4:24:25 PM PDT | matt@sweeperguys.com | [Marketing Account] Resend test 2026-07-21T23:24 | sent |
| 7/21/2026, 3:29:03 PM PDT | matt@sweeperguys.com | [SG Marketing] Brief 2026-07-21 · 12 bids · 0 seq · 0 approv… | sent |
With your go-ahead: the app deep-searches missing emails, drafts with Grok, and sends via Resend — no Approvals click. Daily caps: 15 sends, 8 research lookups. Bounce → DNC. Keep pnpm --filter @sweepops/marketing-account cron:daemon running (09:00 automation + 06:30 brief).
FULL_AUTO_EMAIL=true EMAIL_DAILY_CAP=15 EMAIL_RESEARCH_CAP=8 SEQUENCE_AUTO_SEND=true OPEN_BUMP_AUTO_SEND=true MORNING_BRIEF_TO=matt@sweeperguys.com AUTOMATION_CRON_ENABLED=true
Results land on Emails — you should not need to babysit Pipeline daily.
Uses WordPress Application Passwords (not your main login in the browser). Grok generates content; this app publishes pages live via REST API. Pages are not added to the header dropdown by us — only if WP auto-add is on, or you add them under Appearance → Menus.
City pages publish as children of Our Locations so they stay out of the header dropdown. Still turn off auto-add: WP Admin → Appearance → Menus → open the Home menu → uncheck Automatically add new top-level pages to this menu → remove stray items → Save.
# apps/marketing-account/.env.local WORDPRESS_URL=https://sweeperguys.com WORDPRESS_USER=your-wp-admin-username WORDPRESS_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
WP Admin → Users → your user → Application Passwords → add name “Marketing Account” → copy password into .env.local → restart pnpm --filter @sweepops/marketing-account dev.
Google Voice (949) 484-6315 port to Twilio is in progress. Until complete, AI answers on (949) 989-5934. When Twilio marks the port Completed:
/api/voice/incomingTWILIO_VOICE_NUMBER=+19494846315 in .env.local# Business hours (Pacific) — transfers only while open; rates always work SECRETARY_HOURS=7-18 SECRETARY_WEEKENDS=false SECRETARY_TZ=America/Los_Angeles
REST + OAuth scaffold is ready in src/lib/dodge-api.ts. Until Dodge enables access, keep using CSV on Import.
# When Dodge sends credentials: DODGE_CLIENT_ID= DODGE_CLIENT_SECRET= DODGE_TOKEN_URL= DODGE_API_BASE_URL= # optional: DODGE_SCOPES=
2-6314000041503 approved → then Refresh listingsWHEN-YOU-RETURN-APIS.mdAfter connect, your 3 Sweeper Guys listings should appear here.
Email: see Resend section above (shared with SweepOps). Without the key, emails export to data/exports/outbound-email/.
| Platform | Status | Auto | Env keys | Notes |
|---|---|---|---|---|
| Google Business Profile gbp | needs_auth | GOOGLE_GBP_ACCESS_TOKEN: missing GOOGLE_GBP_ACCOUNT_ID: missing GOOGLE_GBP_LOCATION_ID: missing | Primary local pack. Optimize + post weekly. | |
| Facebook Page facebook | needs_auth | META_PAGE_ACCESS_TOKEN: missing META_PAGE_ID: missing | Meta Graph API page publish | |
| Instagram Business instagram | needs_auth | META_PAGE_ACCESS_TOKEN: missing INSTAGRAM_BUSINESS_ACCOUNT_ID: missing | Requires IG Business linked to FB Page + image for most posts | |
| X (Twitter) x | needs_auth | X_API_BEARER_TOKEN: missing X_API_KEY: missing X_API_SECRET: missing X_ACCESS_TOKEN: missing X_ACCESS_SECRET: missing | X API v2 tweet create | |
| The Blue Book Building & Construction Network bluebook | export_only | — | No public API — Grok prepares listing copy + outreach pack for manual/portal paste | |
| LinkedIn Company linkedin | needs_auth | LINKEDIN_ACCESS_TOKEN: missing LINKEDIN_ORG_ID: missing | Optional B2B channel | |
| Manual paste pack (all channels) manual_export | export_only | — | Always available — writes export files for any platform without API |
# Email (same Resend as SweepOps apps/web) RESEND_API_KEY= # copy from apps/web/.env.local MARKETING_FROM_EMAIL=SweeperGuys <matt@sweeperguys.com> MARKETING_REPLY_TO=matt@sweeperguys.com RESEND_FROM=SweepOps <matt@sweeperguys.com> # Google Business Profile GOOGLE_GBP_ACCESS_TOKEN= GOOGLE_GBP_ACCOUNT_ID= GOOGLE_GBP_LOCATION_ID= # Meta (Facebook + Instagram) META_PAGE_ACCESS_TOKEN= META_PAGE_ID= INSTAGRAM_BUSINESS_ACCOUNT_ID= INSTAGRAM_DEFAULT_IMAGE_URL=https://... # X / Twitter X_API_BEARER_TOKEN= # LinkedIn (optional) LINKEDIN_ACCESS_TOKEN= LINKEDIN_ORG_ID=