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. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ChannelGross revenueNet incomeMember retention
Wholesale commodity$64,000$25,000n/a
Traditional CSA (100 members @ $600)$60,000$27,00050–70%
Dynamic CSA (100 members @ $850)$85,000$60,00085–90%
Dynamic CSA + bonus add-ons$92,000$65,00090–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