# Geodesix V0 scope

V0 is the smallest thing that moves money for a quote, decided 2026-09-29 and built the same day from the V1 port. It sits beside V1 as a third version (`v0-admin/`, `v0-retailer/`, `v0-publisher/`); nothing in V1 moved. This document is authoritative on what V0 contains, the way `mvp-v1.md` is for V1, and section 8 is the one sample dataset every V0 page reconciles to.

## 1. What V0 is

- **The retailer is a single brand, DTC, selling on its own site.** The retailer *is* the brand: one brand, that brand's products, product URLs on its own domain. No "Carried by," no account switcher, no organization, no marketplace of other people's brands. The sample retailer is Wonderbly.
- **Two implementation types**: **on-site placements** and **paid ads**. No carousel, no grounding, no chatbot, no MCP.
- **No approvals and no price controls.** Every licensed citation about the retailer's brand or products is available the moment it is licensed. A publisher's only control is a block: a retailer it blocks sees none of its citations and any live placement from that publisher stops. No request, no permission, no rate a publisher sets, no rate update.
- **Tracking is ours.** Paid ad clicks are counted on a redirect link we serve. On-site impressions and viewable impressions are counted by our loader. Nothing depends on Impact, and no surface mentions it.
- **Payments are ours, through Stripe.** A retailer puts a card on file and we charge it. A publisher connects a payout account and we pay it. The retailer has a Billing page and the publisher has Payouts on Earnings, because now we control both.
- **Retailers commit to a spend, and the rate slides with it.** The V1 sliding scale stays, with one rate card for the whole platform set by admin rather than one per publisher. A commitment is per citation and per use, chosen on Use. Paid ads start at $10 at $0.50 per click, so a retailer can test one citation cheaply, and slide down to $0.10 at $1,000. On-site keeps V1's shape: $50 at $5.00 CPMv to $500 at $3.00, a minimum spend every 30 days.
- **Credits stay.** Dollars an admin grants, expiring a year after the grant, drawn before the card is charged; they cover on-site placements and never paid ads.
- **We hand over text and instructions, not a builder.** Use gives the retailer the quote, the source, the publisher's mark and colors, and the code or the link, with instructions for a page template, for Google Tag Manager, and for anything else that can load a script. The platform is installation method agnostic; GTM is one of the documented routes, not the mechanism.
- **The only notification is a summary email**, weekly or monthly, on all three surfaces. No event emails: nothing happens that needs one, since nothing waits on anyone.
- **Clean and simple is the rule for the whole version.** Every page is the fewest cards that say the thing: the one month calendar in the summary email only, a chart on a page; one list per subject; no explanatory copy; no alert, digest or event settings beyond How often and What it covers. Where V1 has a control V0 does not need, the control comes off rather than being hidden.

## 2. Data model

`retailer` (its one brand folded in) · `product` · `user` · `publisher` · `article` · `citation` · `placement` · `commitment` · `block` · `credit` · `event` · `rate_card` · `charge` · `payout`

