How We Work - Juicy Marbles Ad Operations
The Team
| Role | Who | What They Do |
|---|---|---|
| Automation | Claude (AI) | Prepares reports, analysis, campaign dry-runs, ad copy drafts, executes approved actions |
| Operations | Henrik | Reviews Claude's output, catches errors, validates strategy, manages the workflow |
| Decision Maker | Jon | Approves or rejects every action that touches live campaigns or spends money |
The Workflow
Three-step approval chain. No shortcuts.
Step 1: Claude Prepares
Claude runs analysis, generates reports, builds campaign packages, writes ad copy, and produces recommendations. Everything is a draft until Henrik reviews it.
Claude's output can be wrong. Bad negative keyword recommendations, incorrect diagnostics, inflated savings estimates - these all happen. That's why Step 2 exists.
What Claude does autonomously (no approval needed)
- Read/export data from any platform (Meta, Google, Shopify, Klaviyo, Polar)
- Run analysis scripts and generate reports
- Generate AI ad copy variants (as drafts)
- Run tests, linting, local development
- Investigate issues (curl checks, API reads, data exploration)
- Build campaign structures in
--dry-runmode
Step 2: Henrik Reviews
Henrik is the quality gate. He:
- Reads every report before Jon sees it
- Catches mistakes in analysis (wrong keywords, bad data interpretation)
- Validates strategic recommendations against actual business context
- Fixes errors and sends back for rework if needed
- Decides when output is ready for Jon
Nothing goes to Jon until Henrik says it's ready.
Step 3: Jon Approves
Jon reviews the polished package and makes decisions:
- Approve or deny each recommended action
- Adjust budgets or targeting if needed
- Prioritize which actions to execute first
Jon's time is valuable. The goal is to give him a clean package where each action takes 2-5 minutes to evaluate.
Step 4: Claude Executes
Only after Jon explicitly approves an action, Claude executes it:
- Pause or enable campaigns
- Add negative keywords
- Create new campaigns (as PAUSED, Jon activates)
- Apply budget changes
- Upload audience lists
The block-client-writes.py hook prevents accidental write operations. Every write to Meta, Google, Shopify, or Klaviyo APIs requires explicit approval flow.
What Needs Approval
| Action | Henrik Review | Jon Approval |
|---|---|---|
| Pause/enable campaigns | Yes | Yes |
| Add/remove negative keywords | Yes | Yes |
| Create new campaigns | Yes | Yes |
| Budget changes | Yes | Yes |
| Email sends (Klaviyo) | Yes | Yes |
| Audience/segment changes | Yes | Yes |
| Any API write operation | Yes | Yes |
| Data exports (read-only) | No | No |
| Analysis and reports | No* | No |
| AI copy generation (drafts) | No* | No |
| Test runs and local dev | No | No |
* Reviewed before delivery, but no formal approval step required.
Deliverable Format
Reports and recommendations go to Jon as:
Decision packages
Clear actions with approve/deny for each item
Campaign dry-runs
Full structure previews, nothing live
Ad copy packages
Scored variants, Jon picks favorites
Fix documentation
Step-by-step instructions for technical issues
Every deliverable includes: what, why, expected impact, and risk level.
Safety Guardrails
block-client-writes.py
PreToolUse hook blocks any Bash command that writes to Meta, Google, Shopify, or Klaviyo APIs
block-em-dashes.py
Prevents AI slop in written output
--dry-run by default
Campaign creation scripts preview only unless explicitly told otherwise
All campaigns created as PAUSED
Jon manually activates after review
When Things Go Wrong
Claude's analysis is a starting point, not gospel. Common errors to watch for:
- Recommending negative keywords that block good prospecting/conquest terms
- Incorrect technical diagnoses (e.g., claiming HTTPS is broken when it's fine)
- Inflated savings estimates
- Missing business context (e.g., not understanding that "impossible steaks" is a conquest opportunity)
Henrik catches these. That's the whole point of the review step.