Building in Public

Chapter 10

Eating Our Own Dog Food

CampaignForge AI · May 2026 · SimQuant LLC

CampaignForge AI - The Journey

Chapter 10: Eating Our Own Dog Food

Date: 2026-05-09 Vertical: B2B SaaS | Budget: $500/month


Where We Left Off

Chapter 9 resolved the architecture: three separate flows, each failing independently. The campaign graph runs campaigns. The journey content flow publishes chapters. The operator decides what crosses between them.

The pipeline was declared ready for real Meta Ads data. The diagnostic brain, the rework loop, the approval gates — all wired and tested. The missing piece was the API connection to feed live impression and conversion data into Agent 06.

Before connecting that wire, something else needed to be done. To run a real Meta campaign, there has to be a real landing page worth sending traffic to. That meant looking at the CampaignForge homepage with honest eyes.


The Problem With Looking at Your Own Work

CampaignForge AI has an Agent 00. Its job is to audit a landing page before any campaign strategy begins. It checks HTTP health, mobile readiness, and conversion readiness. The entire premise is that you should not spend money on ads that land on a page that is not ready to convert.

I had not run that check on my own homepage.

That is a meaningful gap when you are about to spend $500/month on paid Meta traffic targeting marketing managers and founders who have never heard of CampaignForge AI. Cold paid traffic is expensive. Every click that lands on a page and leaves without an action is a direct cost. The landing page is the final conversion layer — all the targeting, creative, and budget decisions upstream are only as good as what happens when someone actually arrives.

I commissioned an external audit of the page. The finding came back blunt: technically solid, but not built to convert cold paid traffic.


What the Audit Found

The full assessment: fast load time, HTTPS, mobile-ready. A good technical foundation. The conversion layer was the problem.

Critical issues:

The headline:

> "From Brief to Live Campaign — Autonomously."

Accurate. But it does not mirror the language a person who has been running agency costs of $5,000/month would use when looking for an alternative. Message match from ad to landing page is a direct conversion lever. The headline was not pulling it.


The Irony Is the Point

Agent 00 exists because I believe you should not spend on ads that land on a broken page. The "broken" in the audit was not technical — HTTP status 200, valid SSL, mobile-responsive. The broken was conversion readiness.

That is exactly what Agent 00 is designed to catch. CRO score. Messaging clarity. Trust signals. Friction in the primary CTA path. The same categories the external audit flagged are the categories Agent 00 evaluates.

The product's own homepage failed the audit the product is built to run.

That is worth writing down. Not as a criticism — the page was built quickly to establish a web presence while the pipeline was being built. But it is the clearest possible demonstration of why Agent 00 sits at position zero in the pipeline. Spending money before that check runs is how you waste the budget the Cost Approval gate is designed to protect.


What Changed

Claude implemented the fixes directly, working from the audit findings.

Headline:

Before: "From Brief to Live Campaign — Autonomously."
After: "Replace Your Ad Agency With 12 AI Agents."

The new headline is the message a marketing manager spending $5K/month on an agency understands immediately. It mirrors the language a Meta ad targeting that person would use. Message match from ad to page — the specific lever the audit flagged.

Hero subheading — ROI anchor added:

The previous sub described what CampaignForge does. The new version opens by naming what it replaces:

> "Most SaaS teams spend $3,000–$8,000/month on agency fees. CampaignForge AI handles strategy, creative, launch, and optimisation across Meta, Google, and LinkedIn — autonomously, with your approval at every gate."

The buyer now has a reference point before they read anything else.

Primary CTA — email link replaced with a waitlist form:

The mailto: link is gone. Clicking the primary CTA now opens a modal with a proper form: name, work email, and monthly ad spend. The monthly ad spend field doubles as a lead qualification signal — it tells me immediately whether the person submitting has a budget worth the early access conversation.

The form submits via Formspree (@formspree/ajax CDN, form ID xkoypnaj). The library handles field-level validation errors, button disabling during submission, and the success state reveal — no manual fetch code, no custom DOM toggling. On success, the form is replaced with a confirmation.

Hero stat — replaced:

Before: 263+ Tests Passing
After: ~$5K/mo Agency Cost Replaced

Tests passing is an engineering metric. Cold traffic does not care. The new stat is a buyer metric — it frames the value proposition in the same currency as the problem being solved.

"Actively building" status bar — removed:

Replaced with a slim social proof strip: pipeline running on real briefs, 9 chapters of transparent build logs, HTTPS and mobile-ready, no spend without operator sign-off. The same information reframed from "this is not finished" to "here is what you can trust."


The Formspree Integration

The @formspree/ajax CDN library was chosen over a manual fetch implementation for one reason: it handles the error states that a manual implementation typically skips.

A manual fetch either succeeds or shows an alert. The Formspree library surfaces field-level errors — if a required field is missing or the email format fails server-side validation, the error appears next to the field, not as a generic modal. The data-fs-submit-btn attribute disables the button during submission. The data-fs-success attribute reveals the confirmation block when Formspree returns 200.

The integration pattern:

<form id="waitlistForm">
<input type="email" name="email" data-fs-field>
<span data-fs-error="email"></span>
<button data-fs-submit-btn>Request Early Access</button>
</form>
<div data-fs-success>You're on the list!</div>

<script>
window.formspree = window.formspree || function() { (formspree.q = formspree.q || []).push(arguments); };
formspree('initForm', { formElement: '#waitlistForm', formId: 'xkoypnaj' });
</script>
<script src="https://unpkg.com/@formspree/ajax@1" defer></script>

No bundler. No npm. One script tag.


The Honest State After Chapter 10

What changed on the homepage:

What did not change:

What this demonstrated:


What Comes Next

The homepage is ready to receive paid traffic. The waitlist form is live. The Formspree endpoint captures name, email, and monthly ad spend for every submission.

The next step is the one that has been the stated next step since Chapter 9: connecting the Meta Ads API to Agent 06 so that the performance data flowing into the diagnostic brain is real, not fixture data. A campaign run. Real impressions, real clicks, real conversion numbers feeding a real diagnosis.

The pipeline has been ready for this for two chapters. The landing page is now ready for it too.

This post was drafted by AI and reviewed by the operator. Content is published as part of the CampaignForge AI build-in-public journey.