URL: /capabilities/measure · Id: `page:/capabilities/measure`

# Measure

> Search performance, site analytics, ad results and each Play’s numbers in one weekly report, from the first indexed page.

Is it working? Connect [Search](/plays?kind=search) Console and your site analytics once, and your agent reads every number each week, starting with pages indexed long before the first click.

```text title="Measure · Ask"
Is any of it working?
Show me what moved this week.
```

```ts title="Measure · SDK"
import { $ } from 'startup-builder'

await $.Integration.connect({ system: 'analytics', scope: 'startup', grants: ['search-performance', 'site-analytics'], venue: 'google-search' })   // Search Console and your site analytics, once
await $.Metric.query({ metric: 'organic-visits', shape: 'trend', breakdown: 'source', window: '7d' })   // visits and signups by source
await $.Metric.query({ metric: 'play-sourced-customers', shape: 'trend', breakdown: 'play', window: '28d' })   // the customers each Play brought
await $.Metric.watch({ metric: 'organic-visits', threshold: 100, direction: 'above' })   // a Task the week search visits pass 100
return await $.Domain.verify({ domain: 'leaseline.app' })   // pages submitted against pages indexed · Not live yet, gaps #12
```

```json title="Measure · Response · sample"
{
  "$type": "WeeklyReport",
  "week": "2026-10-19",
  "indexed": {
    "google": {
      "submitted": 38,
      "indexed": 21
    },
    "bing": {
      "submitted": 38,
      "indexed": 29
    }
  },
  "search": {
    "impressions": 1840,
    "clicks": 37,
    "topTerm": {
      "term": "rent increase notice template",
      "position": 8.4,
      "clicks": 14
    }
  },
  "visits": [
    {
      "source": "search",
      "visits": 212,
      "signups": 3
    },
    {
      "source": "answer engines",
      "visits": 18,
      "signups": 1
    },
    {
      "source": "directories",
      "visits": 64,
      "signups": 1
    }
  ],
  "plays": [
    {
      "play": "editorial-seo",
      "customers": 1,
      "cost": 6.2
    },
    {
      "play": "directory-listings",
      "customers": 0,
      "cost": 0
    }
  ],
  "verdict": {
    "call": "keep",
    "because": "indexed pages rose from 9 to 21 and impressions doubled week over week"
  }
}
```

| First run | Status | Runs by | Connect once |
| --- | --- | --- | --- |
| The first report: free | Coming | API | Search Console and your site analytics, once. |

## What you get
| Field | What it says |
| --- | --- |
| Indexed | Pages submitted against pages indexed, on Google and on Bing. |
| Impressions | How often your pages showed in results, per term. A new site reads not measured yet, never zero. |
| Clicks and position | Clicks per page and term, and the average position each one held. |
| Rank | Where each approved term places you on the live results page, read before Search Console has rows. |
| Visits by source | Visits from search, answer engines, links, posts and ads, each counted once. |
| Signups by source | Signups traced to the source that brought them. |
| Per Play | Customers each Play brought, its cost and its payback. |
| Verdict | Keep, fix or switch, with the number it rests on. |

## How it runs
| When | What happens | Runs by | Your part | Takes |
| --- | --- | --- | --- | --- |
| Day 0 | Connect Search Console and your site analytics | API | connect once, about 2 min | about two days for the first search rows |
| Day 1 | Read pages submitted against pages indexed ([Submitted and indexed](#submitted-and-indexed)) | API | nothing | the same day |
| Weekly | Read your position for each approved term ([Rank check](#rank-check)) | API | nothing | the same day |
| Weekly | Read clicks, impressions and position per page and term ([Search performance](#search-performance)) | API | nothing | rows lag about two days |
| Weekly | Read visits and signups by source, and each Play’s customers and cost ([Numbers per Play](#numbers-per-play)) | API | nothing | the same day |
| Monday | Write the weekly report with one verdict ([Weekly report](#weekly-report)) | API | read it, about 10 min | the same day |
| Any day | Open a Task when a number crosses the line you set ([Alert on a number](#number-alerts)) | API | act on the Task | the same day |

## Jobs inside it
| Job | What it returns | Price | Status | Runs by |
| --- | --- | --- | --- | --- |
| <a id="submitted-and-indexed"></a>Submitted and indexed | Pages submitted against pages indexed on Google and Bing, weeks before clicks | free | Coming | API |
| <a id="search-performance"></a>Search performance | Clicks, impressions and position per page and term | free | Coming | API |
| <a id="rank-check"></a>Rank check | Your position for each approved term, read from the live results page each week | $0.002 a term | Coming | API |
| <a id="site-analytics"></a>Site analytics | Visits and signups by source | free | Coming | API |
| <a id="numbers-per-play"></a>Numbers per Play | The customers each Play brought, what it cost and how fast it paid back | free | Coming | API |
| <a id="weekly-report"></a>Weekly report | One page each Monday: what moved, the number to watch, and keep, fix or switch | free | Coming | API |
| <a id="number-alerts"></a>Alert on a number | A Task the day a number crosses the line you set | free | Coming | API |

## Where and how it runs
| Where it works | How it runs | Connect once |
| --- | --- | --- |
| Google Search, Bing | API | Search Console and your site analytics, once. |

Your agent acts as you on every Venue you authorize. Where a Venue has no API, a browser agent signs in as you and does the steps.

## Plays that use it
| Play | Strategy that runs it |
| --- | --- |
| [Smoke test](https://startupbuilder.dev/workflows/plays/smoke-test) | [Paid](/strategy/paid) |

## Reference
| Tool | Runs today |
| --- | --- |
| <Op verb="Metric.query" /> | Coming |
| <Op verb="Integration.connect" /> | Coming |
| <Op verb="Metric.watch" /> | Coming |
| <Op verb="Domain.verify" /> | Coming |
| <Op verb="Keyword.measure" /> | Coming |