What's New
Everything we've shipped and what's coming next.
Released
Dashboard Coming Soon Cards & Demand Capture
Grower and buyer dashboards now preview upcoming capabilities with "coming soon" cards. Each card has an "I want this" button that captures demand signal via PostHog, so we build what users actually want first.
- Grower dashboard: Block Portfolio, Yield Forecasting, and Contract Management preview cards
- Buyer dashboard: Sourcing Programs, AI Matchmaker, and Grower Relationships preview cards
- PostHog demand capture: "I want this" button fires feature_interest_clicked event per card
- Nav role detection falls back to account_contacts when JWT lacks active_account_id
- Dashboard fallback redirect changed from gated /listings to public landing page
Multi-Select Pricing Filters & Client-Side Filtering
Pricing dashboard now filters entirely client-side with multi-select dropdowns for region, varietal, and vintage. Searchable dropdowns, varietal name cleaning, and trend chart aggregation by vintage year.
- Multi-select filters for region, varietal, and vintage replace single-select dropdowns
- Client-side filtering with useTransition for responsive INP during filter changes
- Searchable multi-select dropdown component with type-ahead filtering
- Varietal name cleaning: strips CDFA footnote markers, page-break artifacts, and formatting cruft from 25 years of data
- Trend chart aggregates by vintage year instead of plotting raw data points
- Region coverage disclosure shows which AVAs are included in each region selection
- Charts stacked vertically at full width for better readability
- Cascading filter options: varietals update based on selected regions
Filter UX Simplify & Varietal Search
Simplified the browse page filter bar, promoted search to first-class status, added varietal search, and made certifications region-aware. Map controls consolidated into two clean overlays.
- Search bar promoted to fixed header — always visible, never scrolls away
- Filter bar collapsed: varietal dropdown, price range, and tonnage always visible; harvest, Brix, practices, certifications behind 'More Filters'
- Varietal search: type 'Cab' in the search bar to instantly filter by Cabernet Sauvignon
- Region-aware certifications: only shows certs present in the current map viewport
- Map Legend & Terrain combined into one bottom-left control; Map Layers as its own collapsible top-left panel
- Vineyard boundaries always on — removed from layer toggle
- Search dropdown no longer reopens after selecting a result
Positioning Analysis & Founder Voice
Analyzed Rob's Grapora Story narrative against the live site, upgraded copy across landing page, About page, and email templates with founder credibility, and backfilled 25 years of CDFA crush report pricing data.
- Positioning analysis report: every claim in Rob's narrative mapped to Live/Overstated/Coming/Missing with copy gaps and accuracy audit
- Landing page 'Why Grapora' section now leads with founder experience: 'We've spent over a decade placing fruit...'
- About page: founder blockquote and Grapora name etymology (grape + agora) added to 'Why now' section
- Welcome email rewritten with founder voice instead of generic brand copy
- Market Pulse weekly email now opens with editorial framing line
- CDFA crush report historical backfill: 25 years of pricing data (2000-2024) across all 17 California districts
- New district column on price_data_points with unique constraint for idempotent pipeline re-runs
- Pagination fix for pricing queries: handles PostgREST 1000-row limit
Admin Content Browser
Rob and admins can now browse personas, persona journeys, and email templates directly from the admin dashboard — read-only views of the system content that powers Grapora.
- Personas tab: 5 user personas with collapsible sections (Who, Situation, Goals, Success Criteria)
- Journeys tab: 5 persona journeys with expandable steps showing routes, evaluation criteria, and persona lens
- Email Templates tab: all 10 transactional email templates with live HTML preview via iframe
- Zero JavaScript UI — all expand/collapse uses native HTML details/summary
- Error isolation: content loading failures never break the operational admin tabs
- Tab bar now scrolls horizontally to accommodate 10 tabs on narrow screens
Sprint 1 Finalize
Post-registration UX fixes, filter data sync, conversion funnel improvements, and test coverage for launch readiness.
- Role selection (Grower/Buyer/Other) on registration form with pill-style buttons
- Post-registration and login redirect to /market/pricing instead of dead-end /dashboard loop
- Coming Soon page shows pricing CTA for signed-in users instead of redundant email form
- Sync varietal filter list with canonical source of truth: added Albariño, Gamay, Pinot Blanc, Pinot Gris
- Add Register button to logged-out marketing nav (desktop and mobile)
Branded Auth Emails
All Supabase auth emails now use Grapora's branded template with vineyard green header, harvest gold CTAs, and consistent typography.
- 13 branded email templates for all Supabase auth flows (signup, reset, invite, magic link, security notifications)
- Templates version-controlled in supabase/templates/ and deployed via supabase config push
- config.toml uses env(NEXT_PUBLIC_SITE_URL) so pushes never overwrite production Site URL
- Security notifications enabled for password changes and email changes
Legal Pages
Terms of Service, Privacy Policy, Cookie Policy, and Disclaimer pages for launch readiness.
- Terms of Service with acceptable use rules for marketplace conduct
- Privacy Policy covering CCPA rights and N<3 data suppression rule
- Cookie Policy documenting Supabase auth and PostHog analytics cookies
- Disclaimer establishing Grapora as marketplace facilitator, not transaction party
- Shared legal page layout with consistent typography and contact info
- Footer updated with legal page links
Email Launch Readiness
Production email infrastructure for April 15 launch. Welcome emails, delivery tracking, CAN-SPAM compliance, and admin visibility into subscribers and email activity.
- Welcome email sent automatically on waitlist signup, branded with Grapora design system
- SendGrid domain authentication, link branding, and custom SMTP for auth emails from @grapora.com
- SendGrid event webhook tracks delivery, bounces, opens, clicks, and unsubscribes
- Admin dashboard Subscribers tab with stats cards and recent signups table
- Email activity section with send history and delivery metrics
- CAN-SPAM compliant footer on all 10 email templates: physical address, support contact, conditional unsubscribe
- List-Unsubscribe headers on marketing emails for native Gmail/Outlook unsubscribe
- Sender displays as "Grapora" instead of bare email address
- Logo hardcoded to production URL so it renders correctly in all environments
Auth Redirect Fix
Fixes sign-out and forgot-password redirecting to localhost:3000 in production instead of the correct origin.
- Sign-out redirect now derives origin from the request URL, matching the pattern used by middleware and auth callback
- Forgot-password reset link now uses the browser's actual origin instead of a potentially missing env var
- Both fixes work correctly across localhost, Vercel preview deploys, and production
Marketing Copy & Middleware Routing Fix
Repositions the landing page around the marketplace vision, fixes production 404s on /login and /market/pricing caused by the marketing hostname rewrite catching app routes.
- Landing page hero reframed as marketplace platform: "Where growers and buyers find each other"
- Removed consultant-negative language from pricing copy
- Added platform vision tagline and about page link to Why Grapora section
- Updated bottom CTA to "Join us on the journey" with upcoming features list
- Matt Hallett bio updated: Seattle tech startup builder with WA wine industry roots
- Fixed middleware rewrite that 404'd /login, /market/pricing, and other app routes on grapora.com
- Added /pricing and /deal-outcome to auth bypass list for faster public page loads
Data Expansion: Real Ingestion + Profile Enrichment
The data pipeline goes live. Five state license databases ingested and matched against 20K+ accounts, 25K vineyard polygons from OpenStreetMap, CDFA and Oregon Wine Board pricing by varietal, CSWA sustainability certifications, and a full geocoding backfill that puts 94% of accounts on the map.
- State license ingestion for CA ABC (7,389), OR OLCC (2,265), WA WSLCB (985), TX TABC (1,105), and MO ATC (53) with auto-matching, admin review queue, and new account creation
- 9,000+ state licenses linked to vineyard accounts, visible on profile pages with license number, type, DBA, and status
- CDFA Grape Crush Report pricing: 2,682 varietal-level rows across 107 varietals and 17 CA districts (2023-2025)
- Oregon Wine Board Census pricing: 56 varietal-by-region rows including Pinot Noir at $2,800/ton
- CSWA certified sustainable scraper: 202 wineries with address, website, county extracted from detail pages, 151 certifications auto-merged
- 25,437 OpenStreetMap vineyard polygons ingested to staging via Overpass API
- Geocoding backfill placed 1,205 organic-sourced ghost vineyards on the map across all 50 US states
- County backfill via Mapbox reverse geocoding filled 3,820 empty county fields
- Cross-source deduplication found 2,445 TTB-vs-organic duplicate pairs, 195 auto-merged at 90%+ confidence
- Completeness scoring now includes license, certification, and parcel bonuses
- Regional Pricing section on profiles now shows real CDFA and Oregon Wine Board varietal data instead of Coming Soon
Phase 9 Foundation: Data Expansion Schema + Entity Matching
Infrastructure for the data expansion phase: new staging tables, production tables for licenses, certifications, and parcels, Jaro-Winkler entity matching with admin review queue, and account classification fields.
- Five new staging tables (state licenses, certifications, county parcels, OSM vineyards, historical pricing) with upsert RPCs
- Three production tables: vineyard_licenses, vineyard_certifications, vineyard_parcels linked by vineyard_id
- Entity match queue with confidence scoring, field-level match explanations, and admin dashboard tab
- Account classification fields: is_winery, is_vineyard, account_kind with auto-sync trigger and backfill
- Jaro-Winkler entity matching library with normalize, score, classify, and explain functions
- Ingestion scripts for all five source categories following Phase 7 staging patterns
- Merge pipeline with auto-merge (90%+), admin queue (70-89%), and ignore (<70%) thresholds
Map-Driven Browse
Browse is now truly map-first. The listings page follows the live viewport, separates active listings from wineries and vineyards, and makes it much easier to explore a region without getting lost in mismatched counts or stale results.
- The /listings experience now fetches live results from the current map bounds instead of relying on a static server-rendered list
- New bbox-aware browse APIs and spatial RPCs keep listings, wineries, and vineyards scoped to the visible map region
- Layer controls now split Active Listings, Wineries, and Vineyards so directory exploration matches what is actually on the map
- Universal search now supports wineries, vineyards, AVAs, counties, and zip codes, with keyboard navigation in the dropdown
- Directory cards and map popups now classify winery versus vineyard records consistently and fly the map to the selected result
- Single winery and vineyard markers now use icon-based map pins with red listing badges, while clusters remain numeric circles
- The browse legend now explains the current marker language and cluster counts directly on the map
- QA and review follow-ups fixed first-paint layer counts, hydration issues, duplicate layer controls, and stale browse copy
Market Pricing V2
Pricing now lives under the new Market section, with region-aware filtering, clearer deterministic summaries, and a cleaner path toward broader market intelligence features.
- New /market/pricing route becomes the canonical home for pricing intelligence
- Legacy /pricing now permanently redirects to /market/pricing
- Top navigation and footer pricing links now point to the Market section
- Pricing filters now support a first-pass region model on top of the existing AVA dataset
- The pricing summary panel now uses clearer 'Market Summary' language and adds region-aware framing
- PDF report downloads now preserve the active market filter context, including region
- New route, dashboard, filter, and export tests cover the Market Pricing migration
Directory Bug Fixes + Entity Classification
The directory gets smarter: winery and grower pins are now color-coded on the map, search selections fly you to the right location, and filters actually update the directory view.
- Entity classification: winery pins (green), organic (sage), claimed (gold), unknown (gray)
- Search selection flies map to the selected vineyard location
- Directory toggle renamed to 'Directory' with correct count display
- Filter changes now properly refetch directory data
- Vineyard count indicator fixed — shows accurate count on mode switch
- permit_type column added to vineyards table from TTB data
Directory & Vineyard Profiles
Every US vineyard now has a public profile page on Grapora. Browse 10K+ vineyards on a clustered national map, see TTB permits, organic certifications, and regional pricing context — all without creating an account. The data moat is live.
- National vineyard directory with clustered Mapbox pins and text search
- Toggle between Active Listings and All Vineyards modes on the browse page
- Vineyard profile pages at /vineyards/[id] with SSR, SEO meta, and JSON-LD structured data
- Data completeness scoring (0-100) showing how much is known about each vineyard
- Freshness indicators on every data field — see the source and when it was last updated
- Regional NASS grape pricing context on each profile
- Nearby vineyard recommendations (More in this AVA)
- Codex review: 5 findings fixed (county scoping, AVA guards, harvest window cutoff)
Federal Data Ingestion
Real federal data now flows into Grapora — TTB permits, USDA organic certifications, NASS grape pricing, and CDL vineyard polygons replace demo data with authoritative government sources.
- TTB permit ingestion with Mapbox geocoding creates real vineyard profiles
- USDA Organic Integrity Database overlay for organic certification status
- NASS Quick Stats API integration for county-level grape pricing
- CDL GeoTIFF processing via Python sidecar for vineyard polygon footprints
- Staging-to-production merge script with duplicate detection
Geospatial Infrastructure
Added spatial search so buyers can find vineyards near a location — the foundation for map-based discovery and future AVA boundary intelligence.
- PostGIS spatial column on vineyards table with GIST index and automatic lat/lng sync trigger
- find_vineyards_near(lat, lng, radius_km) RPC function for proximity search
- Python CDL sidecar script for converting USDA CropScape GeoTIFF to vineyard GeoJSON
- Four staging tables (TTB, NASS, organic, CDL) with idempotent upsert functions and soft-delete pattern
- data_source enum for distinguishing demo vs real data
Geography and Polish
Rebuilt the browse experience around a Zillow-style map with real-time filtering — making it fast and intuitive to find fruit by location, varietal, and certification.
- Zillow-style viewport-pinned map with paginated listings panel
- Dynamic panel height adapts to filter bar expand/collapse
- Multi-select filters for AVA, varietal, region with international support
- Map style switcher (Light, Satellite, Streets, Terrain)
- Quantity, harvest month, and certification filters
- Design review fixes: harvest gold accent, 44px touch targets, focus-visible rings, reduced-motion support
Security
- Codex adversarial review findings addressed
- admin_hidden enforced in listings SELECT RLS policy
- Migration filenames renumbered to timestamp format for Supabase CLI
Dashboards, Admin, and Secondary Features
Every user role now has a home base — growers manage listings, buyers track saved searches, and admins moderate the marketplace. Plus PDF one-pagers and automated market digests.
- Grower dashboard with listings table, view/inquiry counts, and profile editor with photo upload
- Buyer dashboard with 3-tab navigation, saved search management, and introduction history
- Admin dashboard with overview metrics, price data management, and listings moderation
- Listing PDF one-pager generation via @react-pdf/renderer
- Market Pulse weekly digest cron job with alert matching
- Deal outcome tracking form, API, and follow-up email templates
- HMAC token helpers for secure unsubscribe links
Price Intelligence, Contact Flow, and Demand Engine
Growers and buyers can now see what grapes are actually worth — with historical pricing, confidence scoring, and AI insights. Plus the first real transaction flow: introductions between growers and buyers.
- CDFA Crush Report parser and normalizer with canonical variety lookup
- Pricing dashboard with trend charts, sortable AVA table, and URL-param filters
- Confidence scoring and AI insight panel for price data
- Introduction (inquiry) flow with email dispatch
- Saved search API with alert matching logic and unsubscribe flow
- Harvest expiry reminder cron job
- 6 branded SendGrid email templates (intro confirmation, alerts, market pulse, harvest reminder, etc.)
Listings, Public Browse, and Map
The core marketplace experience: growers can create listings, and anyone can browse, filter, and explore inventory on an interactive map.
- 3-step listing creation wizard with block picker and progress bar
- Listing browse page with Mapbox GL JS map, clustering, and popups
- Listing detail page with full block data and sticky price panel
- FilterBar and FilterDrawer with AVA, varietal, price range, and status filters
- Grower profile card and similar blocks recommendations
- Listing API routes (CRUD) and daily expiry cron endpoint
- Marketing landing page with waitlist and survey forms
Auth and Role-Based Registration
The foundation: secure sign-up with role selection, route protection, and analytics from day one.
- Supabase auth with role-based registration (grower, buyer, admin)
- handle_new_user trigger with role whitelist to prevent admin escalation
- Server-only admin Supabase client for privileged operations
- Route guard middleware with role-based redirects
- Dashboard layout shells for all three roles
- Login, register, password reset, and callback pages
- PostHog analytics integration
Initial Setup
Project scaffold with the full tech stack wired up — Next.js, Supabase, Tailwind, and the Grapora design system.
- Next.js 16 (App Router) project scaffold
- Supabase schema with profiles, growers, vineyards, blocks, listings, buyers tables
- DESIGN.md design system (DM Sans + Instrument Serif, earth-tone palette)
- Tailwind CSS 4 with design token CSS custom properties
- .env.local.example with all required service keys
Have a feature request?
hello@grapora.com