diff --git a/blog/2025-11-15-dynamic-csa-playbook/index.mdx b/blog/2025-11-15-dynamic-csa-playbook/index.mdx
new file mode 100644
index 00000000..3135163a
--- /dev/null
+++ b/blog/2025-11-15-dynamic-csa-playbook/index.mdx
@@ -0,0 +1,270 @@
+---
+slug: dynamic-csa-member-driven
+title: "Dynamic CSA: How Any Farm Can Earn $60,000+ with Member-Driven Production"
+authors: [agrinet-team]
+tags: [agrinet, fruitful, dynamic-csa, ping, kentucky]
+date: 2025-11-15
+description: The Agrinet core team packaged the Dynamic CSA model—member-driven harvests, transparent ratings, and bonus volume control—that keeps 85–95% of members engaged while unlocking $60K+ of net income for a 10-acre farm.
+---
+
+import styles from './styles.module.css';
+
+
+
+
+
Agrinet Core Team · Nov 15, 2025
+
Dynamic CSA = predictable $60K+ net
+
+ Traditional CSAs ask members to guess what will be in the box. Dynamic CSA flips the script with member-driven menus,
+ Fruitful logistics, and transparent ratings from the PING ledger. Farms lock in 100+ committed households, prioritize
+ what those households request, and ship only what is already spoken for.
+
+
+
+
+
Member Retention
+
85–95% vs. 50–70%
+
Dynamic menu + ratings keep members active across the full season.
+
+
+
Net Income
+
$60K–$92K
+
10-acre farm with 100 members sees 30% margin lift.
+
+
+
Bonus Volume
+
+15 boxes/week
+
Member add-ons like tomatoes or peppers redeem within hours.
+
+
+
+
+
+
+
+
The traditional CSA problem
+
Members guess, farms overplant
+
+ Legacy CSA boxes force people to cook whatever shows up—leading to waste, churn, and unpredictable income. Dynamic CSA
+ applies grocery merchandising to small farms: publish what is in the field, capture pre-orders, and harvest only what
+ members actively claimed.
+
+
+
+
+ What breaks
+
+ - 30–50% of weekly value goes uneaten, meaning people cancel by mid-season.
+ - Farms overplant “just in case” and burn labor sorting mystery boxes.
+ - No signal on who actually cooked what, so future planning is blind.
+
+
+
+ Dynamic CSA fix
+
+ - Weekly menus open inside the Fruitful app and hold members accountable.
+ - Harvest crews follow the confirmed pull list—zero mystery, zero waste.
+ - PING transparency ledger records satisfaction, ratings, and claims.
+
+
+
+
+
+
+
+
Revenue comparison
+
10-acre farm running 100 CSA households
+
+ Replacing wholesale contracts with member-directed demand adds $30K–$40K of net income and unlocks bonus sales every
+ time members tap the “more please” button for high-rated crops.
+
+
+
+
+
+
+ | Channel |
+ Gross revenue |
+ Net income |
+ Member retention |
+
+
+
+
+ | Wholesale commodity |
+ $64,000 |
+ $25,000 |
+ n/a |
+
+
+ | Traditional CSA (100 members @ $600) |
+ $60,000 |
+ $27,000 |
+ 50–70% |
+
+
+ | Dynamic CSA (100 members @ $850) |
+ $85,000 |
+ $60,000 |
+ 85–90% |
+
+
+ | Dynamic CSA + bonus add-ons |
+ $92,000 |
+ $65,000 |
+ 90–95% |
+
+
+
+
+
+
+ Additional revenue lines
+
+ - CSA member shop: salsa kits, preserved goods, and surplus peppers.
+ - Chef shares: $3,000 seasonal contracts + $1,500 preserved herbs.
+ - Carbon credits: $650–$900 via no-till beds logged in PING.
+
+
+
+ Labor reality
+
+ Dynamic CSA slots 15 hours/week of admin into Fruitful workflows. Pick lists, credit card settlements, and delivery
+ batching are generated automatically once members finish their menu selections.
+
+
+ - Result: 85–95% retention vs. 50–70% traditional.
+ - Bonus tomatoes: add 5 boxes instantly at $15 per box.
+ - Bonus peppers: add 40 boxes instantly at $18 per box.
+
+
+
+
+
+
+
+
How it works
+
Dynamic CSA via Fruitful + PING
+
+ Members plan their meals, rate every pickup, and influence next week’s planting mix. Fruitful handles the digital merch
+ and pickup logistics; PING records the reputation data that protects both sides.
+
+
+
+
+ Phase 1 · Pre-season
+ Map demand before planting
+
+ Intake sessions capture “I want tomatoes, peppers, basil” style goals. Agrinet agronomists map those ambitions to bed
+ layouts, irrigation requirements, and labor pacing.
+
+
+ - Produce agreements signed March–April.
+ - Members set harvest alerts and delivery preferences.
+
+
+
+ Phase 2 · Grow (April–October)
+ Rotations guided by ratings
+
+ Members log photos and quick feedback. High ratings signal where to double plant, while low scores trigger recipe
+ kits or variety swaps before frustration takes root.
+
+
+ - PING ratings unlock premium pricing for perfect lots.
+ - Weekly photos motivate members to cook what they claimed.
+
+
+
+ Phase 3 · Harvest (June–November)
+ Coordinated delivery & ratings
+
+ Zone-based pickup saves 10–15 hours/week versus farmers markets. LBTAS tasting booths build trust between community
+ evaluators and members while upselling bonus bundles.
+
+
+ - On-site sales: “Bonus tomatoes available—add 5 lbs for $15.”
+ - Members see real-time ratings before adding extra items.
+
+
+
+
+
+
+
+
Trust infrastructure
+
PING transparency + LBTAS protection
+
+ Every transaction receives a 1–4 rating from the LBTAS rubric: payment timeliness, pickup reliability, community
+ contribution, and communication. Members and farms both see the score before expanding commitments.
+
+
+
+
+ What members see
+
+ - Push notifications when their crops are entering harvest.
+ - Show & tell videos showing produce ready for pickup.
+ - Weekly PING rollup: satisfaction scores, credit status, and bonus offers.
+
+
+
+ What farms gain
+
+ - Immediate feedback on crop quality with digital evidence.
+ - Score-linked pricing: every 1-point improvement adds $500/year.
+ - Eliminate five high-maintenance members and save 30 hours of staff time.
+
+
+
+ LBTAS reputation layer
+
+ Agrinet facilitators mediate disputes and publish clear reasons for any penalties. Members know exactly how their
+ community wants them to behave—and farms know which customers to prioritize for bonus drops.
+
+
+
+
+ Dynamic CSA members choose exactly what their community wants to cook. Ratings protect the pickup experience and keep
+ boxes moving; kitchens, chefs, and corner stores can finally subscribe to hyper-local supply they helped design.
+
+
+
+
+
+
Launch playbook
+
90-day plan to stand up Dynamic CSA
+
+ This is the repeatable sprint we run with partner farms. Use it as-is or plug Agrinet crews into any gaps.
+
+
+
+
+
Month 1 (November): Demand capture
+
Map 100 target members, pre-sell weekly credit, aggregate demand, and plan acreage.
+
+
+
Month 2 (December): Contracts & capital
+
Close agreements, order seeds, stage compost, build drip kits, and begin PING setup.
+
+
+
Month 3 (January): Crew & member onboarding
+
Run kitchen content sessions, finalize pickup locations, and drop the Fruitful app tutorials.
+
+
+
+
+
+
+
The bottom line
+
+ Traditional CSA income drops to $27K after mystery boxes and churn. Dynamic CSA stacked with Fruitful + PING keeps
+ dollars in rotation, grows retention to 90%, and puts $60K–$92K of net income in reach for every 10-acre farm willing
+ to co-design with its members.
+
+
+ Ready to deploy? Ping agrinet.io/fruitful to join the Agrinet CSA guild and publish your first member-driven plan.
+
+
+
+
diff --git a/blog/2025-11-15-dynamic-csa-playbook/styles.module.css b/blog/2025-11-15-dynamic-csa-playbook/styles.module.css
new file mode 100644
index 00000000..c1288b1d
--- /dev/null
+++ b/blog/2025-11-15-dynamic-csa-playbook/styles.module.css
@@ -0,0 +1,303 @@
+.page {
+ display: grid;
+ gap: 3rem;
+}
+
+.hero {
+ background: linear-gradient(135deg, #0c3f65, #166a7c 45%, #1ea39a);
+ color: #f5fbff;
+ border-radius: 28px;
+ padding: 3rem 3.5rem;
+ box-shadow: 0 24px 48px rgba(5, 34, 58, 0.3);
+ position: relative;
+ overflow: hidden;
+}
+
+.hero::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: radial-gradient(circle at 15% 20%, rgba(255, 255, 255, 0.25), transparent 55%),
+ radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.18), transparent 65%);
+ pointer-events: none;
+}
+
+.heroContent {
+ position: relative;
+ z-index: 1;
+ display: grid;
+ gap: 1.5rem;
+}
+
+.heroBadge {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.4rem 0.9rem;
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.16);
+ text-transform: uppercase;
+ font-size: 0.85rem;
+ letter-spacing: 0.12em;
+ font-weight: 600;
+}
+
+.heroTitle {
+ margin: 0;
+ font-size: clamp(2.75rem, 4vw, 3.8rem);
+ letter-spacing: -0.02em;
+}
+
+.heroSubtitle {
+ margin: 0;
+ font-size: clamp(1.05rem, 2vw, 1.4rem);
+ line-height: 1.6;
+ color: rgba(245, 251, 255, 0.9);
+}
+
+.heroStats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 1.25rem;
+}
+
+.statCard {
+ background: rgba(255, 255, 255, 0.12);
+ border-radius: 18px;
+ padding: 1.25rem 1.4rem;
+ border: 1px solid rgba(255, 255, 255, 0.25);
+ display: grid;
+ gap: 0.4rem;
+}
+
+.statLabel {
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ font-size: 0.8rem;
+ color: rgba(245, 251, 255, 0.75);
+}
+
+.statValue {
+ font-size: 1.45rem;
+ font-weight: 600;
+}
+
+.section {
+ margin: 0;
+ display: grid;
+ gap: 1.5rem;
+}
+
+.sectionHeading {
+ display: grid;
+ gap: 0.5rem;
+}
+
+.sectionHeading span {
+ font-size: 0.85rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: #1ea39a;
+}
+
+.sectionHeading h2 {
+ margin: 0;
+ font-size: clamp(2rem, 3vw, 2.6rem);
+ color: #0b2c42;
+}
+
+.sectionHeading p {
+ margin: 0;
+ font-size: 1.05rem;
+ line-height: 1.6;
+ color: #284354;
+}
+
+.cardGrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
+ gap: 1.5rem;
+}
+
+.card {
+ background: #ffffff;
+ border-radius: 20px;
+ padding: 1.75rem;
+ border: 1px solid rgba(12, 63, 101, 0.1);
+ box-shadow: 0 20px 40px rgba(6, 24, 38, 0.08);
+ display: grid;
+ gap: 0.65rem;
+}
+
+.card h3 {
+ margin: 0;
+ font-size: 1.35rem;
+ color: #0f3a57;
+}
+
+.card p {
+ margin: 0;
+ color: #3a4f5c;
+ line-height: 1.55;
+}
+
+.card ul {
+ margin: 0;
+ padding-left: 1.2rem;
+ color: #3a4f5c;
+ line-height: 1.55;
+ display: grid;
+ gap: 0.4rem;
+}
+
+.tableWrap {
+ overflow-x: auto;
+}
+
+.dataTable {
+ width: 100%;
+ border-collapse: collapse;
+ background: #fff;
+ border-radius: 18px;
+ overflow: hidden;
+ box-shadow: 0 18px 30px rgba(11, 44, 66, 0.08);
+}
+
+.dataTable thead {
+ background: #e8f6f2;
+ color: #0f3a57;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ font-size: 0.8rem;
+}
+
+.dataTable th,
+.dataTable td {
+ padding: 1rem 1.1rem;
+ border: 1px solid rgba(15, 58, 87, 0.08);
+ text-align: left;
+}
+
+.dataTable tbody th {
+ font-weight: 600;
+ color: #0b2c42;
+}
+
+.metricList {
+ list-style: none;
+ display: grid;
+ gap: 0.4rem;
+ padding: 0;
+ margin: 0;
+}
+
+.metricList li {
+ display: grid;
+ gap: 0.2rem;
+}
+
+.metricValue {
+ font-size: 1.8rem;
+ font-weight: 700;
+ color: #0f3a57;
+}
+
+.metricLabel {
+ color: #425561;
+ font-size: 0.98rem;
+}
+
+.processGrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
+ gap: 1.25rem;
+}
+
+.processCard {
+ border: 1px solid rgba(12, 63, 101, 0.12);
+ border-radius: 18px;
+ padding: 1.5rem;
+ display: grid;
+ gap: 0.5rem;
+ background: linear-gradient(135deg, rgba(30, 163, 154, 0.08), rgba(11, 44, 66, 0.02));
+}
+
+.processCard span {
+ font-size: 0.8rem;
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ color: #1ea39a;
+}
+
+.processCard h3 {
+ margin: 0;
+ font-size: 1.25rem;
+ color: #0b2c42;
+}
+
+.processCard p,
+.processCard ul {
+ margin: 0;
+ color: #324554;
+ line-height: 1.5;
+}
+
+.highlightPanel {
+ border-left: 4px solid #1ea39a;
+ padding: 1rem 1.5rem;
+ background: #f3fbfa;
+ border-radius: 16px;
+ color: #294754;
+ line-height: 1.6;
+}
+
+.timeline {
+ display: grid;
+ gap: 1rem;
+}
+
+.timelineStep {
+ border: 1px solid rgba(12, 63, 101, 0.12);
+ border-radius: 18px;
+ padding: 1.25rem 1.5rem;
+ background: #fff;
+ box-shadow: 0 12px 22px rgba(9, 33, 52, 0.08);
+}
+
+.timelineStep h3 {
+ margin: 0;
+ font-size: 1.2rem;
+ color: #0f3a57;
+}
+
+.timelineStep p {
+ margin: 0.4rem 0 0;
+ color: #3a4f5c;
+}
+
+.bottomLine {
+ border-radius: 24px;
+ background: linear-gradient(120deg, #0b2c42, #1ea39a);
+ color: #f5fbff;
+ padding: 2.5rem 3rem;
+ display: grid;
+ gap: 0.85rem;
+ box-shadow: 0 24px 48px rgba(5, 34, 58, 0.25);
+}
+
+.bottomLine h2 {
+ margin: 0;
+ font-size: 2.2rem;
+}
+
+.bottomLine p {
+ margin: 0;
+ font-size: 1.1rem;
+ line-height: 1.6;
+}
+
+@media (max-width: 768px) {
+ .hero {
+ padding: 2.25rem;
+ }
+}
diff --git a/blog/tags.yml b/blog/tags.yml
index 444379a4..8812f95f 100644
--- a/blog/tags.yml
+++ b/blog/tags.yml
@@ -25,3 +25,43 @@ tooling:
preview:
label: Preview
permalink: /blog/tags/preview
+
+agrinet:
+ label: Agrinet
+ permalink: /blog/tags/agrinet
+
+fruitful:
+ label: Fruitful
+ permalink: /blog/tags/fruitful
+
+dynamic-csa:
+ label: Dynamic CSA
+ permalink: /blog/tags/dynamic-csa
+
+ping:
+ label: PING Transparency
+ permalink: /blog/tags/ping
+
+kentucky:
+ label: Kentucky
+ permalink: /blog/tags/kentucky
+
+rooftops:
+ label: Rooftops
+ permalink: /blog/tags/rooftops
+
+commercial-agriculture:
+ label: Commercial Agriculture
+ permalink: /blog/tags/commercial-agriculture
+
+lawn-conversion:
+ label: Lawn Conversion
+ permalink: /blog/tags/lawn-conversion
+
+louisville:
+ label: Louisville
+ permalink: /blog/tags/louisville
+
+surplus-management:
+ label: Surplus Management
+ permalink: /blog/tags/surplus-management