1. **A retailer has one brand and the products are its own.** The brand is the retailer's name and domain; a product carries its URL directly (no `retailer_product`); the citations a retailer sees are the ones whose subject is its brand or one of its products, in licensed articles. Brands are not a directory: a brand is created with the retailer.
2. **A placement is one retailer's use of one citation, typed `on-site` or `paid ad`**, with its commitment, its installation status (`Unverified`, `Verified`, `Viewable` for on-site; `Unverified` then `Viewable` for a paid ad, since nothing is detectable before its first click), and nothing about approval. Use creates it at once. It carries a name (the retailer's, suggested from the product and the use) and an id (`plc_xxx`), which is never shown on any page, only inside the snippet and the redirect link a retailer pastes.
3. **`commitment` is the spend chosen on the slider**, per placement: spend, rate, and for an on-site placement the 30 day period it renews on. Rates come from one platform wide `rate_card`: on-site (min. spend at max. rate to max. spend at min. rate) and paid ads (the same), plus the publisher share.
4. **`block` is one row per publisher and retailer.** A publisher blocks a retailer from its Retailers page (any retailer on the platform, before or after that retailer has placed anything), and admin can set or lift one from the publisher's Retailers tab or the Blocks page. A blocked retailer's live placements from that publisher are deactivated and the citations leave its lists. A block can name a retailer not on Geodesix yet, by name and website (`retailer_name`, `domain` on the row, no retailer id); it applies when a retailer with that domain joins. Publishers set one from their Retailers page and admin from the Blocks page.
5. **`credit`** is a grant (amount, reason, who, expiry) and its applications, as in V1.
6. **`event` has two sources**: the loader (impression, viewable) and the redirect (click). Nothing arrives from anywhere else.
7. **`charge` and `payout` are Stripe records we show**: a charge is a commitment prepaid at Use or a month's usage past it; a payout is what a publisher was sent for a month, 75% of what retailers spent on its citations.
8. **Gone**: `approval_request`, `permission`, per publisher `rate`, `carousel`, `grounding_*`, `citation_interest`, `organization`, `impact_connection`, `retailer_product`, the account switcher and the All accounts rollup.

## 3. The name

The type is **on-site**. The list is **On-site placements** (nav: On-site), the type filter reads `On-site | Paid ads`, a single one is "a placement," and the dashboard tile reads **On-site impressions**. It says where the quote runs, the retailer's own site, against an ad that runs elsewhere, without naming a page type, so it covers a product page, a homepage, a checkout and an email template alike. "Direct" is gone: nothing in V0 is indirect.

## 4. Retailer surface (`v0-retailer/`)

Nav: Dashboard alone, then **Catalog** (Products, Citations), **Placements** (On-site, Paid ads), **Insights** (Performance, Billing), **Settings** (Team). Profile and Sign out in the chip; no switcher; no count on any item.

