Issues / #82
Build nimsforestquoteportal — serve proposals to prospects
proposed
feature
Priority: high
Project: nimsforestquoteportal
Reporter: cederik
26 Mar 2026 16:32
Description
## Context
Nectar (sales nim) produces business cases but has no way to serve them externally. The ecommerce flow handles self-service, but custom proposals need a branded public portal where prospects can read and accept quotes.
## What it does
- Stores quotes in SQLite (markdown content, prospect details, status, expiry)
- Serves branded public pages at quote.nimsforest.com/q/{token}
- Renders markdown business cases in gardener-tone branding
- Accept button redirects to Stripe checkout (via nimsforeststripe)
- After payment: provisions forest (Pantheon org + landregistry)
- Tracks engagement: viewed, accepted, expired
- Taproot integration: tap.quoteportal.quotes.create/update/status
- Wind events: quoteportal.quote.created/viewed/accepted/expired
## Architecture
Nectar → tap.quoteportal.quotes.create → SQLite + token → public URL → prospect reads → accepts → Stripe → provisioning
## Stack
- Go CLI (cobra + yaml config + systemd)
- SQLite (modernc.org/sqlite, WAL mode)
- goldmark (markdown rendering)
- nimsforestwebcomponents (Tailwind, HTMX)
- Wind/NATS (taproot + events)
- Stripe integration via nimsforeststripe
## Port: 8098
## Domain: quote.nimsforest.com
## Related issues
- #77 Growth Engine Sprint playbook
- #78 Salix prospect
Nectar (sales nim) produces business cases but has no way to serve them externally. The ecommerce flow handles self-service, but custom proposals need a branded public portal where prospects can read and accept quotes.
## What it does
- Stores quotes in SQLite (markdown content, prospect details, status, expiry)
- Serves branded public pages at quote.nimsforest.com/q/{token}
- Renders markdown business cases in gardener-tone branding
- Accept button redirects to Stripe checkout (via nimsforeststripe)
- After payment: provisions forest (Pantheon org + landregistry)
- Tracks engagement: viewed, accepted, expired
- Taproot integration: tap.quoteportal.quotes.create/update/status
- Wind events: quoteportal.quote.created/viewed/accepted/expired
## Architecture
Nectar → tap.quoteportal.quotes.create → SQLite + token → public URL → prospect reads → accepts → Stripe → provisioning
## Stack
- Go CLI (cobra + yaml config + systemd)
- SQLite (modernc.org/sqlite, WAL mode)
- goldmark (markdown rendering)
- nimsforestwebcomponents (Tailwind, HTMX)
- Wind/NATS (taproot + events)
- Stripe integration via nimsforeststripe
## Port: 8098
## Domain: quote.nimsforest.com
## Related issues
- #77 Growth Engine Sprint playbook
- #78 Salix prospect
Comments (1)
nebula
26 Mar 2026 16:45
Grooming: set priority to high, changed project from nimsforest2 to nimsforestquoteportal
Nebula's reasoning: This is a new standalone service with its own repo, port (8098), and domain (quote.nimsforest.com) — it's not a modification to nimsforest2. Priority set to high because it's the delivery mechanism for the Growth Engine Sprint: without it, Nectar-generated proposals have no way to reach prospects. Directly tied to active sales pipeline (#77, #78).
Nebula's reasoning: This is a new standalone service with its own repo, port (8098), and domain (quote.nimsforest.com) — it's not a modification to nimsforest2. Priority set to high because it's the delivery mechanism for the Growth Engine Sprint: without it, Nectar-generated proposals have no way to reach prospects. Directly tied to active sales pipeline (#77, #78).