Back Office · office.temerarii.xyz
GTM-RUNBOOK.md

← all docs

GTM Runbook — the measurement + send half (operator actions + wiring)

The content engine is built and gate-green. The measurement + send half is wired to be safe by

default — nothing sends, charges, or measures until you supply the credentials below. Every

integration stages locally and never goes live without an explicit flag + key + your GO.

Standing rail: NOTHING is published, sent, or charged without review + explicit GO. Email/SMS

default to staging drafts; social stays staging-only via Blotato; bookings/payments need your Stripe.


What I supply (already wired, behind keys)

CapabilityCodeStateGoes live when
Email (Resend)engine/integrations/resend.pystaging draftout/email-staging/RESEND_API_KEY present (it is) AND --send flag + your GO
SMS/MMS (Twilio)engine/integrations/twilio.pystagingout/sms-staging/Twilio creds in .env AND --send + your GO
Social (Blotato)engine/integrations/blotato.pystaging/dry-runexplicit publish + GO
Blog (static .xyz/blog + Duda)static HTML → apps/lab/public/blog/<slug>/ · weekly duda.pydraft (UNPUBLISHED)explicit publish + GO

resend.py / twilio.py both default dry=True → they write a reviewable payload to disk and make

zero network calls. Live send is a deliberate two-key action (flag and credential).


What YOU supply (the operator-only actions)

These are interactive auth / accounts / keys only you can provide. Each is independent.

1 · Analytics + Workspace — GA4 + GSC via gcloud

  • Run yourself (interactive login): ! gcloud auth login <temerarii Workspace acct> then

! gcloud config set project <gcp-project>.

  • Then give me: the GA4 property ID + GSC verified domain.
  • I then: create/point a service account, enable GA4 Data/Admin + Search Console APIs, grant the SA on

the property + site, and wire ga4.py / gsc.py (NOT yet built — built once the property exists) so

the UTM spine (engine/lib/utm.py) reads back into the funnel + the custom dashboard.

  • GOOGLE_API_KEY stays empty by design — we use gcloud/service-account, not an API key.

2 · Email — Resend domain

  • RESEND_API_KEY is already in .env. Confirm the temerarii.xyz sending domain is verified in

Resend (SPF/DKIM/DMARC). Replies route to Zoho (the business inbox). Then I can stage → (on your GO) send.

3 · SMS — Twilio

  • Supply TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM (a messaging number) in .env.

Until then twilio.py stages only. MMS GIF + plain-text body per the output policy.

4 · CRM — the Airtable base

  • Designate which Airtable base = the CRM (base id) and confirm AIRTABLE_API_KEY scope. I wire the

schema (accounts · contacts · intent · sequence · booking-sync). System of record; client owns the data.

5 · Bookings + payments — Cal.com + Stripe Connect

  • Create/confirm the Cal.com account → connect the Stripe app (Stripe Connect) → create the two

event types: free Q2 consult ($0) and $150/hr (paid at booking) → paste the public booking

links back. I wire them into every CTA (UTM-tagged) + the CRM + GA4 conversion. (See gtm.yaml: booking.)


The measurement loop (once 1 + 4/5 land)

Every published link is UTM-tagged (utm.py) → GA4 reads it back → the funnel + custom dashboard show

reach → capture → convert, tied to the one number per campaign. Bookings sync to the CRM + fire a GA4

conversion. That closes "tie every dollar to a result" — the Performance promise, run on ourselves.

Quick checks

python engine/integrations/resend.py --to you@x.com --subject "Test" --html "<p>hi</p>"   # stages a draft, no send
python engine/integrations/twilio.py --to +15125550100 --body "test"                       # stages, no send

Both print where they staged and confirm sent: false. Nothing leaves the machine without --send + a key + your GO.