From cc7d36962f9f442f321c65bedf8e233e7bc2dfe3 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Apr 2026 18:00:15 +0000 Subject: [PATCH 1/2] feat: add StrainChain cannabis vertical marketing layer (AuthiChain + QRON) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a dedicated StrainChain vertical marketing layer that fuses AuthiChain (blockchain authentication) and QRON (identity art) into a single cannabis-native protocol at strainchain.io. - marketing/strainchain/{README,intake,demo-mapping}.md — vertical-specific marketing docs with cannabis persona routing and intake SLAs - app/strainchain/demos/{cultivator,lab,dispensary,consumer,regulator}/ page.tsx — persona demo flows, each carrying a Problem/Solution/ Business Value marketing header and the StrainChain green theme - app/strainchain/demos/page.tsx — persona demo index gallery - outputs/strainchain-demo-manifest.json — canonical vertical manifest with why/value per persona and cross-references to the storymode manifest - app/strainchain/page.tsx + app/solutions/cannabis/page.tsx — marketing header blocks prepended to the existing cannabis surfaces - marketing/README.md + demo-mapping.md — cross-linked StrainChain vertical so the top-level marketing docs discover the cannabis persona tree https://claude.ai/code/session_01KVRDpKE5mdZdujmyp7BAPC --- app/solutions/cannabis/page.tsx | 6 + app/strainchain/demos/consumer/page.tsx | 112 +++++++++++++ app/strainchain/demos/cultivator/page.tsx | 113 +++++++++++++ app/strainchain/demos/dispensary/page.tsx | 112 +++++++++++++ app/strainchain/demos/lab/page.tsx | 112 +++++++++++++ app/strainchain/demos/page.tsx | 194 ++++++++++++++++++++++ app/strainchain/demos/regulator/page.tsx | 113 +++++++++++++ app/strainchain/page.tsx | 6 + marketing/README.md | 18 ++ marketing/demo-mapping.md | 21 +++ marketing/strainchain/README.md | 130 +++++++++++++++ marketing/strainchain/demo-mapping.md | 64 +++++++ marketing/strainchain/intake.md | 82 +++++++++ outputs/strainchain-demo-manifest.json | 79 +++++++++ 14 files changed, 1162 insertions(+) create mode 100644 app/strainchain/demos/consumer/page.tsx create mode 100644 app/strainchain/demos/cultivator/page.tsx create mode 100644 app/strainchain/demos/dispensary/page.tsx create mode 100644 app/strainchain/demos/lab/page.tsx create mode 100644 app/strainchain/demos/page.tsx create mode 100644 app/strainchain/demos/regulator/page.tsx create mode 100644 marketing/strainchain/README.md create mode 100644 marketing/strainchain/demo-mapping.md create mode 100644 marketing/strainchain/intake.md create mode 100644 outputs/strainchain-demo-manifest.json diff --git a/app/solutions/cannabis/page.tsx b/app/solutions/cannabis/page.tsx index bffac76..642ea54 100644 --- a/app/solutions/cannabis/page.tsx +++ b/app/solutions/cannabis/page.tsx @@ -1,3 +1,9 @@ +/** + * Demo: AuthiChain × StrainChain — Cannabis Solution + * Problem: A $7.9B illicit cannabis market is undermining 23 states of licensed operators, and MSOs have no single authentication OS that covers seed-to-sale, lab anchoring, METRC reconciliation, and consumer-facing verification across every state they ship to. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: The AuthiChain × StrainChain cannabis solution gives MSOs and licensed cultivators a single API for every state — Polygon-anchored seed-to-sale chain, lab COA hash anchoring, METRC bridge, scan-to-earn consumer rewards, and brand-protection monitoring across every SKU in the licensed market. + */ export const metadata = { title: 'AuthiChain for Cannabis — StrainChain Supply Chain Authentication', description: 'The only blockchain authentication platform built for cannabis. Seed-to-sale transparency, lab result anchoring, and consumer-facing authenticity verification.' }; export default function CannabisPage() { const stats = [ diff --git a/app/strainchain/demos/consumer/page.tsx b/app/strainchain/demos/consumer/page.tsx new file mode 100644 index 0000000..ef89cc1 --- /dev/null +++ b/app/strainchain/demos/consumer/page.tsx @@ -0,0 +1,112 @@ +/** + * Demo: StrainChain — Consumer + * Problem: Cannabis consumers have almost no way to verify what they paid for — potency, terpenes, origin, and licence status all live on fragile labels and PDFs that are routinely swapped, faked, or out of date. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: Any consumer, on any phone, scans the strain QRON and sees the full lab panel, cultivator story, and licensed chain of custody — and can earn QRON rewards for every authenticated scan, turning verification into a loyalty and community layer for the brand. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demo — Consumer Flow", + description: + "Any phone, any browser. Consumers scan the strain QRON and see lab results, grow story, and scan-to-earn rewards in 2.1 seconds.", +} + +const STEPS = [ + { + icon: "📱", + title: "Scan the strain QRON", + body: "Any phone camera works — no app to download. The strain QRON resolves to an AuthiChain record in 2.1 seconds.", + }, + { + icon: "🧪", + title: "See the full panel", + body: "Potency, terpenes, pesticide and heavy-metal screens, lab signature, and batch date — exactly as the licensed lab submitted them.", + }, + { + icon: "🌱", + title: "See the grow story", + body: "Cultivator facility, cultivar lineage, cure notes, and the branded QRON art. The story that belongs to the product travels with it.", + }, + { + icon: "🎁", + title: "Scan to earn", + body: "Every authenticated scan earns QRON rewards the consumer can redeem on their next dispensary visit. Verification becomes a loyalty loop.", + }, +] + +const OUTCOMES = [ + "2.1-second verification on any phone, no app", + "Full signed lab panel on every scan", + "Grow story + branded QRON art travels with the product", + "Scan-to-earn loyalty rewards in QRON", +] + +const body: CSSProperties = { background: "#080808", color: "#e5e5e5", minHeight: "100vh", fontFamily: "system-ui,sans-serif" } +const nav: CSSProperties = { padding: "16px 32px", display: "flex", alignItems: "center", gap: 16, borderBottom: "0.5px solid rgba(255,255,255,.07)" } +const stepCard: CSSProperties = { background: "rgba(255,255,255,.03)", border: "1px solid rgba(34,197,94,.15)", borderRadius: 14, padding: "22px 20px" } + +export default function ConsumerDemoPage() { + return ( +
+ + +
+
+ 📱 Persona · Consumer +
+

+ Scan it. Trust it. Earn on it. +

+

+ Consumers shouldn’t have to take a label’s word for it. StrainChain lets any phone scan + the strain QRON and see the signed lab panel, grow story, and licensed chain of custody — and rewards + the consumer with QRON every time they verify. +

+
+ +
+
+ {STEPS.map((s, i) => ( +
+
{s.icon}
+
Step {i + 1}
+
{s.title}
+
{s.body}
+
+ ))} +
+
+ +
+
+

What you get

+
    + {OUTCOMES.map((o, i) => ( +
  • + + {o} +
  • + ))} +