| Page | What it is |
|---|---|
| `login.html` | One card, as V1. Opens `dashboard.html`. |
| `get-started.html` | Setup ladder: Chosen, Card on file, Installed, Verified. Choose On-site and/or Paid ads (choice cards, each reading how it bills and its range: "Billed on a cost per 1,000 viewable impressions basis" over "Range: $3 to $5 CPMv ($50 min)"; "Billed on a cost-per-click basis" over "Range: $0.10 to $0.50 CPC ($10 min)"); a Card card (the Stripe card form drawn as fields: card number, expiry, CVC, and a Save card button, a placeholder like the Turnstile block); then the On-site tab outside the card, shown only while On-site is chosen (the loader tag, the three install routes as tabs inside the card: Page template, Google Tag Manager, Other; then the verify checks). Paid ads has no tab: there is nothing to install, and it reads Verified at once. Go to your dashboard is disabled until every chosen type is verified and a card is on file. Sample: both chosen, card on file, On-site verified, Paid ads verified. `?new=1` draws the unverified state. |
| `dashboard.html` | Three tiles: **Spend**, **Paid ad clicks**, **On-site impressions**, each following the date range (`data-values`) and linking to Billing, Paid ads, On-site. Then **Spend by type**, V1's stacked area (on-site `--viz-1`, paid ads `--viz-2`), read by pointing, with each layer's total and key at the top right, following the date range. The one month calendar is the summary email's only (V0 batch 1, Evan: "This calendar is only for the summary emails"). Then **New citations** (citation, publisher, refers to, Use), **Products with new citations** (product, citations, link), **New publishers** (publisher, domain, citations about you). |
| `products.html`, `product-detail.html` | The brand's products with their URLs, read only, entered by Geodesix. Detail: the product's citations in two tabs, On-site and Paid ads, each row with Min. rate, Max. rate and Use. |
| `citations.html`, `citation-detail.html` | A tab per use (On-site, Paid ads), each row with Min. rate, Max. rate and **Use**; search and Filters (Refers to, Publisher). No permission, no Request, no Express interest, no Content filter. Detail: the quote, Source, Refers to, How you can use it (a row per use with Use). |
| `commitment.html` | V1's page in shape: the citation and use, three tiles (Min. spend, Rate, what it buys), the slider from min. to max. spend, one note. Use charges the card on file at once (credits first for on-site) and opens the placement's Install tab. `?use=on-site` or `?use=paid-ad`. |
| `on-site.html`, `on-site-detail.html` | The list: tiles (Spend, Impressions, Viewable, Placements), one card with search and Filters (Installation, Publisher), columns Placement (name), Citation (the quote alone), Publisher, Installation, Impressions, Viewable, Spend. Detail: tiles (Impressions, Viewable, Spend), the Installation ladder alone (no Approval ladder), tabs Overview (the quote, the facts as a field list, the publisher's brand), Install (the snippet, the loader, a **Where to put it** section with Page template, Google Tag Manager and Other as tabs inside the card, then Choose a style), Settings (Name, State, Deactivate). |
| `paid-ads.html`, `paid-ad-detail.html` | The list: tiles (Spend, Clicks, Avg. rate, Ads), columns Ad, Citation, Publisher, Installation, Clicks, Spend. Detail: tiles (Clicks, Spend), the Installation ladder (Unverified, Viewable), tabs Overview, Link (the redirect link with Copy, the quote and source as text with Copy, the publisher's mark and colors, and a **Using it** section: Meta ads, Google ads, Email, each two lines of where the link and the text go), Settings (Name, Landing URL parameters, State, Deactivate). No loader, no landing page script, no arrivals. |
| `verify-installation.html` | On-site only. The four checks as V1. |
| `performance.html` | Type filter (All, On-site, Paid ads) beside the date range, tiles, the pointing chart, By product and By publisher tables. |
| `billing.html` | Replaces Cost. Tiles: Spend, Covered by credits, Billed. Tabs: **By placement** (spend against commitment, as V1's Direct and Paid ads tabs, one table per type), **Credits** (balance card and the ledger, as V1), **Charges** (each charge: date, description, amount, status, Receipt), **Card** (the card on file: brand, last four, expiry, Update card). |
| `team.html`, `invite-user.html`, `edit-user.html` | As V1 (Admin, Read only). |
| `profile.html` | Account, Login, Notifications. Notifications is the summary email alone: How often (Weekly, on Mondays; Monthly, on the 1st; Never), What it covers (Spend and usage, New citations, Products with new citations, New publishers), Send to, and the preview beside it with one tab. No Delivery choice, no Email me about, no alert email, no IP filtering tab. |

The summary email is the dashboard in mail: the three tiles with the change from last period, the one month spend calendar, then the three lists.

## 5. Publisher surface (`v0-publisher/`)

Nav: Dashboard alone, then **Content** (Retailers), **Insights** (Performance, Earnings), **Settings** (Team). Profile and Sign out in the chip.

| Page | What it is |
|---|---|
| `login.html` | As V1. |
| `dashboard.html` | Three tiles: **Earnings**, **Paid ad clicks**, **On-site impressions**. Then **Earnings by type**, the same stacked area (on-site, paid ads). Then **Retailers using your content** (retailer, placements, earnings, and the Allowed toggle in the row, which is the reactive block), **New placements** (citation, retailer, use, when), **Top articles by earnings**. |
| `retailers.html` | Every retailer on the platform: retailer (logo, name, domain), placements of yours, earnings from them, and an **Allowed** toggle, on by default; a search box and Filters (Blocked, Using your content). Switching one off is the proactive block. |
| `performance.html`, `earnings.html` | As V1 minus grounding and minus the rate cards. Earnings: tiles (Earnings, On-site, Paid ads), tabs **By month** (a row per month, per retailer, and a Payout column: Sent with a date, or Pending), **By retailer**, **Payouts** (the connected account card: Stripe, bank ending 6789, Update; and the payouts table: date, period, amount, status). |
| `team.html`, `invite-user.html`, `edit-user.html`, `profile.html` | As V1. Notifications is the summary email alone: How often, What it covers (Earnings and usage, New placements, Retailers using your content), Send to, one preview. |

## 6. Admin surface (`v0-admin/`)

Nav: Dashboard alone, then **Catalog** (Articles, Citations), **Directory** (Publishers, Retailers, Users), **Placements** (On-site, Paid ads), **Money** (Charges, Payouts), **Settings** (Pricing, Blocks).

| Page | What it is |
|---|---|
| `dashboard.html` | Revenue and Expenses tiles over the pointing chart (as V1, expenses 75%), then bands: Needs attention (Unverified placements, Failed charges, Payouts due, Credits running low), Volume (Impressions, Viewable, Clicks, Spend), Directory (Publishers, Retailers, Users), Catalog (Articles, Citations, Products). No Licensing interest band. |
| `content.html`, `content-detail.html`, `add-article.html`, `edit-content.html` | As V1 (Licensed, Not yet available). No unlicensed detail variant. |
| `citations.html`, `citation-detail.html`, `add-citation-from-content.html`, `edit-citation.html` | As V1: Citations and Utilization tabs, the utilization columns on-site and paid ads only. |
| `publishers.html`, `publisher-detail.html`, `create-publisher.html`, `edit-publisher.html` | Detail tabs: Overview, Profile, Articles, Citations, Placements, Retailers (the block table: retailer, placements, earnings, Allowed toggle, who set it and when), Performance, Financials (earnings by month and payouts, the payout account's status), Pricing (the publisher's share, default or its own, what Geodesix keeps, and a Per $100 of rate card spend table), Users. No Permissions, Requests, Grounding or Billing. Add and Edit: Profile, Logo, Brand assets, Type and color, Pricing (Publisher share %, Starts), Notifications (the summary email's How often and Send to). |
| `retailers.html`, `retailer-detail.html`, `create-retailer.html`, `edit-retailer.html`, `retailer-products.html`, `create-product.html`, `edit-product.html`, `grant-credits.html` | A retailer is created with its brand (name, domain, logo) and its products are added from its Products tab, each with a name, image and URL. Detail tabs: Overview (a row per chosen type with its setup state, and the card's state), Profile, Products, Placements, Performance, Financials (spend, Covered by credits, Billed; Spend by month with Credits and Billed columns; the charges), Credits (the balance and the ledger, Grant credits), Pricing (a discount off the rate card, none by default, the ranges it gives, and a Per $100 of rate card spend table), Domains, Users. Add and Edit carry Pricing (Discount off the rate card %, Starts). Retailers list columns: Retailer, Products, Citations available, Placements, Credits, Setup. No Grounding, no Billing tab (IP filtering is gone), no tracking. |
| `on-site.html`, `on-site-detail.html`, `paid-ads.html`, `paid-ad-detail.html` | Lists across every retailer (tiles: Revenue, the volume, Average rate, count) and the detail pages: Overview (Citation, This placement, Cost as field lists), Output (what the retailer was given), Performance (the pointing chart). The paid ad's Performance is clicks alone; no arrivals. |
| `charges.html`, `payouts.html` | Every charge (date, retailer, description, amount, status: Paid, Failed, Refunded) and every payout (date, publisher, period, amount, status: Sent, Pending, Failed), each with search and Filters. |
| `pricing.html` | The one rate card: On-site (min. spend at max. rate, max. spend at min. rate), Paid ads (the same), Default split (publisher share of rate card spend, 75%, and Geodesix keeps, 25%), each an editable card with Save; then **Overrides**, every publisher share and retailer discount with when it starts, read per $100 of rate card spend as Retailer pays, Publisher earns, Geodesix keeps, and View to the account's Pricing tab. |
| `blocks.html` | Every block: publisher, retailer, set by, when, and Lift. Add a block at the foot: a publisher typeahead, then On Geodesix (a retailer typeahead) or Not on Geodesix (name and website) as choice cards. |
| `users.html`, `invite-user.html`, `edit-user.html`, `login.html`, `profile.html` | As V1; `invite-user` takes `?retailer=` and `?publisher=`, no `?org=`. Profile's Notifications is the admin summary email: Publishers and retailers (All, or Only these), How often, What it covers (Revenue and expenses, New placements, Charges and payouts, New articles and citations), Send to, one Summary preview. |

Gone from admin: Approvals, Licensing interest, Organizations, Brands, Tracking, Grounding, the account switcher in the chip.

## 7. The embed, the link, and tracking

On-site is V1's markup and loader, unchanged:

```html
<div data-gdx-placement="plc_7e2a91c">
  <span data-gdx="quote">I truly hit the jackpot when I discovered Wonderbly's personalized books</span>
  <span data-gdx="source">HuffPost</span>
</div>
<script src="https://cdn.geodesix.com/citations/latest/loader.js" data-gdx-key="ret_7a3f19c2" async></script>
```

Three install routes are documented on every on-site Install tab and on Get started, as tabs inside the card: **Page template** (paste both where the quote should appear), **Google Tag Manager** (the loader as a Custom HTML tag on All Pages; the quote markup still goes in the template, or in a second Custom HTML tag with a trigger on the page it belongs to), **Other** (any tag manager or CMS that can load a script). The loader does the same thing whichever way it arrived.

A paid ad is a redirect link and nothing on the landing page:

```
https://go.geodesix.com/c/plc_a4c9e08
```

We count the click on the redirect and send the shopper to the product's URL (the retailer may append its own `utm_` parameters on the placement's Settings). No loader, no `subId1`, no arrivals, no `gdx_cit`. Installation status for a paid ad is `Unverified` until the first click arrives, then `Viewable`.

What counts is V1's: impression (on page, script initialized), viewable (50% for one second), click (one hit on the redirect, deduplicated per shopper per day). Viewable bills for on-site, clicks bill for paid ads.

## 8. Money and the sample data

- **A card on file is required before the first Use**: Get started collects it as its second rung.
- **Use charges the commitment at once.** On-site: the first 30 days' minimum spend; every 30 days after, usage at the rate or the minimum, whichever is more. Paid ads: the spend once; clicks past it at the locked rate, charged monthly.
- **Credits are drawn first** for on-site charges; a paid ad is always charged to the card.
- **Publishers are paid monthly** for the previous month's usage of their citations at the platform share, 75%, through Stripe Connect.
- **The share is of rate card spend, and overrides come out of Geodesix's share** (V0 batch 1). A publisher earns its share of what the usage costs at the rate card, whatever the retailer paid, so a publisher share above 75% set on the publisher, or a discount off the rate card set on a retailer, both narrow what Geodesix keeps and never what the other party gets. Per $100 of rate card spend: default $100 paid, $75 earned, $25 kept; The Guardian at 80% from Oct 1, 2026: $100, $80, $20; Brooklinen 10% off from Oct 1, 2026: $90, $75, $15. Both start after the sample window, so no 30 day figure changes.
- **Rate card** (admin's Pricing): On-site $50 at $5.00 CPMv to $500 at $3.00 CPMv; Paid ads $10 at $0.50 CPC to $1,000 at $0.10 CPC; the rate is linear between the ends. Publisher share 75%.

### The window

Every 30 day figure is Aug 23 to Sep 21, 2026, the same window V1 draws. The summary email's one month calendar draws those 30 days as one grid, Sunday first (Aug 23, 2026 is a Sunday), with Sep 22 to Sep 30 dashed as still to come.

### Retailer: Wonderbly

wonderbly.com, single brand, key `ret_7a3f19c2`, signed up Jul 14, 2026. Contact Priya Nair, ops@wonderbly.example.com. Card on file: Visa ending 4242, expires 08/2029. Users: Priya Nair (Admin), Tom Ashworth (Read only).

**Products** (nine, each `https://www.wonderbly.com/personalized-products/<slug>`, UK ones under `/uk/`):

| Product | Slug |
|---|---|
| Personalized Dinosaur Book | personalised-dinosaur-book |
| Cocktail Recipe Book | cocktail-recipe-book |
| Lost My Name | lost-my-name-v2-book |
| New Sibling For You | new-sibling-for-you-book |
| Newspaper Birthday Book | uk/…/newspaper-birthday-book |
| Together at Christmas | uk/…/together-at-christmas-book |
| Personalized Astrology Book | uk/…/personalised-astrology-classic-edition-book |
| Our First Father's Day | our-first-fathers-day-book |
| Treasury of Nursery Rhymes | treasury-of-nursery-rhymes-book |

### Publishers (eight, real; people invented, `.example.com`)

Good Housekeeping (goodhousekeeping.com), Cosmopolitan (cosmopolitan.com), Fatherly (fatherly.com), BuzzFeed (buzzfeed.com), HuffPost (huffpost.com), Forbes (forbes.com), The Guardian (theguardian.com), Reviewed (reviewed.com). The publisher persona is Good Housekeeping, Alex Reyes, partners@goodhousekeeping.example.com.

### Articles and citations

| Id | Publisher | Article | Licensed | Citation | Refers to |
|---|---|---|---|---|---|
| A1 | Good Housekeeping | The best Christmas gifts for boys of all ages | Yes | C1 "Bedtime has never looked so fun!" | Personalized Dinosaur Book |
| A2 | Cosmopolitan | 30th birthday gift ideas that go beyond the champagne | Yes | C2 "Dare I say... the perfect way to toast your 30th?" | Cocktail Recipe Book |
| | | | | C3 "Easily the coolest addition to their home bar." | Cocktail Recipe Book |
| A3 | Cosmopolitan | Gift ideas for your sister-in-law | Yes | C4 "thoughtful and the cutest bar cart accessory" | Cocktail Recipe Book |
| A4 | Fatherly | Lost My Name's personalized milestone cards | Yes | C5 "it arrives fully customized and ready to blow their tiny little mind" | Lost My Name |
| A5 | BuzzFeed | The best baby shower gift ideas | Yes | C6 "They're precious for parents-to-be but will also delight the little one" | New Sibling For You |
| A6 | BuzzFeed | Products for your second baby | Yes | C7 "It's a beautiful gift any expectant parent will enjoy." | New Sibling For You |
| | | | | C8 "you better believe I cried the first time we read it to him." | New Sibling For You |
| A7 | HuffPost | Wonderbly's personalized books are the gift I keep coming back to | Yes | C9 "a bestseller and a great gift for just about any adult" | Newspaper Birthday Book |
| | | | | C10 "Perfect for young families" | Together at Christmas |
| | | | | C11 "I truly hit the jackpot when I discovered Wonderbly's personalized books" | Wonderbly (brand) |
| A8 | Forbes | The best personalized gifts | Yes | C12 "This book is literally tailor-made for them" | Personalized Astrology Book |
| A9 | The Guardian | The best Father's Day gifts | Yes | C13 "For that new dad in your life, this customized book is the shortcut to immediate waterworks" | Our First Father's Day |
| A10 | Reviewed | Reading and writing games for kids | Not yet | C14 "a perfect book for families to read together and it makes an amazing gift" | Treasury of Nursery Rhymes |

Article URLs are the real ones from the source list (goodhousekeeping.com/uk/christmas/gift-ideas/g538555/…, cosmopolitan.com/style-beauty/fashion/g31296765/…, g36431101/…, fatherly.com/gear/lost-my-name-fantastic-firsts-personalized-milestone-cards/, buzzfeed.com/hbraga/best-baby-shower-gift-ideas, buzzfeed.com/hbraga/second-baby-products, huffpost.com/entry/wonderbly-books-personalized-gift-idea_l_69362f04e4b0a1c98be27d67, forbes.com/sites/forbes-personal-shopper/article/best-personalized-gifts/, theguardian.com/thefilter-us/2026/jun/13/best-fathers-day-gifts, reviewed.com/parenting/features/reading-and-writing-games-for-kids). Citation ids are `cit_` plus a short hex (C1 `cit_4c1e9a2`, C2 `cit_8394021`, C3 `cit_b71d2e0`, C11 `cit_d05f6a3`, C12 `cit_2e9c47b`, C13 `cit_9a0b8f1`, C7 `cit_6f3a1c8`); they appear in code only. Wonderbly sees 13 citations (nine licensed articles); A10 is admin's only.

### Wonderbly's placements, last 30 days

On-site (all at the platform rate card; names are the retailer's):

| Placement | Id | Citation | Live since | Commitment | Impressions | Viewable | Spend | Installation |
|---|---|---|---|---|---|---|---|---|
| Homepage, HuffPost | plc_7e2a91c | C11 | Aug 14 | $275 per 30 days at $4.00 CPMv | 268,000 | 182,400 | $729.60 | Viewable |
| Dinosaur book, Good Housekeeping | plc_3b8d04f | C1 | Aug 20 | $275 at $4.00 | 38,900 | 24,600 | $275.00 (usage $98.40, billed the minimum) | Viewable |
| Cocktail book, Cosmopolitan | plc_c15e77a | C3 | Aug 20 | $275 at $4.00 | 47,100 | 31,200 | $275.00 (usage $124.80) | Viewable |
| New Sibling, BuzzFeed | plc_9d41b6e | C7 | Sep 2 | $50 at $5.00 | 29,800 | 18,900 | $94.50 | Viewable |
| Astrology book, Forbes | plc_52f0c3d | C12 | Sep 6 | $50 at $5.00 | 22,400 | 14,300 | $71.50 | Viewable |
| Father's Day book, The Guardian | plc_e8a6d12 | C13 | Sep 20 | $50 at $5.00 | 0 | 0 | $50.00 (prepaid, nothing counted yet) | Unverified |

On-site totals: 6 placements, 406,200 impressions, 271,400 viewable, $1,495.60.

Paid ads:

| Ad | Id | Citation | Created | Commitment | Clicks | Spend | Installation |
|---|---|---|---|---|---|---|---|
| Cocktail book, Meta ads | plc_a4c9e08 | C2 | Aug 12 | $505 prepaid at $0.30 CPC (spent by Sep 9) | 2,140 | $642.00 | Viewable |
| Dinosaur book, Meta ads | plc_1f7b2d5 | C1 | Sep 14 | $10 prepaid at $0.50 CPC | 26 | $13.00 | Viewable |

Paid ad totals: 2 ads, 2,166 clicks, $655.00, average $0.30 per click.

**Spend, 30 days: $2,150.60** (on-site $1,495.60, paid ads $655.00). Covered by credits $700.00, Billed $1,450.60. The dashboard's three tiles: Spend $2,150.60, Paid ad clicks 2,166, On-site impressions 406,200. Daily spend for the calendar is roughly $72 a day, heavier in September; the busiest day is Sep 19 ($325.40, two renewals) and the lightest Aug 24 ($41.10).

**Credits**: $500.00 granted Jul 14, 2026 (Onboarding, Evan Appleby), used up Aug 27; $1,000.00 granted Sep 1, 2026 (Pilot extension, Evan Appleby), expires Sep 1, 2027. Ledger since Sep 1: Sep 1 grant +$1,000.00 (1,000.00); Sep 2 New Sibling, BuzzFeed, first 30 days −$50.00 (950.00); Sep 6 Astrology book, Forbes −$50.00 (900.00); Sep 13 Homepage, HuffPost, renewal −$275.00 (625.00); Sep 19 Dinosaur book, Good Housekeeping, renewal −$275.00 (350.00); Sep 20 Father's Day book, The Guardian, first 30 days −$50.00 (300.00). Balance $300.00.

**Charges** (the card, Visa 4242): Aug 12 Cocktail book, Meta ads, prepaid $505.00 Paid; Aug 14 Homepage, HuffPost, first 30 days $275.00 Paid; Aug 20 Dinosaur book, Good Housekeeping, first 30 days $275.00 Paid; Aug 20 Cocktail book, Cosmopolitan, first 30 days $275.00 Paid; Sep 1 August paid ad clicks past prepaid $0.00 (none) is not a row; Sep 14 Dinosaur book, Meta ads, prepaid $10.00 Paid; Sep 19 Cocktail book, Cosmopolitan, renewal $275.00 Paid; Oct 1 September paid ad clicks past prepaid $140.00 Upcoming. A charge list is what hit the card and is not the 30 day spend figure; the two are different windows and the pages do not claim they add up.

### The other retailers (admin and the publisher side only)

Brooklinen (brooklinen.com), Glossier (glossier.com), Allbirds (allbirds.com), all single brand DTC, no product or citation detail drawn. Their 30 day spend: Brooklinen $1,420.00, Glossier $610.00, Allbirds $240.00. Platform revenue 30 days $4,420.60; expenses (75%) $3,315.45. Placements across the platform: on-site 16 (Wonderbly 6, Brooklinen 5, Glossier 3, Allbirds 2), paid ads 7 (2, 3, 1, 1). Blocks: Good Housekeeping blocked Allbirds on Aug 30 (Alex Reyes); BuzzFeed blocked Glossier on Sep 12 (admin, Evan Appleby, at BuzzFeed's request); Good Housekeeping blocked Bargain Barn (bargainbarn.example.com, not on Geodesix) on Sep 18 (Alex Reyes).

### Good Housekeeping's earnings, last 30 days

| Retailer | Placements of yours | On-site impressions | Clicks | Retailer spend | Earnings (75%) |
|---|---|---|---|---|---|
| Brooklinen | 3 | 148,000 | 380 | $550.00 | $412.50 |
| Wonderbly | 2 | 38,900 | 26 | $288.00 | $216.00 |
| Glossier | 2 (one on-site, one paid ad) | 48,600 | 90 | $185.00 | $138.75 |
| Allbirds | 0 (blocked Aug 30) | 0 | 0 | $0.00 | $0.00 |

Totals: earnings $767.25, on-site impressions 235,500, clicks 496. The dashboard's tiles: Earnings $767.25, Paid ad clicks 496, On-site impressions 235,500. Payouts: July $604.10 sent Aug 5; August $812.40 sent Sep 5; September pending (paid Oct 5). Payout account: Stripe, bank ending 6789, connected Jun 30, 2026. Users: Alex Reyes (Admin), Dana Okafor (Read only).

### Admin

Staff: Evan Appleby (Admin), Jordan Miles (Admin), Sam Whitfield (Read only). Directory counts: 8 publishers, 4 retailers, 11 users. Catalog: 10 articles (9 licensed), 14 citations, 9 products (Wonderbly's; the others' products are not drawn and their counts read 0 with a muted zero). Needs attention: 1 unverified placement older than 7 days (none of Wonderbly's; Allbirds has one from Sep 8), 1 failed charge (Glossier, Sep 15, $185.00, card declined, retried Sep 17 Paid), payouts due Oct 5 (8), credits running low: none.

## 9. How it was built

The V1 port was copied, not redrawn. `v0-retailer/web/wireframe/style.css` is `v1-retailer`'s stylesheet in whole with a V0 additions block (the admin's `.inlineform`, `.mail-ent` and `.scopelist`), and the same file sits in all three surfaces; each `nav.js` is `v1-retailer`'s with the V0 nav, chip and banner, the account switcher taken out and the choice cards controller added. Every page was copied from its V1 counterpart and cut down to this document, or drawn new where V1 had nothing (the dashboards' calendar, Billing's Charges and Card tabs, the publisher's Retailers and Payouts, admin's Charges, Payouts, Pricing and Blocks). Registry: `v0` is the third key in `tools/comments/pages.js`; `status-v0.html` and `comment-summary-v0.html` are its report pages; `migrate-v0.sql` inserts its status rows; the launcher leads with V0.
