type
concept
created
Tue Apr 07 2026 02:00:00 GMT+0200 (Central European Summer Time)
updated
Tue Apr 07 2026 02:00:00 GMT+0200 (Central European Summer Time)
sources
raw/articles/PRD
tags
newsletter email buyer-engagement output-layer

Newsletter Generation

abstract
The newsletter is the primary buyer interface in MVP -- personalized, visibility-filtered HTML emails delivered on a daily, weekly, or on-match basis, containing exact matches, close matches, container proposals, and exclusivity items.

Overview

In the MVP, buyers do not have a self-service web portal. The personalized newsletter IS the buyer's view into the marketplace. Each newsletter is generated per-buyer, filtered through geographic visibility rules, and organized into sections by match quality. The newsletter is generated by Celery beat tasks and sent via email with tracking for delivery, opens, clicks, and bounces.

Newsletter Sections

Each newsletter contains up to four sections:

1. Exact Matches (score >= 90)

Full details for each item: paper type, GSM, width, quantity, grade, price (adjusted for buyer's region), mill trust score, surplus source. CTA buttons: "View Details" and "I'm Interested." Includes an exclusivity badge with countdown timer if the buyer has an active exclusivity window.

2. Container Proposals

If the buyer has matched surplus from multiple sources that can be combined, the newsletter shows proposed containers. Each proposal includes: item count, total weight, container utilization percentage, total value, and a freight comparison showing combined container freight vs. individual lot shipping costs. CTA buttons: "View Proposal" and "Accept Container." See wiki/concepts/container-assembly.

3. Close Matches (score 70-89)

Compact list with fewer details. CTA: "View All Close Matches."

4. Coming Soon (pre-production items)

Future availability with estimated dates, for items where is_pre_production = true. CTA: "Express Interest." See wiki/concepts/pre-production-announcements.

Personalization Rules

Element Personalization
Subject line Includes buyer name and top match: "Carlos, 5 Kraftliner lots match your specs"
Greeting "Hi {buyer.contact_name}"
Match content Only items matching buyer's active BuyerSpecs
Visibility filter Only items buyer is allowed to see per geographic rules
Price display Adjusted for buyer's region (base price + geographic adjustment)
Freight estimate Based on buyer's delivery port or city
Currency Displayed in buyer's preferred currency
Language English in V1; multilingual planned for V2+

Delivery Schedule

Frequency Trigger Min Items Max Items
daily Celery beat at 08:00 UTC 3 20
weekly Celery beat Monday 08:00 UTC 3 50
on_match New match with score >= 80 1 10
exclusivity Exclusivity granted (always immediate) 1 1

Key rules:

Tracking and Metrics

Metric Implementation
Delivered Email service delivery confirmation
Opened 1x1 tracking pixel embedded in HTML
Clicked Redirect URL wrapping each CTA link
Bounced Email service bounce notification
Unsubscribed Footer unsubscribe link sets buyer.newsletter_active = false

The Newsletter entity stores: status (generated / sent / delivered / opened / clicked / bounced / failed), sent_at, opened_at, clicked_at, trigger (scheduled / new_match / exclusivity / manual), match_count, and container_proposal_count.

Technical Implementation

Newsletters are generated by a @shared_task in Celery:

  1. Query active, newsletter-subscribed buyers with the matching frequency
  2. For each buyer, get active matches (visibility-filtered)
  3. If matches < minimum threshold for the frequency, skip
  4. Get any pending container proposals
  5. Render HTML using the newsletter template (table-based layout for email client compatibility at 600px width)
  6. Create Newsletter record
  7. Queue async email send

The HTML template is designed for compatibility across Gmail, Outlook, and Apple Mail using table-based layout (not flexbox/grid).

Newsletter as Primary Interface

This is a deliberate architectural decision. In the MVP phase, the newsletter replaces what would traditionally be a web dashboard for buyers. The rationale:

In V1+, buyers get a web portal (Angular) alongside newsletters, but the newsletter remains a core engagement channel.

Sources

Related