Integrations

Connect channels

Resend (email) shares SweepOps' API key. WordPress receives city page drafts. Google GBP / Facebook still optional — use Export / Ship for social.

Daily automation budget (Pacific day)

Sends left
9/15
used 6 · 2026-07-22
Open-bumps left
5/5
waiting 0 · after 3d open
Research cap / run
8
Sequence cap
10

Email (Resend — same as SweepOps)

Ready (live send)API key: setlive

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_…
Webhook secret: setPOST /api/webhooks/resend

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).

ProspectsApprovals
WhenToSubjectStatus
7/21/2026, 9:09:52 PM PDTpublicworks@cityofmissionviejo.orgSweeperGuys rates for Mission Viejo 2026 Slurry Seal bidopened
7/21/2026, 8:55:49 PM PDTpublicworks@eastvaleca.govStreet sweeping for Eastvale 2026 Asphalt Overlay bidopened
7/21/2026, 8:55:07 PM PDTinfo@sully-miller.comTrack-out sweeping support for Sully-Miller in Breaopened ×3
7/21/2026, 8:54:15 PM PDTservpro9344@verizon.netProposal for Construction Track-Out & Street Sweeping Servicsent
7/21/2026, 8:53:59 PM PDTpublicworks@fountainvalley.govNewhope St Rehabilitation – Street Sweeping Supportopened
7/21/2026, 8:53:56 PM PDTprocurementcontracting@palmspringsca.govStreet Sweeping Support for Palm Springs 2026 Slurry Sealopened
7/21/2026, 7:16:41 PM PDTmatt@sweeperguys.com[Marketing Account] Resend test 2026-07-22T02:16delivered
7/21/2026, 7:04:09 PM PDTmatt@sweeperguys.com[Marketing Account] Resend test 2026-07-22T02:04sent
7/21/2026, 5:13:48 PM PDTmatt@sweeperguys.com[Marketing Account] Resend test 2026-07-22T00:13delivered
7/21/2026, 4:34:40 PM PDTmatt@sweeperguys.com[Marketing Account] Resend test 2026-07-21T23:34sent
7/21/2026, 4:24:25 PM PDTmatt@sweeperguys.com[Marketing Account] Resend test 2026-07-21T23:24sent
7/21/2026, 3:29:03 PM PDTmatt@sweeperguys.com[SG Marketing] Brief 2026-07-21 · 12 bids · 0 seq · 0 approvsent

Full auto email (set-and-forget)

FULL AUTO ONApproval gate: OFFFULL_AUTO_EMAIL: true

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.

WordPress (sweeperguys.com)

Env configured

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.

City pages

Phone port + after-hours

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:

  1. Point the new number's Voice webhook to /api/voice/incoming
  2. Set TWILIO_VOICE_NUMBER=+19494846315 in .env.local
  3. Restart marketing + test a call
# Business hours (Pacific) — transfers only while open; rates always work
SECRETARY_HOURS=7-18
SECRETARY_WEEKENDS=false
SECRETARY_TZ=America/Los_Angeles

Dodge / construction.com API

Waiting on API key

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=

Parked — social APIs

  • Google GBP API: quota 0 until case 2-6314000041503 approved → then Refresh listings
  • Facebook: Business Manager system user later — notes in WHEN-YOU-RETURN-APIS.md
Back to Ship workflow

Google Business Profile

OAuth app: missing envConnectedrefresh token saved
Reconnect Google

After 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/.

Channels

PlatformStatusAutoEnv keysNotes
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_onlyNo 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_onlyAlways available — writes export files for any platform without API

Env template

# 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=