+
+ + Try a live consumer scan + + + Other personas + +
+
+
+
+ ) +} diff --git a/app/strainchain/demos/cultivator/page.tsx b/app/strainchain/demos/cultivator/page.tsx new file mode 100644 index 0000000..6bae3d8 --- /dev/null +++ b/app/strainchain/demos/cultivator/page.tsx @@ -0,0 +1,113 @@ +/** + * Demo: StrainChain — Cultivator + * Problem: Licensed cultivators have no clean way to prove that a specific batch — from clone to package — was grown, cured, and handled under their licence, leaving craft flower indistinguishable from diverted product on the shelf. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: Every batch gets a StrainChain identity bound to the cultivator’s AuthiChain licence and packaged with a strain-specific QRON, turning craft provenance into a shelf-level marketing asset and a METRC-ready audit trail. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demo — Cultivator Flow", + description: + "Licensed growers mint a StrainChain batch, bind it to their AuthiChain identity, and ship it with a strain-specific QRON — all in one flow.", +} + +const STEPS = [ + { + icon: "🌱", + title: "Clone → Veg → Flower", + body: "The grow team logs each phase of the life cycle against a StrainChain batch ID. Facility, room, and operator are bound to the cultivator’s AuthiChain identity at every step.", + }, + { + icon: "✂️", + title: "Harvest + cure", + body: "Dry weight, cure conditions, and trim events anchor to the same batch. The ledger is tamper-evident, so re-labelling diverted product becomes impossible.", + }, + { + icon: "🎨", + title: "QRON art for the strain", + body: "A QRON is generated in the cultivar’s visual language — emerald, trichome frost, soil tones — and bound to the batch. It ships on the exit label and certificate.", + }, + { + icon: "📦", + title: "Package + METRC sync", + body: "At package, StrainChain writes the batch to AuthiChain on Polygon and reconciles it with METRC in the same transaction. No manual data entry.", + }, +] + +const OUTCOMES = [ + "Craft batch provenance provable from clone to package", + "Strain-specific QRON art on every exit bag and label", + "METRC + AuthiChain reconciled automatically at package", + "Dispensary buyers can verify your licence before they order", +] + +const body: CSSProperties = { background: "#080808", color: "#e5e5e5", minHeight: "100vh", fontFamily: "system-ui,sans-serif" } +const nav: CSSProperties = { padding: "16px 32px", display: "flex", alignItems: "center", gap: 16, borderBottom: "0.5px solid rgba(255,255,255,.07)" } +const stepCard: CSSProperties = { background: "rgba(255,255,255,.03)", border: "1px solid rgba(34,197,94,.15)", borderRadius: 14, padding: "22px 20px" } + +export default function CultivatorDemoPage() { + return ( +
+ + +
+
+ 🌱 Persona · Cultivator +
+

+ Clone to exit bag, signed forever +

+

+ Licensed cultivators are losing shelf space to diverted product that looks identical on the label. + StrainChain binds every StrainChain batch to your AuthiChain identity and packages it with a + strain-specific QRON — so buyers, budtenders, and consumers can see that what you grew is what + they’re holding. +

+
+ +
+
+ {STEPS.map((s, i) => ( +
+
{s.icon}
+
Step {i + 1}
+
{s.title}
+
{s.body}
+
+ ))} +
+
+ +
+
+

What you get

+
    + {OUTCOMES.map((o, i) => ( +
  • + + {o} +
  • + ))} +
+
+ + Onboard my cultivation facility + + + Other personas + +
+
+
+
+ ) +} diff --git a/app/strainchain/demos/dispensary/page.tsx b/app/strainchain/demos/dispensary/page.tsx new file mode 100644 index 0000000..7b003fe --- /dev/null +++ b/app/strainchain/demos/dispensary/page.tsx @@ -0,0 +1,112 @@ +/** + * Demo: StrainChain — Dispensary + * Problem: Dispensaries receive product from dozens of distributors every week and have no fast way to confirm that every SKU was grown by a licensed cultivator, tested by a licensed lab, and reconciled with METRC before it hits the shelf. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: Budtenders scan each package on receipt and at point of sale — confirming licensed origin, COA integrity, and METRC reconciliation in one tap — and the dispensary turns verification into a loyalty loop with consumer scan-to-earn rewards. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demo — Dispensary Flow", + description: + "Dispensaries scan StrainChain packages on receipt and at POS to confirm licensed origin, COA integrity, and METRC reconciliation in one tap.", +} + +const STEPS = [ + { + icon: "📥", + title: "Receive + scan on intake", + body: "Every incoming package is scanned at the back door. StrainChain confirms the cultivator licence, lab COA, and METRC manifest in 2.1 seconds — bad product never reaches the floor.", + }, + { + icon: "📚", + title: "Shelf-level proof", + body: "Budtenders see a live verification badge on every SKU. They can show a customer the full seed-to-sale chain on a tablet in seconds.", + }, + { + icon: "💳", + title: "Scan-to-sell at POS", + body: "At checkout, the POS scan signs the final custody event and binds the sale to the buyer’s optional loyalty profile.", + }, + { + icon: "🎁", + title: "Scan-to-earn loyalty", + body: "Customers scan the strain QRON after they leave and earn QRON rewards that can be redeemed on their next visit — the scan becomes a repeat-visit driver.", + }, +] + +const OUTCOMES = [ + "Receiving speed: 5× faster than manual manifest checks", + "Zero unlicensed or unreconciled SKUs on the shelf", + "Built-in scan-to-earn loyalty engine powered by QRON", + "Audit-ready on the spot for state inspectors", +] + +const body: CSSProperties = { background: "#080808", color: "#e5e5e5", minHeight: "100vh", fontFamily: "system-ui,sans-serif" } +const nav: CSSProperties = { padding: "16px 32px", display: "flex", alignItems: "center", gap: 16, borderBottom: "0.5px solid rgba(255,255,255,.07)" } +const stepCard: CSSProperties = { background: "rgba(255,255,255,.03)", border: "1px solid rgba(34,197,94,.15)", borderRadius: 14, padding: "22px 20px" } + +export default function DispensaryDemoPage() { + return ( +
+ + +
+
+ 🏪 Persona · Dispensary +
+

+ Scan to stock, scan to sell +

+

+ Dispensaries are drowning in manifests. StrainChain turns receiving and POS into a single-tap + verification: licensed cultivator, signed COA, METRC reconciled. No EDI, no integration pain — just + a scan that resolves to an AuthiChain record in 2.1 seconds. +

+
+ +
+
+ {STEPS.map((s, i) => ( +
+
{s.icon}
+
Step {i + 1}
+
{s.title}
+
{s.body}
+
+ ))} +
+
+ +
+
+

What you get

+
    + {OUTCOMES.map((o, i) => ( +
  • + + {o} +
  • + ))} +
+
+ + Partner my dispensary + + + Other personas + +
+
+
+
+ ) +} diff --git a/app/strainchain/demos/lab/page.tsx b/app/strainchain/demos/lab/page.tsx new file mode 100644 index 0000000..5e8f619 --- /dev/null +++ b/app/strainchain/demos/lab/page.tsx @@ -0,0 +1,112 @@ +/** + * Demo: StrainChain — Lab + * Problem: State-licensed cannabis testing labs issue thousands of COAs each month on paper and PDF, and those certificates are routinely altered, swapped, or re-used on product that was never actually tested. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: Every COA is hashed and anchored to AuthiChain at upload, bound to the lab’s licence, and linked to the StrainChain batch — so dispensaries, regulators, and consumers can all verify that the potency, terpenes, and pesticide screens on the label are the ones the lab actually signed. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demo — Lab Flow", + description: + "State-licensed cannabis labs upload a COA and the hash is anchored to AuthiChain, bound to the StrainChain batch, and exposed to every downstream scanner.", +} + +const STEPS = [ + { + icon: "🧪", + title: "Run the panel", + body: "The lab runs its standard potency, terpene, pesticide, and heavy-metals panels and generates the COA in its LIMS.", + }, + { + icon: "⬆️", + title: "Upload to StrainChain", + body: "A single upload (PDF or JSON) hashes the COA and binds it to the StrainChain batch ID on-chain. The lab’s AuthiChain identity signs the submission.", + }, + { + icon: "🔒", + title: "Anchored on Polygon", + body: "The COA hash, panel results, and timestamp are written to the shared AuthiChainNFT contract on Polygon (optional Bitcoin Ordinal for premium batches).", + }, + { + icon: "📲", + title: "Verifiable everywhere downstream", + body: "From that moment, every dispensary, regulator, and consumer scan against the strain QRON surfaces the lab’s signed results — immutably bound to the batch.", + }, +] + +const OUTCOMES = [ + "Every COA hash anchored on-chain at the moment of upload", + "Lab licence bound to every result you sign", + "Zero PDF forgery risk downstream", + "Regulator dashboards consume your results directly", +] + +const body: CSSProperties = { background: "#080808", color: "#e5e5e5", minHeight: "100vh", fontFamily: "system-ui,sans-serif" } +const nav: CSSProperties = { padding: "16px 32px", display: "flex", alignItems: "center", gap: 16, borderBottom: "0.5px solid rgba(255,255,255,.07)" } +const stepCard: CSSProperties = { background: "rgba(255,255,255,.03)", border: "1px solid rgba(34,197,94,.15)", borderRadius: 14, padding: "22px 20px" } + +export default function LabDemoPage() { + return ( +
+ + +
+
+ 🧪 Persona · Lab +
+

+ One upload, forever verifiable +

+

+ Paper and PDF COAs get altered, swapped, or re-used on product that was never tested. StrainChain + hashes and anchors every lab result to AuthiChain at the moment of upload, binding your licence to + the panel — so nobody downstream can fake your signature. +

+
+ +
+
+ {STEPS.map((s, i) => ( +
+
{s.icon}
+
Step {i + 1}
+
{s.title}
+
{s.body}
+
+ ))} +
+
+ +
+
+

What you get

+
    + {OUTCOMES.map((o, i) => ( +
  • + + {o} +
  • + ))} +
+
+ + Integrate my lab + + + Other personas + +
+
+
+
+ ) +} diff --git a/app/strainchain/demos/page.tsx b/app/strainchain/demos/page.tsx new file mode 100644 index 0000000..ee06049 --- /dev/null +++ b/app/strainchain/demos/page.tsx @@ -0,0 +1,194 @@ +/** + * Demo: StrainChain — Persona Demo Index + * Problem: Every cannabis actor (cultivator, lab, dispensary, consumer, regulator) has a different authentication workflow, and prospects need a single entry point to see how StrainChain — AuthiChain + QRON fused for cannabis — solves their specific piece of the seed-to-sale problem. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: A curated persona gallery that lets any cannabis operator self-qualify into the flow that matches their licence and pain — and convert into a pilot, partnership, or custom strain QRON in a single click. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demos — Cannabis Persona Flows", + description: + "Pick your cannabis persona — cultivator, lab, dispensary, consumer, or regulator — and walk the StrainChain authentication flow built on AuthiChain + QRON.", +} + +const PERSONAS = [ + { + href: "/strainchain/demos/cultivator", + icon: "🌱", + persona: "Cultivator", + headline: "Seed to package, signed on-chain", + pitch: + "Licensed growers mint a StrainChain batch, bind it to facility identity, and package it with a strain-specific QRON.", + }, + { + href: "/strainchain/demos/lab", + icon: "🧪", + persona: "Lab", + headline: "COA anchoring in one upload", + pitch: + "State-licensed labs upload a COA and the hash is anchored on-chain. Every terpene, potency, and pesticide screen is immutable.", + }, + { + href: "/strainchain/demos/dispensary", + icon: "🏪", + persona: "Dispensary", + headline: "Scan to stock, scan to sell", + pitch: + "Budtenders scan on receipt to confirm licensed origin and lab compliance before the product hits the shelf — no EDI required.", + }, + { + href: "/strainchain/demos/consumer", + icon: "📱", + persona: "Consumer", + headline: "Scan to verify, scan to earn", + pitch: + "Any phone, any browser. Customers scan the strain QRON and see lab results, grow story, and scan-to-earn rewards in 2.1 seconds.", + }, + { + href: "/strainchain/demos/regulator", + icon: "⚖️", + persona: "Regulator", + headline: "Audit trail in one query", + pitch: + "State cannabis boards query a full METRC-reconciled, blockchain-anchored audit trail across every licensed SKU in the state.", + }, +] + +const pageBody: CSSProperties = { + background: "#080808", + color: "#e5e5e5", + minHeight: "100vh", + fontFamily: "system-ui,sans-serif", +} + +const nav: CSSProperties = { + padding: "16px 32px", + display: "flex", + alignItems: "center", + gap: 16, + borderBottom: "0.5px solid rgba(255,255,255,.07)", +} + +const card: CSSProperties = { + background: "rgba(255,255,255,.03)", + border: "1px solid rgba(34,197,94,.15)", + borderRadius: 16, + padding: "24px 22px", + textDecoration: "none", + color: "inherit", + display: "block", +} + +export default function StrainChainDemosIndexPage() { + return ( +
+ + +
+
+ Cannabis persona demos +
+

+ Pick your cannabis persona +

+

+ StrainChain is AuthiChain + QRON fused into a single cannabis-native protocol. Every persona below + walks through how the stack authenticates a batch in 2.1 seconds from a different seat in the supply + chain. Pick the one closest to your licence — or book a briefing if you need a custom strain QRON. +

+
+ +
+
+ {PERSONAS.map((p) => ( + +
{p.icon}
+
+ {p.persona} +
+
{p.headline}
+
{p.pitch}
+
+ Walk the flow → +
+
+ ))} +
+ +
+

Need a custom strain QRON or MSO pilot?

+

+ Tell us your licence, state, and use case through the cannabis intake and we’ll design a + StrainChain flow that maps to your exact workflow. +

+ + Request a StrainChain briefing + +
+
+ + +
+ ) +} diff --git a/app/strainchain/demos/regulator/page.tsx b/app/strainchain/demos/regulator/page.tsx new file mode 100644 index 0000000..cff2093 --- /dev/null +++ b/app/strainchain/demos/regulator/page.tsx @@ -0,0 +1,113 @@ +/** + * Demo: StrainChain — Regulator + * Problem: State cannabis control boards (California BCC, Colorado MED, Michigan LARA, and 20+ others) depend on METRC data that is manually entered, easy to falsify, and disconnected from the physical packages on dispensary shelves. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: Regulators get a read-only audit dashboard that reconciles METRC with the AuthiChain-anchored StrainChain ledger, exposes every unlicensed or tampered SKU in the state, and lets field inspectors scan any package to confirm provenance in under 3 seconds. + */ +import type { CSSProperties } from "react" + +export const metadata = { + title: "StrainChain Demo — Regulator Flow", + description: + "State cannabis boards get a read-only audit dashboard reconciling METRC with the AuthiChain-anchored StrainChain ledger across every licensed SKU in the state.", +} + +const STEPS = [ + { + icon: "🗂️", + title: "Connect the state seat", + body: "Each state regulator is granted a read-only StrainChain seat bound to their agency identity. METRC API keys are passed through, nothing is copied.", + }, + { + icon: "🔎", + title: "Reconcile against AuthiChain", + body: "StrainChain joins METRC manifests against the on-chain ledger. Unlicensed cultivators, missing COAs, and tamper events bubble to the top of the dashboard.", + }, + { + icon: "📡", + title: "Field inspectors scan", + body: "Inspectors scan any strain QRON in the field. In under 3 seconds they see licence, COA signature, and full custody chain — no laptop required.", + }, + { + icon: "📝", + title: "Export audit trail", + body: "A complete, signed, EPCIS-style audit trail is exported on demand — ready for court filings, enforcement actions, and FOIA responses.", + }, +] + +const OUTCOMES = [ + "Read-only AuthiChain + METRC reconciliation dashboard", + "Field-ready QRON scan for any inspector in under 3 seconds", + "Unlicensed / tampered SKUs surfaced automatically", + "Court-ready audit trails exported in a single click", +] + +const body: CSSProperties = { background: "#080808", color: "#e5e5e5", minHeight: "100vh", fontFamily: "system-ui,sans-serif" } +const nav: CSSProperties = { padding: "16px 32px", display: "flex", alignItems: "center", gap: 16, borderBottom: "0.5px solid rgba(255,255,255,.07)" } +const stepCard: CSSProperties = { background: "rgba(255,255,255,.03)", border: "1px solid rgba(34,197,94,.15)", borderRadius: 14, padding: "22px 20px" } + +export default function RegulatorDemoPage() { + return ( +
+ + +
+
+ ⚖️ Persona · Regulator +
+

+ Audit the whole state in one query +

+

+ State cannabis control boards can’t see what’s actually on the shelf. StrainChain gives + regulators a read-only dashboard that reconciles METRC against the on-chain ledger — so unlicensed + SKUs, missing COAs, and tamper events surface automatically, and field inspectors can verify any + package in under 3 seconds. +

+
+ +
+
+ {STEPS.map((s, i) => ( +
+
{s.icon}
+
Step {i + 1}
+
{s.title}
+
{s.body}
+
+ ))} +
+
+ +
+
+

What you get

+
    + {OUTCOMES.map((o, i) => ( +
  • + + {o} +
  • + ))} +
+
+ + Book a regulator briefing + + + Other personas + +
+
+
+
+ ) +} diff --git a/app/strainchain/page.tsx b/app/strainchain/page.tsx index ee58ae8..1f9af0a 100644 --- a/app/strainchain/page.tsx +++ b/app/strainchain/page.tsx @@ -1,3 +1,9 @@ +/** + * Demo: StrainChain — Cannabis Vertical Landing + * Problem: The legal cannabis industry has no unified authentication layer — cultivators, labs, dispensaries, consumers, and regulators each rely on paper COAs, easily altered METRC manifests, and disconnected compliance tools that leave the whole seed-to-sale chain open to diversion and fraud. + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: StrainChain is the AuthiChain + QRON stack packaged as a cannabis-native vertical at strainchain.io — COA anchoring, METRC sync, seed-to-sale chain, and strain-specific QRON art that gives every licensed operator a dispensary-ready, regulator-ready, consumer-ready authentication layer in one protocol. + */ import type { CSSProperties } from "react" export const metadata = {title:"StrainChain — Cannabis Supply Chain Authentication",description:"Blockchain seed-to-sale compliance for cannabis."} type Feat = {icon:string;t:string;d:string} diff --git a/marketing/README.md b/marketing/README.md index b9b00b1..4310213 100644 --- a/marketing/README.md +++ b/marketing/README.md @@ -72,6 +72,23 @@ Use the intake form when: fields populated. 5. Link the new demo from the `/demos` index page. +## Verticals + +Some industries justify a dedicated **vertical** that fuses AuthiChain and +QRON into a single product experience. Each vertical gets its own +sub-folder under `marketing/` with its own `README.md`, `intake.md`, and +`demo-mapping.md`, plus its own persona demos under `app//demos/` +and its own `outputs/-demo-manifest.json`. + +| Vertical | Domain | Folder | Demos | Manifest | +|----------|--------|--------|-------|----------| +| **StrainChain** (cannabis) | [strainchain.io](https://strainchain.io) | [`marketing/strainchain/`](./strainchain/) | `app/strainchain/demos/*` | `outputs/strainchain-demo-manifest.json` | + +To add a new vertical, mirror the StrainChain structure: create +`marketing//`, add persona demos under +`app//demos//page.tsx`, and ship a matching +`outputs/-demo-manifest.json`. + ## File index | File | Purpose | @@ -79,3 +96,4 @@ Use the intake form when: | [`README.md`](./README.md) | This file — marketing system overview | | [`intake.md`](./intake.md) | Inbound intake form + internal triage rules | | [`demo-mapping.md`](./demo-mapping.md) | Industry → demo path mapping table | +| [`strainchain/`](./strainchain/) | StrainChain (cannabis vertical) marketing layer | diff --git a/marketing/demo-mapping.md b/marketing/demo-mapping.md index 4f98525..92af909 100644 --- a/marketing/demo-mapping.md +++ b/marketing/demo-mapping.md @@ -30,6 +30,27 @@ marketing, sales, and engineering can see the gap at a glance. | Cannabis | /app/demos/cannabis | _not yet implemented_ | ⏳ Planned | | Collectibles | /app/demos/collectibles | _not yet implemented_ | ⏳ Planned | +## Verticals — persona demos + +Beyond the industry demos above, AuthiChain also ships **vertical** +products that fuse AuthiChain + QRON into a single cannabis-native, art- +native, or sector-native protocol. Each vertical has its own persona demo +tree. The cannabis vertical is **StrainChain** at +[strainchain.io](https://strainchain.io). + +| Vertical | Persona | Demo Path | +|----------|---------|-----------| +| StrainChain | Cultivator | /app/strainchain/demos/cultivator | +| StrainChain | Lab | /app/strainchain/demos/lab | +| StrainChain | Dispensary | /app/strainchain/demos/dispensary | +| StrainChain | Consumer | /app/strainchain/demos/consumer | +| StrainChain | Regulator | /app/strainchain/demos/regulator | + +See [`marketing/strainchain/demo-mapping.md`](./strainchain/demo-mapping.md) +for the full StrainChain persona table and +[`outputs/strainchain-demo-manifest.json`](../outputs/strainchain-demo-manifest.json) +for the canonical persona manifest with `why`/`value` metadata. + ## How to add a new demo 1. Create `app/demos//page.tsx`. diff --git a/marketing/strainchain/README.md b/marketing/strainchain/README.md new file mode 100644 index 0000000..c258653 --- /dev/null +++ b/marketing/strainchain/README.md @@ -0,0 +1,130 @@ +# StrainChain Marketing System + +StrainChain is the **cannabis vertical** of the Authentic Economy — it fuses +two systems this repo already ships: + +- **AuthiChain** for the blockchain authentication layer (COAs, seed-to-sale + chain, on-chain pedigree) +- **QRON** for the AI-generated, brand-aligned identity art that lives on + every cannabis package, label, and certificate + +Together they form a single cannabis-native protocol at **strainchain.io**. +This directory is the single source of truth for how StrainChain presents +its demos, intake, and investor story inside the repository. + +## Purpose + +The StrainChain marketing layer exists to make the cannabis vertical +**self‑documenting, dispensary‑ready, and regulator‑friendly**: + +- Every cannabis persona flow on the site has a matching marketing header + that states *the problem*, *the AuthiChain + QRON solution*, and *the + business value*. +- Every StrainChain-specific demo is tagged with `why` and `value` metadata + in `outputs/strainchain-demo-manifest.json`, so investors, regulators, and + dispensary partners can see exactly what a flow unlocks. +- A shared intake form captures inbound cannabis enquiries (cultivators, + labs, dispensaries, MSOs, regulators) and routes them to the right + persona flow. +- A persona → demo mapping table gives every stakeholder a one-glance view + of which cannabis actors have live flows and where the code lives. + +## How StrainChain combines AuthiChain + QRON + +``` +┌──────────────┐ anchors ┌──────────────┐ labels ┌──────────────┐ +│ AuthiChain │ ───────────▶│ StrainChain │ ◀────────── │ QRON │ +│ (chain / │ │ (cannabis │ │ (identity │ +│ contracts) │ │ vertical) │ │ art layer) │ +└──────────────┘ └──────────────┘ └──────────────┘ + │ │ │ + ▼ ▼ ▼ + COA + seed-to-sale METRC sync, Strain-specific + ledger on Polygon / dispensary verify, QRONs on every + Bitcoin Ordinal MSO multi-state API pack & certificate +``` + +Every cannabis demo walks the same loop: + +1. **Cultivate** — licensed cultivator mints a StrainChain batch, linked to + the facility’s AuthiChain identity. +2. **Test** — the lab uploads the COA and the hash is anchored on-chain. +3. **Package** — QRON generates a strain-specific identity that ships on + the label, bound to the AuthiChain batch record. +4. **Distribute** — every custody hand-off (cultivator → distributor → + dispensary) is signed on-chain and reconciled with METRC. +5. **Dispense** — the budtender scans at POS to confirm licensed provenance + and compliance. +6. **Verify** — the consumer scans the QRON with any phone and sees lab + results, strain story, and scan-to-earn rewards in 2.1 seconds. + +## Cannabis persona flows + +Each persona under `app/strainchain/demos//page.tsx` targets a +single cannabis actor with its own workflow. Use the canonical mapping in +[`demo-mapping.md`](./demo-mapping.md). + +| Persona | Who it’s for | +|--------------|---------------------------------------------| +| Cultivator | Licensed growers and craft flower producers | +| Lab | State-licensed testing laboratories | +| Dispensary | Recreational and medical retail storefronts | +| Consumer | Adult-use and medical patients | +| Regulator | State cannabis control boards (METRC, BCC) | + +## How to use the intake form + +All inbound cannabis — dispensary partnerships, cultivator onboarding, +lab integrations, MSO pilots, regulator briefings — flows through a single +Airtable intake form. See [`intake.md`](./intake.md) for the form link and +cannabis-specific triage instructions. + +Use the intake form when: + +- A licensed dispensary wants a StrainChain partnership or pilot. +- A cultivator or MSO wants to onboard their SKUs with strain QRONs. +- A testing lab wants to integrate COA anchoring. +- A state regulator asks for an audit-ready briefing. +- A cannabis brand wants a custom strain QRON. + +## How to write a new persona demo with a marketing header + +1. Create `app/strainchain/demos//page.tsx` following one of the + existing persona demos (`cultivator`, `lab`, `dispensary`, `consumer`, + `regulator`) as a template. +2. **Prepend a marketing header block** to the very top of the `page.tsx` + file, above any `'use client'` or imports: + + ```tsx + /** + * Demo: StrainChain — + * Problem: <1–2 sentence cannabis-specific problem> + * Solution: AuthiChain + QRON verifies authenticity in 2.1 seconds through the StrainChain protocol. + * Business Value: + */ + ``` + +3. Add a matching row in [`demo-mapping.md`](./demo-mapping.md). +4. Add a matching entry with `why` and `value` fields to + `outputs/strainchain-demo-manifest.json`. +5. Link the new persona from `app/strainchain/demos/page.tsx` (the demos + index). + +## File index + +| File | Purpose | +|------|---------| +| [`README.md`](./README.md) | This file — StrainChain marketing overview | +| [`intake.md`](./intake.md) | Cannabis intake form + triage rules | +| [`demo-mapping.md`](./demo-mapping.md) | Persona → demo path mapping table | + +## Related assets in this repo + +- `app/strainchain/page.tsx` — StrainChain landing page +- `app/strainchain/demos/` — persona demo flows (new) +- `app/solutions/cannabis/page.tsx` — AuthiChain × StrainChain cannabis solution page +- `outputs/strainchain-economy-map.md` — tiers, QRON staking, MSO targets +- `outputs/strainchain-demo-manifest.json` — persona demos with `why`/`value` +- `outputs/storymode-demo-manifest.json` — ships the Zkittlez OG StrainChain storymode +- `supabase/migrations/20260407_strainchain_schema.sql` — StrainChain DB schema +- `public/qron/strainchain-zkittlez-qr.svg` — sample strain QRON diff --git a/marketing/strainchain/demo-mapping.md b/marketing/strainchain/demo-mapping.md new file mode 100644 index 0000000..904e742 --- /dev/null +++ b/marketing/strainchain/demo-mapping.md @@ -0,0 +1,64 @@ +# StrainChain Demo Mapping + +This table maps each cannabis **persona** to the persona-flow demo that +exercises its AuthiChain + QRON authentication workflow through the +StrainChain vertical. Use this as the canonical reference when routing +inbound intake requests (see [`intake.md`](./intake.md)) or when writing +investor / regulator / dispensary-facing material that references live +demos. + +## Canonical persona → demo path + +| Persona | Demo Path | +|--------------|-----------------------------------------| +| Cultivator | /app/strainchain/demos/cultivator | +| Lab | /app/strainchain/demos/lab | +| Dispensary | /app/strainchain/demos/dispensary | +| Consumer | /app/strainchain/demos/consumer | +| Regulator | /app/strainchain/demos/regulator | + +## Current implementation status + +Every canonical persona has a dedicated demo surface under +`app/strainchain/demos/*`. The StrainChain landing page at +`app/strainchain/page.tsx` is the public entry point; the demos gallery at +`app/strainchain/demos/page.tsx` is the persona router. + +| Persona | Target path | Current surface | Status | +|--------------|------------------------------------------|---------------------------------------------------|--------| +| Cultivator | /app/strainchain/demos/cultivator | `app/strainchain/demos/cultivator/page.tsx` | Live | +| Lab | /app/strainchain/demos/lab | `app/strainchain/demos/lab/page.tsx` | Live | +| Dispensary | /app/strainchain/demos/dispensary | `app/strainchain/demos/dispensary/page.tsx` | Live | +| Consumer | /app/strainchain/demos/consumer | `app/strainchain/demos/consumer/page.tsx` | Live | +| Regulator | /app/strainchain/demos/regulator | `app/strainchain/demos/regulator/page.tsx` | Live | + +All five persona demos are indexed from `app/strainchain/demos/page.tsx` +and each carries a marketing header block (Problem / Solution / Business +Value) at the top of its source file. + +## Related files + +- `app/strainchain/page.tsx` — StrainChain landing page +- `app/strainchain/demos/page.tsx` — persona demo gallery (entry point) +- `app/solutions/cannabis/page.tsx` — AuthiChain × StrainChain cannabis solution page +- `outputs/strainchain-demo-manifest.json` — canonical manifest with + `why`/`value` metadata per persona +- `outputs/strainchain-economy-map.md` — StrainChain subscription tiers, + QRON staking ladder, MSO targets +- `outputs/storymode-demo-manifest.json` — ships the Zkittlez OG + StrainChain storymode product entry +- `public/qron/strainchain-zkittlez-qr.svg` — sample strain QRON asset + +## How to add a new persona demo + +1. Create `app/strainchain/demos//page.tsx` following one of the + existing persona demos (`cultivator`, `lab`, `dispensary`, `consumer`, + `regulator`) as a template. +2. Prepend the required marketing header block (see + [`README.md`](./README.md) → *How to write a new persona demo with a + marketing header*). +3. Add the new row to the **Canonical persona → demo path** table above. +4. Add a matching entry with `why` and `value` fields to + `outputs/strainchain-demo-manifest.json`. +5. Link the new demo from `app/strainchain/demos/page.tsx` (the demos + index). diff --git a/marketing/strainchain/intake.md b/marketing/strainchain/intake.md new file mode 100644 index 0000000..bcb6bad --- /dev/null +++ b/marketing/strainchain/intake.md @@ -0,0 +1,82 @@ +# StrainChain Marketing & Demo Intake + +## Purpose + +This document is the internal handbook for the **StrainChain (cannabis +vertical)** intake pipeline. Every inbound request for a demo, pilot, +partnership, press briefing, regulator meeting, or custom strain QRON is +collected through a single Airtable form and triaged from there. + +StrainChain shares the same top-level AuthiChain + QRON intake form — with +an additional cannabis-specific triage overlay so the marketing lead can +route by persona, state, and licence status. + +## Intake form + +All requests must be submitted through the Airtable intake form: + +**Form URL:** https://airtable.com/appERlrcb1RcoPdA7/tblVJgLp2K2Rif08B/viwPH8zIn44lFjuc1 + +Submitters should tag their request with `vertical: cannabis` (or mention +StrainChain in the free-text field) so it lands in the StrainChain triage +queue. + +Share this link externally in: + +- Outbound dispensary / MSO sales emails +- Trade-show booths (MJBizCon, Hall of Flowers, CannaCon) +- LinkedIn / Twitter bios for the StrainChain team +- The public `app/strainchain` landing page +- Cannabis-industry press kits and investor decks + +## Cannabis-specific triage rules + +Every cannabis request must be routed by **persona + state + licence +status** before being assigned an owner. Use this matrix: + +| Persona | Route to | Priority rule | +|-------------|----------------------------------|------------------------------------------------| +| Cultivator | Grower onboarding lead | Prioritise licensed craft flower producers | +| Lab | Lab integrations lead | Prioritise ISO-accredited + state-licensed labs| +| Dispensary | Retail partnerships lead | Prioritise MI, CA, CO, IL, NV first | +| MSO | Enterprise / MSO account lead | Always highest priority | +| Consumer | Marketing — no personal follow-up| Route to brand / QRON gallery CTA | +| Regulator | Compliance + policy lead | Escalate to CEO for state-level briefings | + +## Instructions for internal use + +1. **Triage daily.** The marketing lead reviews new cannabis-tagged + submissions every morning and assigns an owner within Airtable. +2. **Confirm licence status** before any dispensary, cultivator, lab, or + MSO follow-up. We only onboard licensed operators — verify the state + licence number before a demo call. +3. **Tag by persona** using the same labels found in + [`demo-mapping.md`](./demo-mapping.md) (cultivator, lab, dispensary, + consumer, regulator). This keeps the demo requests aligned with the + persona flows that live in `app/strainchain/demos/*`. +4. **Link to the matching persona flow.** When an inbound request lands + for a persona that already has a demo, reply with the direct demo URL + (for example `https://strainchain.io/demos/dispensary`). +5. **Escalate custom strain QRONs.** If the request requires a + brand-specific QRON or storymode, create a follow-up task for + engineering and reference the entry that will be added to + `outputs/strainchain-demo-manifest.json` (or + `outputs/storymode-demo-manifest.json` for storymode products). +6. **Never share operator data externally.** Licence numbers, batch IDs, + and submitter details stay inside the Airtable base. Do not forward or + export without written approval from the StrainChain lead. +7. **Close the loop.** Mark the Airtable record as “Delivered” only after + the prospect has received either a live demo, a recorded walkthrough, or + the requested marketing asset. + +## SLA + +| Request type | First response | Delivery target | +|--------------------------------|----------------|-----------------| +| MSO enterprise pilot | 1 business day | 3 business days | +| Dispensary partnership | 1 business day | 5 business days | +| Cultivator onboarding | 1 business day | 5 business days | +| Lab integration enquiry | 2 business days| 5 business days | +| Regulator / policy briefing | 1 business day | 2 business days | +| Press / media | 1 business day | 2 business days | +| Consumer / general cannabis | 2 business days| 5 business days | diff --git a/outputs/strainchain-demo-manifest.json b/outputs/strainchain-demo-manifest.json new file mode 100644 index 0000000..0d26a78 --- /dev/null +++ b/outputs/strainchain-demo-manifest.json @@ -0,0 +1,79 @@ +{ + "vertical": "StrainChain", + "domain": "strainchain.io", + "stack": ["AuthiChain", "QRON"], + "description": "StrainChain is the cannabis vertical of the Authentic Economy — AuthiChain (blockchain authentication) and QRON (identity art) combined into a single cannabis-native protocol that covers seed-to-sale, lab COA anchoring, METRC sync, dispensary verification, consumer scan-to-earn, and regulator audit trails.", + "personas": [ + { + "persona": "Cultivator", + "demo_id": "strainchain-cultivator", + "demo_path": "/app/strainchain/demos/cultivator", + "demo_url": "https://strainchain.io/demos/cultivator", + "headline": "Clone to exit bag, signed forever", + "qron_theme": "Emerald canopy — living soil earth tones, trichome frost, craft grow room", + "why": "Licensed cultivators have no clean way to prove that a specific batch — from clone to package — was grown, cured, and handled under their licence, leaving craft flower indistinguishable from diverted product on the shelf.", + "value": "Every batch gets a StrainChain identity bound to the cultivator's AuthiChain licence and packaged with a strain-specific QRON, turning craft provenance into a shelf-level marketing asset and a METRC-ready audit trail." + }, + { + "persona": "Lab", + "demo_id": "strainchain-lab", + "demo_path": "/app/strainchain/demos/lab", + "demo_url": "https://strainchain.io/demos/lab", + "headline": "One upload, forever verifiable", + "qron_theme": "Clinical teal — sterile precision, analytical glassware, COA seal", + "why": "State-licensed cannabis testing labs issue thousands of COAs each month on paper and PDF, and those certificates are routinely altered, swapped, or re-used on product that was never actually tested.", + "value": "Every COA is hashed and anchored to AuthiChain at upload, bound to the lab's licence, and linked to the StrainChain batch — so dispensaries, regulators, and consumers can all verify that the potency, terpenes, and pesticide screens on the label are the ones the lab actually signed." + }, + { + "persona": "Dispensary", + "demo_id": "strainchain-dispensary", + "demo_path": "/app/strainchain/demos/dispensary", + "demo_url": "https://strainchain.io/demos/dispensary", + "headline": "Scan to stock, scan to sell", + "qron_theme": "Retail emerald — dispensary counter, budtender glow, gold trim", + "why": "Dispensaries receive product from dozens of distributors every week and have no fast way to confirm that every SKU was grown by a licensed cultivator, tested by a licensed lab, and reconciled with METRC before it hits the shelf.", + "value": "Budtenders scan each package on receipt and at point of sale — confirming licensed origin, COA integrity, and METRC reconciliation in one tap — and the dispensary turns verification into a loyalty loop with consumer scan-to-earn rewards." + }, + { + "persona": "Consumer", + "demo_id": "strainchain-consumer", + "demo_path": "/app/strainchain/demos/consumer", + "demo_url": "https://strainchain.io/demos/consumer", + "headline": "Scan it. Trust it. Earn on it.", + "qron_theme": "Sunset green — consumer friendly, strain art, mobile-first glow", + "why": "Cannabis consumers have almost no way to verify what they paid for — potency, terpenes, origin, and licence status all live on fragile labels and PDFs that are routinely swapped, faked, or out of date.", + "value": "Any consumer, on any phone, scans the strain QRON and sees the full lab panel, cultivator story, and licensed chain of custody — and can earn QRON rewards for every authenticated scan, turning verification into a loyalty and community layer for the brand." + }, + { + "persona": "Regulator", + "demo_id": "strainchain-regulator", + "demo_path": "/app/strainchain/demos/regulator", + "demo_url": "https://strainchain.io/demos/regulator", + "headline": "Audit the whole state in one query", + "qron_theme": "State seal green — authoritative, audit-grade, enforcement-ready", + "why": "State cannabis control boards (California BCC, Colorado MED, Michigan LARA, and 20+ others) depend on METRC data that is manually entered, easy to falsify, and disconnected from the physical packages on dispensary shelves.", + "value": "Regulators get a read-only audit dashboard that reconciles METRC with the AuthiChain-anchored StrainChain ledger, exposes every unlicensed or tampered SKU in the state, and lets field inspectors scan any package to confirm provenance in under 3 seconds." + } + ], + "products": [ + { + "product_name": "Zkittlez OG — Indoor Craft Flower (3.5g)", + "storymode_product_id": "a1000001-0001-4000-a000-000000000020", + "storymode_manifest": "outputs/storymode-demo-manifest.json", + "why": "Cannabis consumers and dispensaries cannot easily verify seed-to-sale provenance, lab results, or licensed origin — exposing regulated markets to diversion and untested product.", + "value": "StrainChain links every package to its cultivator licence, lab results, and terpene profile through an AuthiChain QRON, enabling compliant dispensary scanning, brand loyalty, and regulator-ready audit trails." + } + ], + "related_files": [ + "app/strainchain/page.tsx", + "app/strainchain/demos/page.tsx", + "app/solutions/cannabis/page.tsx", + "outputs/strainchain-economy-map.md", + "outputs/storymode-demo-manifest.json", + "supabase/migrations/20260407_strainchain_schema.sql", + "public/qron/strainchain-zkittlez-qr.svg", + "marketing/strainchain/README.md", + "marketing/strainchain/intake.md", + "marketing/strainchain/demo-mapping.md" + ] +} From 36cecd7070402127da7593ed437fddc6fc1ce65e Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Apr 2026 20:07:19 +0000 Subject: [PATCH 2/2] =?UTF-8?q?feat(marketing):=20no-sales-calls=20activat?= =?UTF-8?q?ion=20package=20=E2=80=94=20outreach=20+=20RapidAPI=20+=20launc?= =?UTF-8?q?hes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every piece of this commit is designed to turn existing, already-deployed infrastructure into first revenue WITHOUT any sales calls, demos, pilots, or human conversations. Cold traffic hits a self-serve Stripe checkout or a self-serve developer signup. That's the entire funnel. Context: the repos already contain a $299 AuthiChain BTC Auth product with a live direct Stripe payment link, 18 live /api/v1/* endpoints ready for RapidAPI submission, 15 curated Michigan cannabis operators with named contacts, the outreach-queue-worker Cloudflare Worker deployed, the Make.com scheduler configured, and a 3000/day Resend quota sitting idle. Nothing is missing except ignition. Files added: - marketing/strainchain/cold-email-michigan.md Two variants (90-word primary + 40-word compact A/B) of the Michigan cannabis cold email. Every CTA is either the direct Stripe payment link for the $299 AuthiChain BTC Auth product or the self-serve walkthrough at /strainchain/demos/cultivator. Zero sales-call CTAs. Includes do-not-use list, tier-based send cadence, and 7-day success criteria. - scripts/seed-michigan-outreach.ts TypeScript seed script that hardcodes the 15 Michigan operators from app/outreach/michigan-dispensaries/page.tsx, renders the cold email per-target with personalization, and upserts into Supabase network_contacts + leads tables. Supports dry-run and --commit modes. Includes CAN-SPAM env var validation (refuses to --commit without OUTREACH_PHYSICAL_ADDRESS set). Documents the remaining gap: POSTing each enqueue payload to the outreach-queue-worker. - marketing/strainchain/ACTIVATION.md Step-by-step ignition sequence: fill missing emails, dry-run, commit to Supabase, wire the outreach queue, activate the Make.com scheduler, and monitor the day-7 success criteria. Explicit 'do not add these' list preventing drift back toward sales-call mechanics. - marketing/rapidapi-submission.md Complete pre-filled RapidAPI marketplace submission package. Includes copy-paste-ready listing metadata, long description, tags, pricing tiers (Basic free / Pro $49 / Ultra $199 / Mega $499 per month), Node and curl quickstart code samples, logo candidates from public/, post-submission follow-ups, and an explicit callout that the existing agentz-v5-investor.md claim of 'Live API on RapidAPI marketplace' is currently false and becomes true only after this submission. The underlying Cloudflare worker at authichain-api.undone-k.workers.dev is already live, the OpenAPI 3.0 spec is already current, and the /api/v1/verify route already reads X-RapidAPI-Key. Nothing blocks submission except ~2 hours of copy-paste. - marketing/launch-kit.md Three one-shot cold traffic bursts, one per week: Product Hunt for QRON.space (week 1), Show HN for the AuthiChain API (week 2, post- RapidAPI listing), and Reddit r/ordinals + r/BitcoinMarkets + r/CryptoCurrency for the Bitcoin Ordinal custom QRON product (week 3). Each launch includes pre-written title, body, first-maker comment, prepared answers for expected questions, reddit etiquette rules, timing guidance, and the hard rule that every comment/reply must route back to a self-serve URL (Stripe checkout, RapidAPI signup, direct payment link, or the gallery) and never to a contact form, Calendly, or 'DM me' ask. The single success metric across all five files: $1 earned from a stranger who found the offer through one of these channels. One dollar from one stranger validates the entire no-calls approach, after which scale what worked. https://claude.ai/code/session_01KVRDpKE5mdZdujmyp7BAPC --- marketing/launch-kit.md | 305 +++++++++++++++++++ marketing/rapidapi-submission.md | 230 ++++++++++++++ marketing/strainchain/ACTIVATION.md | 169 ++++++++++ marketing/strainchain/cold-email-michigan.md | 130 ++++++++ scripts/seed-michigan-outreach.ts | 256 ++++++++++++++++ 5 files changed, 1090 insertions(+) create mode 100644 marketing/launch-kit.md create mode 100644 marketing/rapidapi-submission.md create mode 100644 marketing/strainchain/ACTIVATION.md create mode 100644 marketing/strainchain/cold-email-michigan.md create mode 100644 scripts/seed-michigan-outreach.ts diff --git a/marketing/launch-kit.md b/marketing/launch-kit.md new file mode 100644 index 0000000..d8663c5 --- /dev/null +++ b/marketing/launch-kit.md @@ -0,0 +1,305 @@ +# Launch Kit — No-Sales-Calls Cold Traffic Bursts + +Three one-shot launches to drive cold traffic into the self-serve +checkout funnels you already have. Each one is pre-written and can be +fired in ~30 minutes. None of them involve a sales call. + +## The three launches + +| # | Platform | Product | Ask | Expected result | +|---|---|---|---|---| +| 1 | **Product Hunt** | QRON.space (AI QR art) | Upvote + comment | 500–5k visitors in 24h, 10–100 signups | +| 2 | **Show HN** | AuthiChain API | Upvote + technical discussion | 1k–10k visitors, 50–500 RapidAPI signups | +| 3 | **Reddit r/Bitcoin + r/CryptoCurrency** | Bitcoin Ordinal custom QRONs | Upvote + direct purchase | 500–3k visitors, 5–30 direct $49 purchases | + +**Critical rule: do NOT launch all three on the same day.** Space them +one week apart so you can respond to each one's comment thread +individually. Comment response quality is the single biggest driver of +launch success. + +## Prerequisites (do these first) + +- [ ] QRON pricing page bug fixed ✅ (committed in `a3ec874`) +- [ ] `lib/plans.ts` is the single source of truth for prices +- [ ] RapidAPI listing submitted and LIVE (required for launch #2) +- [ ] Product Hunt account warmed up (at least 50 upvotes given, profile + filled out — fresh accounts get throttled) +- [ ] Hacker News account at least 30 days old with some comment history + (fresh accounts get shadow-banned) +- [ ] The 3 Reddit subs you'll post to — lurk for a week first, make 5 + genuine comments, THEN post + +--- + +## Launch #1 — Product Hunt: QRON.space + +**Scheduled for:** Week 1 (after pricing page fix is live) + +**Tagline (60 char max):** +``` +Beautiful AI QR codes, signed on blockchain +``` + +**Description (260 char max):** +``` +QRON turns boring QR codes into AI-generated art that's 100% scannable +and signed on AuthiChain. Upload a brand, pick a style (cyberpunk, +luxury, watercolor, graffiti + 7 more), get an artistic QR. From $29 +one-time. Bitcoin Ordinal inscriptions from $49. +``` + +**Gallery (5 images required):** +1. Hero: a dramatic QRON next to a boring QR, side-by-side +2. Style gallery: the 11 visual modes in a grid +3. "How it works": upload → describe → generate → scan +4. Bitcoin Ordinals section: "permanent on Bitcoin L1" +5. Pricing screenshot (the fixed one from commit `a3ec874`) + +**Maker first comment (post immediately after launch):** +```markdown +Hey Product Hunt! 👋 + +I built QRON because every QR code I've ever seen looks like a bar-code +rejection from 1994. But QR codes are supposed to be the bridge between +the physical and the digital — why do they all look so ugly? + +QRON fixes this. You describe a brand ("Nike swoosh, cyberpunk red"), +pick a style, and QRON generates an AI QR code that's actually beautiful +AND 100% scannable. It uses a pixel-clamping trick to preserve +scannability even at heavy stylization. + +**Three things I'm proud of:** + +1. **Every QRON is signed on AuthiChain** (ERC-721 on Polygon) so + you can prove provenance. Useful for brands protecting against + counterfeit scans. +2. **Bitcoin Ordinal tier** — inscribe your QRON permanently on Bitcoin + L1 for $49. Shows up on ordinals.com, tradeable on Magic Eden. +3. **11 visual modes** — cyberpunk, luxury, watercolor, graffiti, + portrait, miniature, geometric, memory, holographic, NFT mint, static. + +**Free tier** gives you 10 generations/month. First 100 PH users get a +free Starter Pack (100 generations, normally $29) — DM me your email. + +I'll be in the comments all day. Ask me anything about scannability +thresholds, Fal.ai, the pixel-clamping algorithm, Bitcoin inscription +flow, or why I built this. + +Links: +- Live site: https://qron.space +- Pricing: https://qron.space/pricing +- Gallery: https://qron.space/gallery +``` + +**Prepared answers for expected questions:** + +- *"How is this different from a regular QR code?"* → Visual mode + generation + blockchain signing + pixel-clamping for scannability. +- *"Does it actually scan?"* → Yes, 100% by design. We use a clamping + algorithm that preserves the QR data modules even at heavy AI + stylization. Show a scan video. +- *"What's the AuthiChain part?"* → Every QRON gets an ERC-721 cert on + Polygon at generation time. Optional Bitcoin Ordinal inscription for + premium tiers. Gives provenance for brand protection. +- *"How does pricing work?"* → One-time packs ($29/$99/$299) never + expire. Business tier ($49/mo) is unlimited. Free tier is 10/mo. +- *"Can I use this commercially?"* → Yes, all paid tiers include + commercial license. + +**Do NOT in the comments:** +- Ask people to email you +- Offer "custom demos" +- Link a Calendly +- Say "DM me for pricing" + +Every answer should redirect to the site, the pricing page, or the free +tier signup. + +--- + +## Launch #2 — Show HN: AuthiChain API + +**Scheduled for:** Week 2 (AFTER RapidAPI listing goes live) + +**Title:** +``` +Show HN: AuthiChain – Blockchain-backed product verification API (100ms, $0 free tier) +``` + +**Body:** +```markdown +I've been building an API that lets you verify if a physical product is +real. It's backed by an ERC-721 contract on Polygon +(0xc3143254997d48fdc9983d618fb2e10067673eb5) and runs on Cloudflare +Workers so responses are <200ms globally. + +Why I built it: counterfeit goods are a $1.8T/year problem, fake +pharmaceuticals alone kill ~1M people annually, and existing solutions +(holograms, paper COAs, serial number lookups) are trivially forgeable. +I wanted something that was (a) provable on-chain, (b) callable as a +simple HTTP API, and (c) fast enough to run at scan-time in a retail +environment. + +What you get: +- GET /verify?id=... → verify a product by serial/SKU +- POST /verify (with optional NFC hash for higher confidence) +- POST /verify/batch (up to 50 products in one call) +- GET /products/{id}/history → full scan history, geo-tagged +- POST /register → brand-authenticated new product registration +- A few more (brands, leaderboard, health, pricing) + +Pricing: Free tier is 100 requests/month (enough for testing and small +projects). Paid tiers are $49/1k, $199/10k, $499/100k per month with +per-call overages. + +Tech stack: Next.js 15 app at authichain.com, Cloudflare Workers for the +edge API, Polygon for the contract, Supabase for product metadata, +optional Bitcoin Ordinal dual-chain proof for premium SKUs. + +Open to brutal feedback on the endpoint design, the confidence scoring +(currently 0.95 for standard, 0.99 with NFC), and the free-tier limits. + +RapidAPI listing: [LINK] (live, no approval wait) +Docs: https://authichain.com/docs +OpenAPI: https://authichain.com/api/v1/openapi.json +``` + +**Prepared answers:** +- *"Why blockchain? This could be a database."* → Fair. The reason is + tamper-evidence for brand disputes and insurance audits. A database + lets the operator (me) rewrite history; on-chain, I can't. +- *"What happens if you go out of business?"* → The ERC-721 data + persists on Polygon forever. The API is a convenience layer. Anyone + can query the contract directly. +- *"Counterfeits will just copy the QR code."* → Yes, which is why the + verification also returns first-scan geolocation + scan count. If a + QR is scanned simultaneously in Guangzhou and Paris, we flag it. +- *"How do you prevent the brand from lying at registration?"* → We + don't, at the contract level. We rely on brand attestation + legal + enforcement, same as every other provenance system. The value is + that LIES become permanent and auditable. + +**After posting:** +- Stay on the thread for 4–6 hours responding to every comment +- Don't argue with HN trolls. Thank them, address the technical point, + move on. +- Upvote good questions from others on the thread. + +--- + +## Launch #3 — Reddit: Bitcoin Ordinal custom QRONs + +**Scheduled for:** Week 3 + +**Subreddits (post sequentially, one per day):** +1. `r/BitcoinMarkets` (post day 1) +2. `r/ordinals` (post day 2) +3. `r/CryptoCurrency` (post day 3 — be VERY careful with rules, they + auto-remove most things) + +**Title:** +``` +I turned AI-generated QR art into Bitcoin Ordinals — $49 inscription +``` + +**Body:** +```markdown +Been working on this for a few months — a way to inscribe beautiful +AI-generated QR codes as permanent Bitcoin Ordinals on L1. + +Each QRON is: +- AI-generated (11 visual styles — cyberpunk, luxury, watercolor, etc.) +- 100% scannable (pixel-clamping keeps the QR data modules intact) +- Inscribed as a Bitcoin Ordinal via OrdinalsBot +- Viewable permanently on ordinals.com +- Tradeable on Magic Eden + +Why I built it: static QR codes are the ugliest thing on the internet +but they're also the bridge between the physical and digital worlds. +Making them beautiful + permanent on Bitcoin felt like a real use case +for Ordinals that isn't just "PFP on L1." + +Pricing: +- Ordinal Single: $49 (one inscription, direct Stripe checkout) +- AuthiChain BTC Auth: $299 (dual-chain proof: Polygon + BTC for + product verification) +- Collection of 25: $799 (batch inscription + Magic Eden listing) + +Happy to answer questions about the inscription process, how we handle +pixel-clamping to stay under the ~60KB block-space limit, or why I +picked Ordinals over other Bitcoin NFT standards. + +Sample: https://qron.space/gallery +Direct checkout: https://qron.space/pricing (scroll to Bitcoin Ordinals) +``` + +**Reddit etiquette (non-negotiable):** +- No shortened URLs (Reddit auto-flags) +- No affiliate tracking params +- Disclose that you're the maker in the first sentence of your first + comment reply +- Do NOT crosspost to more than 3 subs in a week +- Do NOT post to r/Bitcoin main (maxi subreddit, will brigade downvote + anything with "AI" in the title) + +**Expected outcome:** Most direct purchases will come from r/ordinals +(small but high-intent). r/BitcoinMarkets is broader but lower +conversion. r/CryptoCurrency is a traffic bonanza if the post survives +the auto-mod, otherwise dead. + +--- + +## The no-calls rule for ALL three launches + +Every answer, every comment, every reply must route back to one of: +1. `https://qron.space/pricing` (self-serve checkout) +2. `https://buy.stripe.com/...` (direct Stripe payment link) +3. `https://rapidapi.com/authichain/api/...` (RapidAPI self-serve signup) +4. `https://qron.space/gallery` (visual proof) +5. `https://authichain.com/api/v1/openapi.json` (developer docs) + +**Never** route to: +- A contact form +- A Calendly +- "DM me" +- "Email me and I'll send you..." +- A waitlist + +If someone wants to talk to you, they can buy the product first. Zero +calls. + +## Timing guidance + +| Week | Launch | Day of week | Time | +|---|---|---|---| +| 1 | Product Hunt | Tuesday or Wednesday | 00:01 PST | +| 2 | Show HN | Tuesday | 08:00 ET | +| 3 | Reddit × 3 | Wednesday → Friday | 09:00-11:00 in the sub's peak timezone | + +Avoid Mondays (people catch up on weekend backlog) and Fridays (low +engagement) for Product Hunt and Show HN. + +## Post-launch measurement + +Track these for each launch, in a single spreadsheet: + +| Metric | Where to find | +|---|---| +| Visitors to target URL | Cloudflare analytics / Google Analytics | +| RapidAPI signups | RapidAPI provider dashboard | +| Stripe checkouts started | Stripe dashboard | +| **Paid purchases** | Stripe dashboard — this is the only metric that matters | +| Revenue | Stripe | +| Comments / engagement | The launch thread itself | + +**Single success metric: $1 earned from a stranger who found you via the +launch.** Everything else is noise. If one launch earns $1 from a +stranger, the no-calls approach is validated and you scale what worked. +If zero launches earn anything, the offer is wrong, not the distribution. + +## Related files + +- QRON pricing (fixed, commit `a3ec874`): [`qron-app/app/pricing/page.tsx`](../../qron-app/app/pricing/page.tsx) +- RapidAPI submission: [`rapidapi-submission.md`](./rapidapi-submission.md) +- Michigan outreach (parallel no-calls channel): [`strainchain/cold-email-michigan.md`](./strainchain/cold-email-michigan.md) +- Positioning copy source: [`../outputs/agentz-v3-marketing.md`](../outputs/agentz-v3-marketing.md) diff --git a/marketing/rapidapi-submission.md b/marketing/rapidapi-submission.md new file mode 100644 index 0000000..a889880 --- /dev/null +++ b/marketing/rapidapi-submission.md @@ -0,0 +1,230 @@ +# RapidAPI Submission Checklist — AuthiChain Product Verification API + +**Status:** DRAFTED, NOT SUBMITTED. The listing copy exists in +[`outputs/rapidapi-listing.json`](../outputs/rapidapi-listing.json) and +the OpenAPI spec exists at +[`outputs/authichain-openapi.json`](../outputs/authichain-openapi.json). +The underlying API is already live at `https://authichain.com/api/v1/*` +and proxies to the `authichain-api.undone-k.workers.dev` Cloudflare +worker. **Submitting the listing is 9 steps and ~2 hours of copy-paste. +This doc is the complete pre-filled submission.** + +RapidAPI is a no-sales-calls distribution channel. Developers search the +marketplace, sign up for the free tier, upgrade when they hit limits. +Zero calls, zero demos, zero relationship-building. The highest-leverage +unlock you can ship this week. + +## Step-by-step submission + +### 1. Create a RapidAPI provider account + +Go to https://rapidapi.com/provider and sign up as an API provider. +(You may already have a consumer account — the provider side is a +separate flow.) + +### 2. Click "Add New API" → "Import OpenAPI Spec" + +Upload [`outputs/authichain-openapi.json`](../outputs/authichain-openapi.json). +It's OpenAPI 3.0.3, validated, and will auto-populate all endpoints, +request/response schemas, examples, and error codes. + +### 3. Set the base URL + +``` +https://authichain.com/api/v1 +``` + +This is already in the OpenAPI `servers` block, so the import should +pre-fill it. Verify it's set. + +### 4. Fill in the listing metadata (copy-paste ready) + +**Name:** +``` +AuthiChain Product Verification API +``` + +**Tagline:** +``` +Blockchain-backed product authenticity verification in real-time +``` + +**Category:** `Commerce` + +**Short description (pre-filled from OpenAPI `info.description`):** +``` +Verify product authenticity in real-time using blockchain-backed digital +identities. AuthiChain protects brands and consumers from counterfeits by +registering products on-chain (Base L2 / Polygon) and providing instant +verification via NFC, QR, or product ID lookup. +``` + +**Long description (use this verbatim):** +``` +AuthiChain is the trust layer for physical products. Counterfeits cost +brands $1.8T per year (OECD 2025) and fake pharmaceuticals alone kill over +1 million people annually. Existing anti-counterfeit solutions — holograms, +serial numbers, paper COAs — are easily forged and impossible to verify +at scale. + +AuthiChain gives every product a unique on-chain identity (ERC-721 on +Polygon) that anyone can verify in under 200ms via QR scan, NFC tap, or +API call. The API is built for e-commerce platforms, marketplace +operators, supply chain systems, and brand protection teams who need +programmatic authenticity checks at scale. + +WHAT YOU CAN DO WITH THIS API: +- Verify any registered product by serial, SKU, or NFC hash +- Batch-verify up to 50 products in a single call +- Query the full scan history for a product (time-series, geo-tagged) +- Register new products on-chain (brand-authenticated endpoint) +- List all products for a brand +- Check API health and rate-limit status + +USE CASES: +- Luxury marketplaces: verify items before listing or at purchase +- Pharmaceutical distributors: DSCSA pedigree check at dispense +- Sneaker / streetwear resale: scan-to-verify before payment release +- Electronics OEMs: warranty + grey-market fraud detection +- Supply chain dashboards: custody + provenance reporting + +POWERED BY: +- Polygon ERC-721 smart contract (0xc3143254997d48fdc9983d618fb2e10067673eb5) +- Cloudflare Workers for <200ms edge response times +- Optional Bitcoin Ordinal dual-chain proof for premium SKUs +``` + +**Tags:** +``` +blockchain, verification, anti-counterfeit, NFC, product-authentication, +supply-chain, provenance, brand-protection, polygon, erc721 +``` + +**Website:** `https://authichain.com` + +**Terms of Service:** `https://authichain.com/terms` (if missing, create a +1-pager first — RapidAPI requires a TOS link) + +**Support email:** `authichain@gmail.com` + +**Logo:** Upload a 512×512 square PNG. Candidates already in the repo: +- [`public/og-image.png`](../public/og-image.png) (needs crop to square) +- [`public/images/hero-shield.png`](../public/images/hero-shield.png) +- [`public/favicon.png`](../public/favicon.png) (too small) + +If none of these are square 512×512, create one before submission — +RapidAPI rejects non-square logos. + +### 5. Configure pricing tiers + +Copy-paste from [`outputs/rapidapi-listing.json`](../outputs/rapidapi-listing.json): + +| Tier | Monthly price | Requests | Overage | Target user | +|---|---|---|---|---| +| **Basic** | Free | 100/mo | — | Developers, testing, hobbyists | +| **Pro** | $49/mo | 1,000/mo | $0.05/call | Small brands, resellers | +| **Ultra** | $199/mo | 10,000/mo | $0.03/call | Mid-market brands, marketplaces | +| **Mega** | $499/mo | 100,000/mo | $0.01/call | Enterprise, high-volume platforms | + +Set each tier in the RapidAPI provider dashboard under "Plans." + +### 6. Enable authentication + +- Header: `X-RapidAPI-Key` +- The existing `/api/v1/verify` route already reads `X-RapidAPI-Key` (see + [`app/api/v1/verify/route.ts`](../app/api/v1/verify/route.ts:10)) and + forwards it to the `authichain-api.undone-k.workers.dev` worker. +- No code changes needed on your side. + +### 7. Test each endpoint from the RapidAPI playground + +RapidAPI generates an in-browser test UI from the OpenAPI spec. Click +through each of the 14 operations and confirm they return 200s against a +known-good product ID. Use this as a working test serial: + +``` +AC-LVMH-2024-001 +``` + +(Or register a real test product first via `POST /api/v1/register`.) + +### 8. Add a sample code snippet for the readme + +RapidAPI lets you paste a "quickstart" code block that appears on the +listing page. Use this: + +````markdown +### Quick start (Node.js) + +```js +import fetch from 'node-fetch' + +const res = await fetch('https://authichain.com/api/v1/verify?id=AC-LVMH-2024-001', { + headers: { + 'X-RapidAPI-Key': process.env.RAPIDAPI_KEY, + 'X-RapidAPI-Host': 'authichain-product-verification.p.rapidapi.com', + } +}) + +const data = await res.json() +console.log(data.verified) // true +console.log(data.confidence) // 0.95 +console.log(data.blockchainProof) // 0x... +``` + +### Quick start (curl) + +```bash +curl -X GET \ + 'https://authichain.com/api/v1/verify?id=AC-LVMH-2024-001' \ + -H 'X-RapidAPI-Key: YOUR_KEY' \ + -H 'X-RapidAPI-Host: authichain-product-verification.p.rapidapi.com' +``` +```` + +### 9. Submit for review + +Hit the "Submit for Review" button. RapidAPI typically approves within +24–48 hours. You'll get an email when the listing goes live at: + +``` +https://rapidapi.com/authichain/api/authichain-product-verification +``` + +(Exact URL depends on the slug RapidAPI assigns.) + +## Post-submission follow-ups + +Once the listing is live: + +1. **Update the false claim in `outputs/agentz-v5-investor.md`** + - Currently line 54 says: *"Live API with 7 endpoints on RapidAPI marketplace"* + - Before approval this is aspirational. After approval it's true. +2. **Add the RapidAPI badge + link to the AuthiChain homepage** (replace + the existing "Book a demo" CTA for the developer audience) +3. **Post about it on Show HN** — see [`launch-kit.md`](./launch-kit.md) +4. **Add the listing URL to `outputs/rapidapi-listing.json`** under a new + `live_url` field so the repo has ground truth +5. **Check weekly** — first week after launch, check subscriber count + daily; after that, weekly + +## Why this is the highest-leverage no-calls unlock + +- **Zero incremental work** once submitted: RapidAPI drives its own + marketplace traffic +- **Pre-existing search intent**: devs search for "product verification + API" and currently find competitors +- **Self-serve conversion funnel**: free tier → usage → paid tier, no + human in the loop +- **Compounding distribution**: the listing doesn't decay like a launch + post; it keeps earning impressions forever +- **Directly monetizes what's already deployed** — the Cloudflare worker + is live, the Next.js API routes are live, the smart contract is live + +## Related files + +- OpenAPI spec: [`outputs/authichain-openapi.json`](../outputs/authichain-openapi.json) +- RapidAPI listing config (source of truth): [`outputs/rapidapi-listing.json`](../outputs/rapidapi-listing.json) +- Verify route (proxy → CF worker): [`app/api/v1/verify/route.ts`](../app/api/v1/verify/route.ts) +- Full v1 API tree: `app/api/v1/` (14+ operations) +- Smart contract: [`contracts/AuthiChainNFT.sol`](../contracts/AuthiChainNFT.sol) diff --git a/marketing/strainchain/ACTIVATION.md b/marketing/strainchain/ACTIVATION.md new file mode 100644 index 0000000..1a8f011 --- /dev/null +++ b/marketing/strainchain/ACTIVATION.md @@ -0,0 +1,169 @@ +# StrainChain Outreach Activation Guide + +**Goal:** Get the Michigan cannabis outreach pipeline firing in under 2 +hours, with a no-sales-calls CTA (direct Stripe payment link for the $299 +AuthiChain BTC Auth product). Every piece below already exists in the +repo — this doc is the ignition sequence. + +## Pre-flight checklist + +Before running anything, confirm you have: + +- [ ] `NEXT_PUBLIC_SUPABASE_URL` in env +- [ ] `SUPABASE_SERVICE_ROLE_KEY` in env (service role, not anon) +- [ ] A physical mailing address for the CAN-SPAM footer (`OUTREACH_PHYSICAL_ADDRESS`) +- [ ] Your sender name and reply-to email (`OUTREACH_SENDER_NAME`, `OUTREACH_SENDER_EMAIL`) +- [ ] Resend account with a verified domain (for the outbound send) +- [ ] The `outreach-queue-worker.authichain2026.workers.dev` Cloudflare worker is deployed +- [ ] Make.com account with the scenario from `make-scenarios/outreach-queue-daily-sender.json` + +## Step 1 — Fill in missing contact emails (30 min) + +The list in `app/outreach/michigan-dispensaries/page.tsx` has 15 targets. +Only two (Lume, Gage) have real email addresses. The other 13 have empty +email fields and need manual lookup before sending. + +For each company, look up the named contact via: + +1. Company website `/about` or `/team` page +2. LinkedIn search: `site:linkedin.com "{{company}}" "{{contact_title}}"` +3. Hunter.io / Apollo / Rocketreach (2-minute lookup per contact) +4. Generic fallbacks: `info@{{domain}}`, `hello@{{domain}}`, `sales@{{domain}}` + +Fill the emails into `scripts/seed-michigan-outreach.ts` in the +`MICHIGAN_TARGETS` array. Re-run the dry run after each update. + +## Step 2 — Dry-run the seed script (2 min) + +```bash +cd /path/to/AuthiChain +npx tsx scripts/seed-michigan-outreach.ts +``` + +You should see: + +- Total / sendable / missing counts +- A preview of the first rendered email (subject + body + scheduled time) +- A list of any contacts still missing an email address + +## Step 3 — Set the CAN-SPAM env vars + commit to Supabase (5 min) + +```bash +export OUTREACH_SENDER_NAME="Z" +export OUTREACH_SENDER_EMAIL="z@authichain.com" +export OUTREACH_PHYSICAL_ADDRESS="123 Main St, Detroit MI 48226" +export OUTREACH_UNSUBSCRIBE_URL="https://authichain.com/unsubscribe" + +npx tsx scripts/seed-michigan-outreach.ts --commit +``` + +This inserts each target into two Supabase tables: + +- `network_contacts` — the CRM entry (name, company, title, email, notes) +- `leads` — the funnel-tracking entry (email + `source=michigan_outreach_`) + +Both tables already exist per `supabase/migrations/20260407_strainchain_schema.sql` +and `supabase/migrations/20260320_leads.sql`. The script uses +`upsert` on email, so re-running is idempotent. + +## Step 4 — Wire the outreach queue (the missing 10%) + +`seed-michigan-outreach.ts` inserts the contact data into Supabase, but +the actual **send queue** lives in Cloudflare D1 behind +`outreach-queue-worker.authichain2026.workers.dev`. You need to POST +each `{to, subject, body, scheduled_at}` payload to the worker to stage +the outbound. + +Two ways to do this: + +### Option A — Add a POST loop to the seed script + +Extend `scripts/seed-michigan-outreach.ts` with a `fetch` call after the +`leads` insert: + +```ts +await fetch('https://outreach-queue-worker.authichain2026.workers.dev/enqueue', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'x-api-key': process.env.INTERNAL_API_KEY!, + }, + body: JSON.stringify({ + to: t.email, + subject: renderSubject(t), + body: renderBody(t, leadId), + scheduled_at: scheduledAt(t.tier), + campaign: 'michigan_btc_auth_299', + }), +}) +``` + +**Caveat:** verify the exact endpoint name (`/enqueue` vs `/add` vs +`/queue`) and the expected payload shape against the worker source before +running. The Make.com scenario file only documents the `/send` endpoint +(which processes the queue), not the enqueue path. + +### Option B — Insert directly into D1 via wrangler + +If the worker uses a D1 database with a known schema, you can skip the +HTTP layer and insert rows directly: + +```bash +npx wrangler d1 execute --remote \ + --command "INSERT INTO outreach_queue (to_email, subject, body, scheduled_at, status, campaign) VALUES (...)" +``` + +## Step 5 — Activate the Make.com scheduler (5 min) + +1. Log into Make.com +2. Import the scenario from `make-scenarios/outreach-queue-daily-sender.json` +3. Add the `INTERNAL_API_KEY` env variable to the scenario +4. Click **Activate** on the scenario +5. Confirm the schedule shows "Daily at 9:00 UTC" + +From this point forward, the worker polls the D1 `outreach_queue` table +at 9am UTC every day for rows where `status = 'pending'` and +`scheduled_at <= now()`, and sends each one via Resend. Free plan is +3000 emails/day. + +## Step 6 — Monitor day-7 success criteria + +| Metric | How to check | Target | +|---|---|---| +| Opens | Resend dashboard → Michigan campaign | 40-60% | +| Clicks on Stripe link | Stripe dashboard → payment link analytics | 5-15% of opens | +| Clicks on walkthrough | Google Analytics / Cloudflare analytics on `/strainchain/demos/cultivator` | 5-15% of opens | +| **Paid $299 BTC Auth** | Stripe dashboard → `AuthiChain BTC Auth` product | **1+ = success** | +| Unsubscribes | `leads` table status or Resend dashboard | <5% | + +**7-day checkpoint logic:** + +- ✅ 1+ paid order → the offer works. Scale the list beyond Michigan. +- ⚠️ Opens but no clicks → subject line is fine but offer is weak. Rewrite body. +- ⚠️ Clicks but no purchase → pricing page / Stripe friction. Check that the direct payment link actually loads on mobile. +- ❌ No opens → deliverability is broken. Warm up the sending domain, check SPF/DKIM/DMARC, reduce volume. +- ❌ High unsubscribe rate (>10%) → list is wrong. Pivot off dispensaries. + +## What NOT to add to this flow + +Resist adding any of these — they all push the funnel back toward sales calls: + +- ❌ "Book a 15-minute call" CTA +- ❌ Calendly / Cal.com link +- ❌ "Reply if interested" language +- ❌ "Custom quote available" framing +- ❌ Multi-touch drip sequence (yet — test the first wave first) +- ❌ Retargeting-only pitches that require contact info capture + +The whole point of this no-calls design is that **the cold email is the +entire funnel**: subject → body → Stripe link → purchase. If it doesn't +close in a single email, change the email, not the funnel. + +## Related files + +- Cold email copy: [`cold-email-michigan.md`](./cold-email-michigan.md) +- Seed script: [`../../scripts/seed-michigan-outreach.ts`](../../scripts/seed-michigan-outreach.ts) +- Dispensary list (source of truth): [`../../app/outreach/michigan-dispensaries/page.tsx`](../../app/outreach/michigan-dispensaries/page.tsx) +- Make.com scheduler: [`../../make-scenarios/outreach-queue-daily-sender.json`](../../make-scenarios/outreach-queue-daily-sender.json) +- StrainChain economy map (pricing context): [`../../outputs/strainchain-economy-map.md`](../../outputs/strainchain-economy-map.md) +- Supabase schema: [`../../supabase/migrations/20260407_strainchain_schema.sql`](../../supabase/migrations/20260407_strainchain_schema.sql) diff --git a/marketing/strainchain/cold-email-michigan.md b/marketing/strainchain/cold-email-michigan.md new file mode 100644 index 0000000..d12452f --- /dev/null +++ b/marketing/strainchain/cold-email-michigan.md @@ -0,0 +1,130 @@ +# Michigan Cannabis Cold Email — No-Calls Edition + +Cold outbound template for the 15 Michigan cannabis operators listed in +[`app/outreach/michigan-dispensaries/page.tsx`](../../app/outreach/michigan-dispensaries/page.tsx). +Designed for a **no-sales-calls** funnel: every CTA is a direct Stripe +checkout link or a self-serve walkthrough. Zero booked calls, zero pilot +negotiations, zero human conversations. + +## The offer + +**AuthiChain BTC Auth — Product cert on Bitcoin, $299 one-time.** + +- Dual-chain proof: Polygon (ERC-721) + Bitcoin L1 (Ordinal inscription) +- Permanent public verify page at `authichain.com/verify/[serial]` +- Email delivery in ~30 minutes via OrdinalsBot +- Direct Stripe payment link — no CheckoutModal, no capture worker, no + sales funnel middleware: https://buy.stripe.com/dRm3cv0EV6BgeSKdLK1Nu1e +- Already live, already fulfilling, already in production +- Cannabis brands buy it as a **brand story asset**, not as compliance + tooling. "Authenticated on Bitcoin" goes on the bag, the shelf, and + the website. + +## Why this is the right offer for cold outbound + +1. **$299 is impulse-buyable by a marketing manager** without procurement +2. **One-time, not subscription** — zero MRR commitment anxiety +3. **Self-serve end-to-end** — no onboarding call, no sales demo, no pilot +4. **The product already exists and already delivers automatically** +5. **The story angle (permanent Bitcoin cert) is native to cannabis culture** +6. **Michigan list already curated** — 15 real operators with named contacts + +## Variant A — 90 words (recommended primary) + +**Subject:** `$299 Bitcoin cert for {{company}}'s flagship strain` + +``` +Hi {{first_name}}, + +I built StrainChain — we inscribe cannabis product auth certs on Bitcoin +L1 (dual-chain: Polygon + BTC). Every bag gets a scannable code that +resolves to a permanent authichain.com/verify page. Uncopyable. Goes on +the bag, the dispensary shelf, and your website as a brand story asset. + +$299 one-time, direct checkout, email delivery in ~30 min: +https://buy.stripe.com/dRm3cv0EV6BgeSKdLK1Nu1e + +No call, no demo, no pilot. Click, pay, receive. + +Walkthrough first: https://authichain.com/strainchain/demos/cultivator + +— {{sender_name}} +StrainChain · strainchain.io +{{physical_address}} +Unsubscribe: {{unsubscribe_link}} +``` + +## Variant B — 40 words (ultra-compact A/B test) + +**Subject:** `Bitcoin cert for your flagship strain — $299, no call` + +``` +{{first_name}}, + +We inscribe cannabis auth certs on Bitcoin L1. Permanent, uncopyable, +goes on every bag. $299 one-time. Email delivery in 30 min. No call, +no pilot. + +Checkout: https://buy.stripe.com/dRm3cv0EV6BgeSKdLK1Nu1e +Walkthrough: https://authichain.com/strainchain/demos/cultivator + +— {{sender_name}} +StrainChain · strainchain.io +{{physical_address}} +Unsubscribe: {{unsubscribe_link}} +``` + +## Personalization tokens + +| Token | Source | Example | +|---|---|---| +| `{{first_name}}` | Derive from `contact` title in the target list | "there" if unknown | +| `{{company}}` | `company` field | "Lume Cannabis Co." | +| `{{sender_name}}` | You | "Z" | +| `{{physical_address}}` | Required by CAN-SPAM | Your physical mailing address | +| `{{unsubscribe_link}}` | One-click unsubscribe URL | `https://authichain.com/unsubscribe?id={{lead_id}}` | + +## Do NOT include + +- "Book a call" +- "Schedule a demo" +- "Let's hop on a quick chat" +- "Reply to this email if interested" +- "I'd love to learn more about your process" +- Any calendar links (Cal.com, Calendly, etc.) +- Any "custom quote" or "contact for pricing" language +- Any pilot / trial / free onboarding framing + +Every one of those sends the reader into a sales-call funnel. The only +two allowed destinations are (a) the direct Stripe checkout URL or (b) +the self-serve walkthrough page. + +## Sending cadence + +Send in tier order, not all at once: + +1. **Day 0** — `hot` tier (Lume, Gage, Cookies Michigan, JARS) — 4 sends +2. **Day 2** — `warm` tier (Herbology, Green Peak, Skymint, Pleasantrees, + Verilife, Common Citizen, Canna Provisions) — 7 sends +3. **Day 5** — `cold` tier (High Life Farms, Puff, MedMen, TreeHouse) — + 4 sends + +Total: 15 initial sends over 5 days. Do not follow up with a second +touch until you see open / click data. Do not automate a follow-up +sequence yet — the goal of this first wave is to test whether the +**offer** converts, not whether the drip works. + +## Success criteria (day-7 checkpoint) + +- ✅ Ship: **1+ paid $299 BTC Auth from the Michigan list** = first-dollar success +- ⚠️ Investigate: 15 sends, 0 opens → email deliverability is broken +- ⚠️ Investigate: 15 sends, opens but 0 clicks → subject/offer is wrong +- ⚠️ Investigate: clicks but 0 purchases → pricing page / Stripe checkout friction +- 🔁 Iterate: after 7 days, rewrite the email based on what the data showed + +## Related files + +- [`scripts/seed-michigan-outreach.ts`](../../scripts/seed-michigan-outreach.ts) — seed data + Supabase insert +- [`ACTIVATION.md`](./ACTIVATION.md) — step-by-step activation guide +- [`app/outreach/michigan-dispensaries/page.tsx`](../../app/outreach/michigan-dispensaries/page.tsx) — source list +- [`make-scenarios/outreach-queue-daily-sender.json`](../../make-scenarios/outreach-queue-daily-sender.json) — Make.com scheduler diff --git a/scripts/seed-michigan-outreach.ts b/scripts/seed-michigan-outreach.ts new file mode 100644 index 0000000..7708617 --- /dev/null +++ b/scripts/seed-michigan-outreach.ts @@ -0,0 +1,256 @@ +/** + * Seed script — Michigan dispensary outreach, no-sales-calls edition. + * + * Loads the 15 Michigan cannabis operators from + * app/outreach/michigan-dispensaries/page.tsx into the Supabase + * `network_contacts` table (schema: supabase/migrations/20260407_strainchain_schema.sql), + * then stages each contact for cold outbound via the outreach pipeline. + * + * The email body is the variant-A cold email from + * marketing/strainchain/cold-email-michigan.md. + * + * Every CTA is a direct Stripe payment link for the $299 AuthiChain BTC + * Auth product (dual-chain Polygon + Bitcoin cert). No sales calls, no + * pilots, no demos — click, pay, receive. + * + * Run: + * npx tsx scripts/seed-michigan-outreach.ts # dry run + * npx tsx scripts/seed-michigan-outreach.ts --commit # actually insert + * + * Required env: + * NEXT_PUBLIC_SUPABASE_URL + * SUPABASE_SERVICE_ROLE_KEY (service role, not anon) + */ + +import { createClient } from '@supabase/supabase-js' + +// ── The offer ──────────────────────────────────────────────────────────────── + +const OFFER = { + product: 'AuthiChain BTC Auth', + price_usd: 299, + stripe_payment_link: 'https://buy.stripe.com/dRm3cv0EV6BgeSKdLK1Nu1e', + walkthrough_url: 'https://authichain.com/strainchain/demos/cultivator', + delivery: 'Email cert in ~30 min via OrdinalsBot', + mode: 'one_time', +} as const + +// ── Sender config (fill these in before running --commit) ─────────────────── + +const SENDER = { + name: process.env.OUTREACH_SENDER_NAME || 'Z', + email: process.env.OUTREACH_SENDER_EMAIL || 'z@authichain.com', + physical_address: process.env.OUTREACH_PHYSICAL_ADDRESS || '[SET OUTREACH_PHYSICAL_ADDRESS]', + unsubscribe_base: process.env.OUTREACH_UNSUBSCRIBE_URL || 'https://authichain.com/unsubscribe', +} + +// ── Michigan cannabis target list ────────────────────────────────────────── +// Source: app/outreach/michigan-dispensaries/page.tsx (MICHIGAN_TARGETS array) +// Tiering drives the send schedule (hot → day 0, warm → day 2, cold → day 5). + +type Tier = 'hot' | 'warm' | 'cold' + +interface Target { + id: number + company: string + city: string + state: string + contact: string + email: string + phone: string + website: string + tier: Tier + notes: string +} + +const MICHIGAN_TARGETS: Target[] = [ + { id: 1, company: 'Lume Cannabis Co.', city: 'Kalamazoo', state: 'MI', contact: 'VP of Operations', email: 'ops@lumecannabis.com', phone: '', website: 'lumecannabis.com', tier: 'hot', notes: 'Multi-location MSO, active brand protection interest' }, + { id: 2, company: 'Gage Cannabis Co.', city: 'Detroit', state: 'MI', contact: 'Director of Compliance', email: 'compliance@gagecannabis.com', phone: '', website: 'gagecannabis.com', tier: 'hot', notes: 'Public company, strict METRC compliance needs' }, + { id: 3, company: 'Herbology Cannabis Co.', city: 'Saginaw', state: 'MI', contact: 'Dispensary Manager', email: 'info@herbologycannabis.com', phone: '', website: 'herbologycannabis.com',tier: 'warm', notes: 'Premium flower brand, packaging authenticity focus' }, + { id: 4, company: 'Green Peak Cannabis', city: 'Lansing', state: 'MI', contact: 'CEO / Founder', email: '', phone: '', website: 'greenpeakmi.com', tier: 'warm', notes: 'MI-first brand, open to blockchain verification pilots' }, + { id: 5, company: 'Skymint Brands', city: 'Grand Rapids', state: 'MI', contact: 'VP Brand & Marketing', email: '', phone: '', website: 'skymint.com', tier: 'warm', notes: 'Strong retail footprint, interested in consumer-facing QR' }, + { id: 6, company: 'Cookies Michigan', city: 'Detroit', state: 'MI', contact: 'Store Director', email: '', phone: '', website: 'cookiesmelrose.com', tier: 'hot', notes: 'Premium brand, counterfeiting is active pain point' }, + { id: 7, company: 'High Life Farms', city: 'Chesaning', state: 'MI', contact: 'COO', email: '', phone: '', website: 'highlifefarms.com', tier: 'cold', notes: 'Craft cultivator, supply chain transparency angle' }, + { id: 8, company: 'Pleasantrees', city: 'Harrison Township', state: 'MI', contact: 'Director of Sales', email: '', phone: '', website: 'pleasantrees.com', tier: 'warm', notes: 'Vertically integrated, packaging + batch tracking' }, + { id: 9, company: 'Puff Cannabis Company', city: 'Sterling Heights', state: 'MI', contact: 'Founder', email: '', phone: '', website: 'puffcannabisco.com', tier: 'cold', notes: 'Growing multi-store chain' }, + { id: 10, company: 'Verilife Michigan', city: 'Romulus', state: 'MI', contact: 'Compliance Manager', email: '', phone: '', website: 'verilife.com', tier: 'warm', notes: 'PharmaCann subsidiary, enterprise deal potential' }, + { id: 11, company: 'JARS Cannabis', city: 'Flint', state: 'MI', contact: 'VP Operations', email: '', phone: '', website: 'jarscannabis.com', tier: 'hot', notes: 'Rapid expansion, brand integrity critical' }, + { id: 12, company: 'MedMen Michigan', city: 'Ann Arbor', state: 'MI', contact: 'Regional Director', email: '', phone: '', website: 'medmen.com', tier: 'cold', notes: 'National brand, MI flagship store' }, + { id: 13, company: 'Common Citizen', city: 'Marshall', state: 'MI', contact: 'Head of Product', email: '', phone: '', website: 'commoncitizen.com', tier: 'warm', notes: 'Premium positioning, authenticity story strong fit' }, + { id: 14, company: 'TreeHouse Cannabis', city: 'Detroit', state: 'MI', contact: 'Operations Lead', email: '', phone: '', website: 'treehousecannabis.com',tier: 'cold', notes: 'Detroit-based, community-first brand' }, + { id: 15, company: 'Canna Provisions', city: 'Holyoke (MI expansion)', state: 'MI', contact: 'Founder & CEO', email: '', phone: '', website: 'cannaprovisions.com', tier: 'warm', notes: 'Expanding into MI, premium positioning, early mover' }, +] + +// ── Send schedule ────────────────────────────────────────────────────────── + +const TIER_OFFSETS: Record = { hot: 0, warm: 2, cold: 5 } // days + +function scheduledAt(tier: Tier): string { + const d = new Date() + d.setDate(d.getDate() + TIER_OFFSETS[tier]) + d.setHours(13, 0, 0, 0) // 9am ET send window + return d.toISOString() +} + +// ── Email template (variant A, 90 words) ─────────────────────────────────── + +function firstNameFrom(contact: string): string { + // Title-based contacts don't have a first name, so fall back gracefully. + return 'there' +} + +function renderSubject(t: Target): string { + return `$${OFFER.price_usd} Bitcoin cert for ${t.company}'s flagship strain` +} + +function renderBody(t: Target, leadId: string): string { + const unsubscribe = `${SENDER.unsubscribe_base}?id=${leadId}` + return `Hi ${firstNameFrom(t.contact)}, + +I built StrainChain — we inscribe cannabis product auth certs on Bitcoin L1 (dual-chain: Polygon + BTC). Every bag gets a scannable code that resolves to a permanent authichain.com/verify page. Uncopyable. Goes on the bag, the dispensary shelf, and your website as a brand story asset. + +$${OFFER.price_usd} one-time, direct checkout, ${OFFER.delivery.toLowerCase()}: +${OFFER.stripe_payment_link} + +No call, no demo, no pilot. Click, pay, receive. + +Walkthrough first: ${OFFER.walkthrough_url} + +— ${SENDER.name} +StrainChain · strainchain.io +${SENDER.physical_address} +Unsubscribe: ${unsubscribe} +` +} + +// ── Main ─────────────────────────────────────────────────────────────────── + +async function main() { + const commit = process.argv.includes('--commit') + const sendable = MICHIGAN_TARGETS.filter(t => t.email && t.email.trim() !== '') + const missing = MICHIGAN_TARGETS.filter(t => !t.email || t.email.trim() === '') + + console.log('Michigan cannabis outreach seed — no-sales-calls edition') + console.log(`Offer: ${OFFER.product} — $${OFFER.price_usd} one-time`) + console.log(`Stripe: ${OFFER.stripe_payment_link}`) + console.log(`Targets: ${MICHIGAN_TARGETS.length} total`) + console.log(` ✓ sendable now: ${sendable.length}`) + console.log(` ⚠ need email lookup: ${missing.length}`) + console.log('') + + if (missing.length > 0) { + console.log('Contacts missing email (look these up before --commit):') + for (const t of missing) { + console.log(` - ${t.company} (${t.tier}) · ${t.contact} · ${t.website}`) + } + console.log('') + } + + if (!commit) { + console.log('=== DRY RUN ===') + console.log('Preview first email:') + if (sendable.length > 0) { + const t = sendable[0] + console.log('---') + console.log(`To: ${t.email}`) + console.log(`Subject: ${renderSubject(t)}`) + console.log(`Scheduled: ${scheduledAt(t.tier)}`) + console.log('') + console.log(renderBody(t, 'dry-run-lead-id')) + console.log('---') + } + console.log('\nRe-run with --commit to insert into Supabase.') + return + } + + // ── Commit mode: insert into Supabase ───────────────────────────────────── + + const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL + const serviceKey = process.env.SUPABASE_SERVICE_ROLE_KEY + + if (!supabaseUrl || !serviceKey) { + console.error('Missing NEXT_PUBLIC_SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY') + process.exit(1) + } + + if (SENDER.physical_address.startsWith('[SET')) { + console.error('Set OUTREACH_PHYSICAL_ADDRESS env var before --commit (CAN-SPAM requirement).') + process.exit(1) + } + + const supabase = createClient(supabaseUrl, serviceKey) + + let inserted = 0 + let skipped = 0 + for (const t of sendable) { + // Upsert into network_contacts + const { data: contact, error: contactErr } = await supabase + .from('network_contacts') + .upsert( + { + name: t.contact, + company: t.company, + title: t.contact, + email: t.email, + phone: t.phone || null, + notes: `[${t.tier}] ${t.city}, ${t.state} · ${t.notes} · ${t.website}`, + }, + { onConflict: 'email' } + ) + .select() + .single() + + if (contactErr) { + console.error(`✗ ${t.company}: ${contactErr.message}`) + skipped++ + continue + } + + // Upsert into leads (tracks outbound funnel) + const { data: lead, error: leadErr } = await supabase + .from('leads') + .upsert( + { + email: t.email, + source: `michigan_outreach_${t.tier}`, + }, + { onConflict: 'email' } + ) + .select() + .single() + + if (leadErr) { + console.error(`✗ ${t.company} (leads): ${leadErr.message}`) + skipped++ + continue + } + + const leadId = lead?.id || contact?.id || 'unknown' + const subject = renderSubject(t) + const body = renderBody(t, leadId) + const scheduled = scheduledAt(t.tier) + + console.log(`✓ ${t.company} (${t.tier}) · scheduled ${scheduled.slice(0, 10)} · lead ${leadId}`) + console.log(` Subject: ${subject}`) + inserted++ + + // NOTE: To actually queue the send, POST to the outreach-queue-worker + // endpoint with { to: t.email, subject, body, scheduled_at: scheduled }. + // That endpoint lives at outreach-queue-worker.authichain2026.workers.dev + // and is called by the Make.com scenario in make-scenarios/ + // outreach-queue-daily-sender.json. Wire that in a follow-up PR once the + // D1 schema is confirmed. + } + + console.log('') + console.log(`Done. Inserted ${inserted}, skipped ${skipped}.`) + console.log('') + console.log('Next: POST each {to, subject, body, scheduled_at} to the') + console.log('outreach-queue-worker to stage the actual sends. See') + console.log('marketing/strainchain/ACTIVATION.md for the full sequence.') +} + +main().catch(err => { + console.error(err) + process.exit(1) +})