From 3b248871c23e670578dec94a827fe1e1243cddbb Mon Sep 17 00:00:00 2001 From: Deeman Date: Wed, 25 Feb 2026 16:12:56 +0100 Subject: [PATCH] docs: update CHANGELOG and PROJECT.md for follow-up scheduling, activity timeline, and noindex features Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 18 ++++++++++++++++++ PROJECT.md | 2 ++ 2 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d034bf3..f7b1b55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] ### Added +- **Outreach follow-up scheduling + activity timeline** — extends the outreach pipeline (migration 0024): + - **Migration 0025** — adds `follow_up_at TEXT DEFAULT NULL` to `suppliers` and `noindex INTEGER NOT NULL DEFAULT 0` to `articles` + - **Follow-up date picker** (`POST /admin/outreach//follow-up`) — HTMX date input on each outreach row; sets/clears `follow_up_at`; returns updated row via outerHTML swap + - **Follow-up due banner** on `/admin/outreach` — amber alert banner shows count of overdue follow-ups with "Show them" link (`?follow_up=due` filter) + - **`?follow_up=due` / `?follow_up=set` filters** in `get_outreach_suppliers()` — querystring params passed through dashboard and results partial + - **`get_follow_up_due_count()`** query function counts suppliers with `follow_up_at <= date('now')` + - **Activity timeline** on `/admin/suppliers/` — merges sent outreach emails (`email_log WHERE email_type='outreach'`) and received emails (`inbound_emails`) matched by `contact_email`; sorted by date descending; max 50 entries; empty state shown when no history + - 29 new tests (follow-up CRUD, due count, due filter, timeline with sent+received, timeline empty state) + +- **pSEO article noindex** — prevents thin-data articles from diluting crawl budget and index quality: + - **`NOINDEX_THRESHOLDS` dict** in `content/__init__.py` — per-template lambda: `city-pricing` (venue_count < 3), `city-cost-de` (data_confidence < 1.0), `country-overview` (total_venues < 5) + - **`generate_articles()` upsert** now evaluates the threshold and stores `noindex = 1` for articles that fail it; existing articles are updated on re-generation + - **``** injected in `article_detail.html` head block when `article.noindex` is truthy + - **Sitemap exclusion** — `sitemap.py` articles query adds `AND noindex = 0`; thin-data articles excluded from `sitemap.xml` + - **pSEO dashboard noindex card** — 4th summary card shows count of noindex articles (amber highlight when > 0) + - **Article row noindex badge** — amber pill badge on `partials/article_row.html` when `a.noindex` + - 20 new tests (threshold unit tests per template, sitemap exclusion, article detail robots meta tag) + - **Outreach pipeline** — cold B2B supplier outreach isolated from transactional emails: - **Separate sending domain** (`hello.padelnomics.io`) — added `"outreach"` key to `EMAIL_ADDRESSES`; reputation isolated from `notifications.padelnomics.io` magic-link/lead-forward traffic (manual DNS step: add domain in Resend dashboard) - **Migration 0024** — 4 new columns on `suppliers`: `outreach_status`, `outreach_notes`, `last_contacted_at`, `outreach_sequence_step`; `NULL` status = not in pipeline (no backfill needed for existing suppliers) diff --git a/PROJECT.md b/PROJECT.md index 40af1aa..51e3f32 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -114,6 +114,8 @@ - [x] **Lead matching notifications** — `notify_matching_suppliers` task on quote verification + `send_weekly_lead_digest` every Monday; one-click CTA token in forward emails - [x] **Migration 0022** — `status_updated_at`, `supplier_note`, `cta_token` on `lead_forwards`; supplier respond endpoint; inline HTMX lead detail actions; extended quote form fields - [x] **Outreach pipeline** (`/admin/outreach`) — cold B2B supplier outreach with separate sending domain (`hello.padelnomics.io`), 6-stage pipeline cards, HTMX inline status + note editing, CSV import, bulk add-to-pipeline from supplier list, compose integration (auto-updates pipeline on send); migration 0024 adds 4 outreach columns to suppliers; 44 tests +- [x] **Outreach follow-up scheduling + activity timeline** — `follow_up_at` date column on suppliers (migration 0025), HTMX date picker on outreach rows, amber "follow-ups due" banner with `?follow_up=due` filter, activity timeline on supplier detail merging sent + received emails by contact email; 29 tests +- [x] **pSEO article noindex** — `noindex` column on articles (migration 0025), `NOINDEX_THRESHOLDS` per-template lambdas in `content/__init__.py`, robots meta tag in `article_detail.html`, sitemap exclusion, pSEO dashboard count card + article row badge; 20 tests ### SEO & Legal - [x] Sitemap (both language variants, `` on all entries)