Skip to content

CTR Campaign Workflow

Fresh

Source: bible/campaigns.md (The full workflow)

End-to-end workflow for a new client CTR campaign.

Lifecycle

flowchart TD
  BL[1. Baseline rank check] --> SD[2. Schedule daily rank tracking]
  SD --> TS[3. Test single CTR click]
  TS --> CC[4. Create campaign config JSON]
  CC --> TR[5. Test run the campaign]
  TR --> SC[6. Schedule it]
  SC --> M[7. Monitor]
  M --> AD[8. Adjust based on results]
  AD --> M

1. Baseline rank check

bash
node cli.mjs rank \
  --keyword "junk removal dallas" \
  --domain "clientsite.com" \
  --state "TX"

Write down starting positions.

2. Schedule daily rank tracking

bash
curl -X POST http://localhost:4700/schedules \
  -H "Content-Type: application/json" \
  -H "x-api-key: ghost-engine-key" \
  -d '{
    "jobType": "rank-check",
    "runsPerDay": 1,
    "startHour": 6,
    "endHour": 7,
    "jobConfig": {
      "keyword": "junk removal dallas",
      "domain": "clientsite.com",
      "state": "TX"
    }
  }'

3. Test a single CTR click

bash
node cli.mjs ctr \
  --keyword "junk removal dallas" \
  --domain "clientsite.com" \
  --city "Dallas" \
  --state "TX" \
  --test-mode

Verify it finds the domain, clicks it, and dwells.

4. Create the campaign config

Save as campaigns/client-dallas.json:

json
{
  "name": "Client Dallas CTR - May 2026",
  "plugin": "ctr-engine",
  "pluginExport": "runCTR",
  "accountSource": "store",
  "accountFilter": { "status": "active" },
  "concurrency": 3,
  "scheduleEverySec": 900,
  "maxRunsPerAccount": 30,
  "jobConfig": {
    "keyword": "junk removal dallas",
    "targetDomain": "clientsite.com",
    "city": "Dallas",
    "state": "TX",
    "dwellTime": "medium"
  }
}

5. Test run the campaign

bash
node cli.mjs campaign --config campaigns/client-dallas.json

Watch a few accounts run. Check that browsers launch, searches happen, clicks land.

6. Schedule it

bash
node cli.mjs schedule create \
  --campaign "client-dallas" \
  --clicks-per-day 30 \
  --start-hour 8 \
  --end-hour 20 \
  --strategy "natural"

7. Monitor

bash
# Schedule status
node cli.mjs schedule list

# Account health
curl http://localhost:4700/accounts/army-status

# Rank trend after a week
curl "http://localhost:4700/ranks/report?keyword=junk+removal+dallas&domain=clientsite.com&days=7"

Or watch the dashboard at http://localhost:4700/.

8. Adjust

  • Not finding the domain: check maxPages (default 3). If rank > 30, it will not find it
  • Too many failures: reduce concurrency. Check proxy health
  • Rank not moving after 2 weeks: increase clicks-per-day. Add more keywords. Layer in cascades
  • Account attrition too high: reduce maxRunsPerAccount. Run warmup batches