Zodiac Tech CRM Docs

Campaigns

The governed campaign workflow — draft a campaign in minutes, the client approves, QA checks it, and only then does it launch (paused).

client admin ad-specialist Medium ⏱ 15 min Updated 2026-10-05

Campaigns

Zodiac Tech CRM runs Meta campaigns through a deliberate gate, not a one-click gamble:

Brief → Draft → Client approval → QA checklist → Launch (paused) → Verify.

The point is simple: nothing spends money until a human approved it, a QA reviewer verified it, and it goes live paused so the first impression can be checked before budget flows.

Who this is for

  • Business owners / admins — create the brief and approve the draft. The drafting screen lives in your CRM (/admin, menu Ads → Campaigns), for managers and above.

  • Ads specialists — shape and monitor campaigns in the agency console.

  • QA reviewers — the only role allowed to pass QA and launch campaigns.

  • Difficulty: Medium

  • Time: 15 minutes

  • Prerequisites: Meta connected and a client workspace provisioned for the agency (Agency panel). Campaign creation requires the manager role or above in the business.

Part 1 — Draft a campaign (business side)

1. Write the brief

  1. Open Ads → Campaigns (/admin/meta-campaign-drafts) and click Create.
  2. Fill in the brief:
    • Product / service you are advertising.
    • City / location to target.
    • Daily budget (₹) — within the allowed range (minimum ₹100; your platform sets the maximum, default ₹10,000).
    • Objective — leads, WhatsApp messages, website visits, or sales.
    • Notes — anything the ad should say or avoid.
  3. Submit.

Expected result: the CRM drafts the campaign copy immediately — using AI when an AI key is configured, and a solid template otherwise. Nothing is sent to Meta at this point; this is a draft inside your CRM.

2. Review and approve

  1. Open the draft and read it like a customer would.
  2. Use Approve (a human decision, recorded in the audit trail), or Reject to discard it.

Expected result: the draft moves to Approved. It now waits for the QA gate.

Part 2 — QA and launch (agency side)

The QA queue lives in the agency console (/agency → Meta Ads → QA Queue) and is available only to the QA reviewer role — the one role with the launch permission.

3. Start QA

  1. Open the QA Queue and find the approved draft.
  2. Click Start QA.

Expected result: the 12-point checklist opens. Seven points are automatic and mandatory — derived from the draft's own data (campaign name, objective, budget, location, audience, creative, copy). If any auto point fails, the CRM lists exactly what is missing instead of letting QA "start".

4. Work the checklist

  1. Five points are for the reviewer to verify by eye: placements, lead form, tracking, destination, and creative quality.
  2. Tick each verified item.

Expected result: the checklist fills in. Pass QA is only possible when all 12 items are done — there is no override.

5. Pass or fail

  • Pass QA — all 12 done → the draft becomes QA-passed.
  • Fail QA — you must write notes (what is wrong) → the draft goes to QA failed with your notes attached, back to the drafting side.

Expected result: a clear yes/no with a written reason. No silent shelfing.

6. Launch

  1. With QA passed, the launch control on the draft becomes available (and only for the QA reviewer's permission level).
  2. Launch.

Expected result: the campaign is created on Meta in PAUSED state — deliberately. The launch is audit-logged, and LaunchVerifier then checks the campaign on Meta: found → active → spending → producing leads. Any launch failure is recorded on the draft. Un-pause in Meta when you are ready to spend.

7. Watch it live

  1. Open Meta Ads → Active Campaigns in the agency console.

Expected result: a portfolio view — last-30-day spend, attributed CRM leads and cost per lead per campaign, with status. Metrics are deterministic database aggregates (leads attributed via the campaign/ad chain), not estimates.

Expected result

A campaign cannot reach Meta without: a client-side draft, a human approval, a fully completed 12-point QA and a launch by the sole launch-permitted role — landing paused for final inspection. Every step is audited.

Common mistakes

  • Expecting the draft to be live on Meta. Drafting is local; go through approve → QA → launch.
  • Trying to "Start QA" too early. The seven automatic points must already pass (they derive from the draft); fix the brief data instead.
  • Empty QA pass. Impossible by design — all 12 items, including the 5 reviewer checks, must be done.
  • Forgetting the paused state. After launch the campaign exists paused in Meta; someone must deliberately activate it there.
  • Editing the brief after approval. Substantial changes should go back through the flow — reviews and audits attach to what was actually checked.

Troubleshooting

Symptom Fix
Draft stuck in "Draft" Nobody has approved it yet (check with the business side).
"Start QA" refuses The auto-mandatory items are incomplete; the CRM lists them.
Launch button missing QA is not passed, or your role lacks the launch permission (only QA reviewers have it).
Launch failed Read the recorded error on the draft (token/permission issues are most common) — see OAuth & permissions.
Campaign shows no leads Check form selection and attribution — the lead capture pipeline explains the chain.

Technical details

  • Drafting: App\Filament\Resources\MetaCampaignDraftResource + Pages\CreateMetaCampaignDraft (tenant /admin, manager-or-above). Brief → App\Services\Ai\CampaignBriefService::draft() (AI copy when a provider key exists, template otherwise; nothing is sent to Meta during drafting). Model App\Models\MetaCampaignDraft with statuses DRAFT, APPROVED, LAUNCHED, FAILED, REJECTED; qa_status carries QA_PASSED / QA_FAILED.
  • Budget bounds: minimum ₹100, maximum from config('leadhub.campaigns.max_daily_budget_inr') (default 10000).
  • QA: 12 QA_ITEMS — 7 auto+mandatory (campaign_name, objective, budget, location, audience, creative, copy) and 5 reviewer checks (placements, lead_form, tracking, destination, creative_ok). canStartQa() / allQaItemsDone() enforce the gates. Queue page: agency MetaQaQueue (and Super Admin), gated by meta.campaign.launch (QA reviewer only).
  • Launch: requires approved + QA-passed, creates the campaign paused on Meta, audits campaign_draft.launching / launched / launch_failed; post-launch checks by LaunchVerifier (found / active / spending / producing leads).
  • Monitoring: MetaActiveCampaigns (agency, meta.performance.view) via MetaAdsMetrics — attribution leads.meta_ad_id → meta_ads → meta_adsets → meta_campaigns; revenue uses won value with deal value as fallback.

Was this page helpful?