# Wishdeal Factory buyer-path - iteration 15 ship log

**Date:** 2026-05-10 (continued autonomous /loop, post-midnight)

## What shipped

### New scripts on `ubuntu@40.160.2.121`

| File | Purpose | Cron |
|---|---|---|
| `aggregate-views.py` | Reads events.jsonl, filters internal IPs (40.160.2., 127., 10., 172.16-31, 192.168.) and HeadlessChrome / bot UAs and test slugs. Aggregates per-slug counts (last 24h, 7d, all-time). Writes `/srv/sites/factory/view-counts.json` (public) + `/srv/sites/factory/admin/view-counts.json` (admin with top_7d). | `*/10` |
| `regen-adopt-pages.py` | 178 `/factory/adopt/<slug>/` pages. Companion to /factory/unlock/<slug>/. Explains $99-$199 adopt scope: dossier + code starter + brand kit + copy library + outreach pack. Email-capture form posts tier="adopt" to /api/intent. | 50 hourly |
| `patch-catalog-trending.py` | Patches catalog to read view-counts.json and add "trending" badge to products with last_7d >= 5 external views. Marker `WD_FACTORY_PRICING_BLOCK_v1`. | one-time |
| `patch-inbox-views.py` | Patches operator inbox to surface "Top viewed (last 7 days)" table reading from admin view-counts.json. | one-time |

### Live URLs

- 178 new https://wishdeal.com/factory/adopt/`<slug>`/ pages (companion to unlock)
- https://wishdeal.com/factory/view-counts.json - LIVE public view-count data (currently empty - filtered all internal traffic)
- https://wishdeal.com/factory/admin/view-counts.json - LIVE admin view-count data with top_7d sorted list
- Catalog now displays "Trending" badge on products with 5+ external views in last 7 days
- Operator inbox now has "Top viewed products (last 7 days)" section

### View-tracking pipeline

Events come in via /api/event from page-loaded JS tracker (with bot filter + 10-min throttle per browser per slug).

The aggregator filters:
- Server IP (40.160.2.121) - HeadlessChrome screenshot job
- Loopback / private IP ranges
- Bot user agents (HeadlessChrome, bot, crawl, spider, preview, fetch, curl, python)
- Test slugs (start with "test")

Result: of 178 events recorded since iter 14, **0 were external** (all internal screenshot/test traffic). When Wes pushes traffic to the catalog, real views accumulate and:
- "Trending" badges appear on catalog cards (5+ views/week threshold)
- Top-viewed table shows in operator inbox
- Friday digest can highlight the most-viewed of the week

### Hero polish

In flight: top 151-200 batch. 148/200 done.

## What's now better

1. **Adopt-tier has its own landing page** - was just a button on unlock pages; now `/factory/adopt/<slug>/` explains exactly what's in the $99-$199 tier with 6-cell what's-included grid and $99 vs $199 comparison.
2. **The view-tracking pipeline is closed end-to-end.** Page load → /api/event → events.jsonl → aggregate every 10 min → view-counts.json → catalog "Trending" badge + operator inbox top-viewed.
3. **Internal traffic is filtered** so Wes sees real buyer signal, not snap-products.sh's HeadlessChrome.
4. **Operator inbox now shows top-viewed products** alongside intent captures + feedback - one screen for "what's working."

## What still needs work

- **Stripe wiring** still pending Wes's keys. Adopt-tier email-capture works; checkout doesn't.
- **Hero polish 151-200** in flight.
- **Real external traffic** to validate the trending badges.

## Next 5 recommended autonomous tasks

1. **Hero polish 151-200 finish.**
2. **Stripe wiring** when keys arrive.
3. **Site-wide catalog refinement** based on real traffic (when it arrives).
4. **Affiliate link generator** - if a network contact unlocks a dossier from Wes's curated URL, track + credit.
5. **Long-tail SEO content** - blog posts about each category linking to the catalog.

## Files changed inventory

- New: 1 aggregator + 1 page generator + 2 patchers
- New: 178 `/srv/sites/factory/adopt/<slug>/index.html`
- New: `/srv/sites/factory/view-counts.json` (public)
- New: `/srv/sites/factory/admin/view-counts.json` (admin)
- Modified: `regen-catalog-v2.py` (trending badge logic; backup `.bak.before-trending`)
- Modified: `regen-operator-inbox.py` (top-viewed section; backup `.bak.before-views`)
- Modified: crontab (2 new entries)

## Cumulative iter1-iter15 numbers

- **50+ buyer-facing or admin pages** live
- **6 Node API routes** (intent, dossier, mint-token, feedback, stripe-webhook, event)
- **3 Wes-side CLIs** + Friday newsletter + launch announcement + view aggregator
- **All 179 products** with full buyer-path artifacts
- **159/179** with brand identity
- **148/179** with polished hero copy (top 100 + top 101-148 in flight)
- **50/179** with /vs/ comparison pages
- **178/179** with /adopt/ companion pages
- **172 OG images** + 1 catalog OG card
- **Repair queue: 96% avg complete**
- **75 broken internal links**
- **~93 active cron entries**
- **6 real intent captures** + 2 feedback + 178 view events (all internal so far)
