Skip to content
Nawap BastolaAI engineer
All work01 of 062025 — 26Lead AI engineer

BusinessFrame

Paste a website, get a campaign plan, and launch Google Ads with a person approving the parts that touch money.

My role
Lead AI engineer
For
Ad tech SaaS for local service businesses
When
2025 to August 2026
Status
Shipped, engagement wrapped Aug 2026
Stack
LangGraph agentsGoogle Ads APIFastAPINext.js
BusinessFrame · 0:28Silent walkthrough

The 28 second recording is the public hero demo. It shows website analysis, service signals, keyword candidates and negative filters for a sample business. It does not show campaign provisioning or the launch approval path.

01

The situation

Plumbers, roofers, dentists and small law firms want leads, not a Google Ads education. Most either pay an agency or run a campaign themselves and quietly under manage it. The pitch for BusinessFrame was simple. Paste your website, pay a small setup fee, and get a campaign that a set of agents plans, launches and reviews every day.

The catch showed up early. Google’s billing setup and conversion tracking cannot be safely automated for an arbitrary business, and a campaign that goes live without policy review can get an account suspended. A fully automatic product had a hole in it from day one, so the real engineering problem became how to keep the automation while putting a person at the few decisions that carry risk.

02

How it works

The diagram is the pipeline. The frames below it are taken from the recording.

  1. Website crawlCrawl4AI reads the site and the analysis agent extracts services, locations and intent signals.
  2. Free previewKeywords, negatives, targeting and a budget range, unlocked by Stripe checkout.
  3. StoreChild accountEach project gets its own Google Ads account under the manager account.
  4. Campaign draftAd groups, three responsive ads per group, extensions, negatives and a five dollar a day starter budget, created paused.
  5. GateBilling and policy reviewA support ticket opens for staff to attach billing and check the site against ad policy.
  6. LaunchStaff resume the campaign and the project moves to its chat workspace.
  7. Daily and weekly reviewsScheduled agents propose bid, keyword and budget changes within backend caps.
  8. GateApprovalAnything that touches spend waits for a person.
BusinessFrame landing page with a single field for a business website address

Start from a URL

The public landing page takes a website address and nothing else. The analysis runs before any account exists.

Analysis progress screen listing pages read, service signals, keyword candidates and negative filters

Read the site

The crawler reports pages read, service signals, keyword candidates and negative filters as it works, then hands off to campaign strategy.

Findings page with services detected, keyword themes, a recommended budget and top buying intent searches

Preview before paying

The findings page shows services, keyword themes, a recommended budget and the top buying intent searches. The figures on screen are the product’s estimates for the sample business in the recording, not client results.

Project chat workspace with the campaign agent and an activity panel of recent agent actions

Work with the campaign agent

After launch, each project has a chat workspace. The activity panel on the right lists what the review agents did today and what is waiting for approval.

03

Decisions that mattered

  1. Create every campaign paused

    Provisioning builds the whole structure first, then stops. The paused state doubles as the grace period for billing, policy and website checks, and nothing spends until a person resumes it.

  2. One Google Ads account per project

    A child account under the manager account isolates each client. A suspension or policy strike on one site cannot take the others down.

  3. Caps in the backend, not in the prompt

    Agents propose changes, but the API enforces the limits. Budget moves are capped at fifteen percent a cycle and spend changes queue for approval.

  4. Durable provisioning state

    The launch run is a LangGraph workflow with five persisted steps in Postgres, so a failure part way through resumes instead of leaving a half built account.

  5. Never invent a fallback

    If the site URL is missing or invalid the pipeline skips ads, sitelinks and conversion tag prep instead of fabricating a URL. Sitelinks only come from pages the crawler actually fetched.

04

Where it landed

Website analysis, campaign provisioning and the daily review loop run in one workspace, with explicit human gates at billing, policy review and launch. The interesting engineering was never generating the ads. It was billing, conversion tracking, policy review and getting a campaign live safely with a person in the loop.

What holds
  • Campaigns provisioned paused, launched by a person
  • One isolated Ads account per project
  • Per run LLM cost reporting with model aware pricing
What stayed open
  • Billing through Stripe was still rough at handover and needed a manual check before a project was created.
  • No campaign or account counts are recorded, so this page makes no claims about volume.
  • The engagement wrapped in August 2026 with the remaining backlog closed rather than finished.
05

Notes from the build

Written in my own words, after the fact. Opinions, not claims.

I came into this as the AI engineer and ended up owning most of the stack, from the crawler and the agent workflows to the Ads API integration and the cost reporting. The moment the project made sense to me was reading Google’s billing documentation and realising the fully automatic version could not exist. Everything after that was designing around a person instead of pretending one was not needed.

The cost reporting is the unglamorous piece I am most pleased with. Each run of each workflow logs its model calls, deduplicated, priced by model, with runtime price overrides and regression tests. It exists so the question of what a project costs to run has an answer instead of a guess.

Handover was a knowledge transfer to two senior developers joining the client, which forced me to write the workflows down properly. Most of what is on this page comes from that document.

Nawap Bastola · 2025 to August 2026