Place Journey v2 — B3 · Business posting, offers + haat

The track's heartbeat — after B1 creates pages and B2 makes them manageable and findable, B3 makes them ALIVE: offers, stock signals, the haat day, and the weekly proof loop. Governed by B3-brief.md + B-UX-PLAN §3-B3 + DECISIONS #19 (Message-first — "Ask stock" is a Nyburs quick-enquiry, never WhatsApp), #21 (channel = the broadcast surface; offers auto-land there — the routing line makes that contract visible), #22c/L7 (every number measured). The posting character: FAB → camera → post — the photo of the handwritten price board IS the offer; no mode switch ever appears in the personal composer (R1). Stock claims carry mandatory quantities + the L4 traffic-light decay and the village keeps them honest ("Report incorrect", no stars). b3d frames the #21 open Q (follow vs channel-join) for the owner gate — recommendation: two concepts, never auto-join. ENGLISH-ONLY frames (cultural nouns romanized); b3f = the hi locale check.

‹ All screensB3·A Offer path (FAB → camera → card)B3·B Stock + status signalsB3·C HaatB3·D Follow vs channel-join ⚠️B3·E Weekly proof digestB3·F hi locale check
B3 · offer path · closes E2E P1-9

Sharma ji posts his Diwali board in three taps

Beat ① the "Share an offer" FAB lives on the OWNER page only (R1 — 🚫 mode switch inside the personal composer; the kirana lens never meets a business/personal picker). Beat ② tapping the FAB opens the CAMERA first (R2) — the composer renders after, with the board photo already in place: the photo of the handwritten price board IS the offer. One line + price chip are optional, equal weight. The routing line makes the #21 contract visible: "Goes to: Your followers (6) · Bheldi feed · Your channel (38)" — static truth, no checkboxes (R3); the channel chip is absent when no channel is linked (b2f). Beat ③ the offer lands in the Bheldi feed as the S6 post card untouched (DECISIONS #11) + business attribution + OFFER chip + the #19 enquiry chip.

10:08
••••
Beat ① · The FAB — owner page only (R1)

Sharma General Store

Kirana · Bheldi, Garkha
Your page
Open now
Customers see the green dot right now
R1: the FAB renders on the owner cockpit (b2a) and on group pages (#20e — SHG batch announcements ride the same button). It NEVER appears on the personal composer or the place feed — business posting is a place, not a mode. Tap → the camera opens (beat ②).
Beat ② · The composer — camera already happened (R2)
Share an offer
Your price board Retake
One line optional
Diwali offer — sugar ₹40/kg till Sunday
₹40 /kg Add another price
Goes to
Your followers (6) Bheldi feed Your channel (38)
This is where every offer lands — nothing to choose, nothing hidden.
R2: the FAB opened the camera FIRST — this sheet is the confirm step, photo already in place; the photo alone may post (caption + price chip equal-weight optional). R3: the routing line is read-only truth (#21: offers auto-land on followers + place feed + the linked channel) — no checkboxes in v1, no decision burden; no channel linked ⇒ the channel chip is absent, never a nag to create one (L9). App-only: BUSINESS_OFFER source, channel fan-out, NSFW async scan on the photo, EXIF strip + ≤200KB compress, follower push.
Beat ③ · The offer card in the Bheldi feed
Offer Till Sunday Today
Sharma General StoreBusiness
Kirana · Bheldi, Bihar · 2h
Diwali offer — sugar ₹40/kg till Sunday
Bheldi, Saran, Bihar
9 2 84
R4: the card is the S6 post card 1:1 (DECISIONS #11 — never a different card); B3 adds the brand-tinted wrapper strip (the s6-civic grammar) + business attribution in the existing header slots — icon tile + Business chip, never gradient initials (L6 official). The action row stays: offers are feed POSTS, not listings. R8/#19: the enquiry chip opens the b2g composer with this offer attached as the context card, question pre-composed — never auto-sent.
B3 · status signals · editors live in b2d

"DAP arrived — 50 bags" — and the village keeps it honest

The farmer's #3 ask: stock truth before the 8 km ride. Beat ① the fresh stock card — quantity is MANDATORY (R5, the card's dominant block) with the L4 traffic-light chip (the b5 freshness grammar verbatim), the green "12 found this accurate" count (no stars, #15), one-tap "Report incorrect", and the #19 "Ask stock" quick-enquiry chip. Beat ② the honesty decay: past 48h the chip turns and the quantity de-emphasizes — "call to confirm" (R6); 3 reports ⇒ the caution banner on the card, 5 ⇒ review queue. Beat ③ status signals beyond open/closed surface where people look: the doctor-visiting chip on the directory row + the Today-strip cell on visiting day (the migrant checks before telling his mother to go).

8:40
••••
Beat ① · Fresh stock card — quantity mandatory (R5)
Stock Followers got a push: DAP · 50 bags · Sanjay Traders · Bheldi Today
Sanjay TradersBusiness
Fertilizer dealer · Bheldi, Bihar · 3h
DAP stock arrived this morning.
50bags in stock
12 found this accurate
R5: a stock post cannot publish without the quantity — "DAP arrived" alone is not a signal (§3-B3); the push payload is item+qty+business+place. R7: accuracy = the green count, never stars (#15); report = ONE tap, count visible. R8/#19: "Ask stock" opens the b2g enquiry composer with "Is DAP available?" pre-composed + this post as the context card — a Nyburs message, never WhatsApp.
Beat ② · The honesty decay — 48h + reports (R6/R7)
Stock Posted Tuesday 2 days old
Sanjay TradersBusiness
Fertilizer dealer · Bheldi, Bihar · 2d
DAP stock arrived this morning.
50bags — as of Tuesday
Stock info is 2 days old — call to confirm before travelling
3 people reported this incorrect. Confirm with the shop before you travel.
12 found this accurate
R6: the SAME L4 grammar as a stale mandi number — past 48h the chip goes red AND the quantity de-emphasizes; truth decays visibly, the post never silently lies. R7 thresholds (app-side): 3 reports ⇒ this caution banner · 5 ⇒ CMS review queue; the report count stays visible on the card. The owner gets a one-tap "Still in stock?" refresh nudge (L8) — re-confirming resets the clock.
Beat ③ · Where status surfaces — directory row + Today strip
Clinic · Bheldi
Bheldi Health Point
Dr. Verma Visiting: Tue & Fri 10–2
4new
Feed →
1open
Issues →
10–2
Doctor today →
Status beyond open/closed (the migrant's #1): the schedule set in the b2d structured picker renders as a chip on the directory row and — on visiting day only — as the Today strip's third cell (R9 grammar: the contextual cell, never a 4th). Santosh checks from Gurgaon before telling his mother to walk over. Tap → the clinic page.
B3 · haat · Thursday is Bheldi's market day

The haat gets its day on the strip — and vendors announce stalls in one tap

Beat ① on haat day the Today strip's third cell becomes the haat cell (R9 — village level only; mandi keeps that cell on block/district per b5). Beat ② tap → the haat detail sheet: day, location, open-in-maps, the machine-seed source line (day/place from state market records ~70% — report-if-wrong keeps it honest) and the "Coming this Thursday" vendor list built from stall announces. Beat ③ the vendor side: a one-tap "I'll have a stall" prompt on the vendor's own page (R10 — pre-composed, Yes/Not-this-week, no typing) → the HAAT STALL card lands on the haat strip + his followers.

6:55
••••
Beat ① · The haat Today-strip cell — haat day only (R9)
5new
Feed →
2open
Issues →
Haattoday
3 stalls announced →
R9: the cell renders on the haat day only (Bheldi = Thursday) and only at village level — the strip stays 3 cells, the contextual slot rotates (personal / mandi / doctor / haat by level + day). Off haat-day the haat lives as the POI chip "Haat · Thursday" in Local places (§2 IA).
Beat ② · The haat detail sheet
Bheldi haat
Every Thursday
Morning till about 2 pm · today
Today
High school ground, Bheldi
Open in maps
Day & place from state market recordsReport if wrong
Coming this Thursday3
Sanjay Traders
Fertilizer & seeds · Bheldi
Stall
Khushi Tailors
Tailoring · Bheldi
Stall
Mahila Vikas SHG
Sattu · pickle · papad · Bheldi
Stall
Machine-seed honesty: ~70% of haat day/place seeds from state records — the source line says so, and "Report if wrong" rides the same one-tap grammar as everywhere else (steward correction path, app-side). The vendor list is built ONLY from beat-③ announces — no announce, no row; an empty Thursday shows day + place alone, never fake stalls (L7).
Beat ③ · Vendor announce — one tap from his own page (R10)
Haat this Thursday — will you have a stall?
One tap. Shows on the Bheldi haat list + your followers' feed.
Haat stall Thursday · Bheldi haat Today
Sanjay TradersBusiness
Fertilizer dealer · Bheldi · 1h
Sanjay Traders will have a stall at Bheldi haat this Thursday.
R10: the prompt appears on the vendor's OWN page (and as an L8 notification the evening before) — Yes/Not-this-week, zero typing; the announce post is pre-composed (HAAT_STALL type) and expires after the haat day. It feeds the beat-② vendor list + the strip cell's "3 stalls announced" count. SHGs announce the same way (#20e).
B3 · ⚠️ decision frame · the #21 open Q — for the owner gate

Follow or join the channel? Two affordances, two honest jobs

DECISIONS #21 left ONE question open: BusinessFollower vs channel-membership — one follow concept or two? This frame renders the business page header with BOTH affordances live and annotates exactly what each gets the user. LEAD RECOMMENDATION (R11): TWO concepts. Follow = the lightweight default ask — counts in the follower line, offers reach the home feed in the later splice phase, no extra notifications. Channel-join = the opt-in louder lane — every broadcast in the channel inbox + push. NEVER auto-join in either direction; one-tap undo on both. The Option-A/Option-B panel below is the gate's decision surface.

1:30
••••
The page header — both affordances, distinct jobs
Sharma General Store
Open nowKirana · Bheldi
6 people from Bheldi follow this
Offers & stock updates reach followers
What each one honestly gets you
Follow
Lightweight default
  • Offers & stock posts in your home feed (later splice phase — Owner Fork B0 #4)
  • Counted in "6 from Bheldi follow this" — the page's trust signal
  • No extra notifications — quiet by design
  • One tap to unfollow
Join channel
Opt-in · louder
  • Every broadcast lands in your channel inbox (Chats)
  • Push notification per broadcast — the loud lane
  • The shop's one-to-many surface (#21 — replaces his WhatsApp channel)
  • One tap to leave
Lead recommendation — R11
Keep them TWO concepts. Follow is the default ask everywhere (rows, pages, post footers); the channel Join renders only when a channel is linked (b2f). Never auto-join: following never subscribes anyone to the broadcast; joining never follows the page. Both undo in one tap. Folding them into one (Option A) makes every follower a push subscriber — the unfollow spiral kills the follower count the trust line depends on.
⚠️ The gate's options — owner picks
A
One concept — Follow = channel membership
Simpler model, one button. Cost: every follow becomes a push subscription → notification fatigue → unfollows erase the trust signal; and businesses without channels still need a follow concept anyway.
B
Two concepts — Follow default, Join opt-in Recommended
Quiet vs loud, user-chosen. Mirrors the WhatsApp mental model the kirana already lives in (status ≠ channel). Costs one extra row on the page — the b2p header already carries it.
Either way the #21 contract holds: offers auto-land on the channel + place feed + followers (b3a routing line) — the open Q is only what a USER signs up for. Data model: BusinessFollower entity (B2 rails) + existing channel membership (s8 machinery); Option B = zero new tables. Decision needed before B3 build wires the follower push.
B3 · proof loop · the page-maintenance hook

One push a week — and every number in it is a real tap

THE page-maintenance hook (B-PHASES B3 feature 3 — build day-1): the weekly digest push. L7 measured-only (R12): views = page opens, messaged = enquiry threads (#22c — the b2h threads ARE the count), and calls render as "tapped Call" — the tap through the locked sheet is measured, the conversation is not, so the copy never claims more than the system knows. ≤1/week, no emoji, zero-week suppressed entirely (an empty digest is a nag — L9; zero never renders, L7). Tapping lands on the cockpit where the digest strip shows the same three numbers — no separate analytics screen for v1.

7:00
••••
The push — Sunday evening, ≤1/week, no emoji (R12)
NybursSun 7:00 pm
Your shop on Nyburs this week — 5 people viewed · 3 messaged · 2 tapped Call
Copy contract: viewed = page opens · messaged = b2h enquiry threads (#22c) · "tapped Call" = locked-sheet call-taps (the north metric, measured at the tap). A week with all zeros sends NOTHING — no "get more views" upsell, no nag (L9). §3-B3 honesty rule: never "called", never an estimate.
The landing — the cockpit, digest strip on top

Sharma General Store

Kirana · Bheldi, Garkha
Your page
This weekMon – Sun
5
viewed
3
messaged
2
tapped Call
Real taps and threads — nothing estimated
Landing = the b2a cockpit with this strip above the fold (the 3 messaged → his inbox row sits right under it) — no separate analytics page for v1; the digest IS the report. The strip replaces b2a's single "5 people viewed" line during digest week; it never shows a 0 cell (a zero cell drops out, the strip collapses to what's real — L7).
B3 · hi locale check · DECISIONS #8

The offer composer in hi — Devanagari metrics hold

The b3a beat-② composer end-to-end in hi (DECISIONS #8: one language per screen via i18n — a translation check, NOT a pattern; the other 11 locales ride the normal pipeline). The §3-B3 binding string "ऑफर शेयर करें" is the FAB + sheet title; the routing line carries the same #21 contract. Devanagari runs taller — the field, chips and CTA use the /* Devanagari metrics */ weights (700, not 800) so nothing clips.

10:08
••••
ऑफर शेयर करें
आपका रेट-बोर्ड फिर से लें
एक लाइन ज़रूरी नहीं
दिवाली ऑफर — चीनी ₹40/किलो रविवार तक
₹40 /किलो और रेट जोड़ें
किसे दिखेगा
आपके follower (6) भेलड़ी फ़ीड आपका चैनल (38)
हर ऑफर यहीं पहुंचता है — कुछ चुनना नहीं, कुछ छिपा नहीं।
String notes for the translation pass: "ऑफर शेयर करें" is the §3-B3 binding FAB string · "किसे दिखेगा" (not "routing") · "तुरंत लाइव" carries the #15 instant-live promise · "follower" stays Latin per the b2-discovery precedent ("6 भेलड़ी लोग follow करते हैं") · place names render in the page locale (भेलड़ी). No other b3 frame ships Hindi — EN-only rule, cultural nouns romanized (haat, kirana, Diwali).

B3 position: the heartbeat phase — pages built in B1, managed/found in B2, become ALIVE here: offers, stock signals, the haat day, the weekly proof loop. Closes E2E P1-9 (the FAB placeholder + offers→channel routing now have designed surfaces). Ruling log: R1 business posting = a PLACE (owner/group page FAB, #20e), never a mode in the personal composer · R2 camera-FIRST literally — FAB opens the camera, the composer is the confirm step with the board photo in place; photo alone may post · R3 the routing line is STATIC TRUTH (#21 contract: followers + place feed + linked channel) — no checkboxes, channel chip absent when unlinked, never a create-channel nag (L9) · R4 offer/stock/stall cards = the S6 post card 1:1 (DECISIONS #11) + a brand-tinted wrapper strip + business attribution (icon tile + Business chip); action row stays — feed posts, not listings (L6 governs directory surfaces) · R5 stock quantity MANDATORY, the card's dominant block; push = item+qty+business+place · R6 staleness reuses the L4/b5-fresh traffic light verbatim — past 48h the chip turns red "call to confirm" AND the quantity de-emphasizes (the stale-mandi grammar) · R7 report-incorrect = one tap, count visible; 3 ⇒ caution banner on the card, 5 ⇒ CMS review queue; accuracy = the green count, never stars (#15) · R8 "Ask stock"/"Message about this offer" open the b2g enquiry composer, question PRE-COMPOSED, never auto-sent (b2 R10 — the L7 count must not inflate) · R9 the haat takes the Today strip's third cell on haat day, village level only (mandi keeps it on block/district); the strip never grows a 4th cell · R10 stall announce = one-tap Yes/Not-this-week from the vendor's own page, pre-composed HAAT_STALL post, expires after haat day · R12 digest = ≤1/week, measured triple (views · enquiry threads · call-TAPS — "tapped Call", never "called"), zero-week suppressed (L7+L9) · R13 .b3-abar/.b3-fresh/.b3-inp/.b3-mic/.b3-shot/.b3-cta/.b3-follow/.b3-chan/.b3-head re-declare b2/b5/b2p file-local patterns 1:1 — lead consolidates.

⚠️ FOR THE LEAD'S GATE:b3d is the decision frame for the #21 open Q — Option A (one concept) vs Option B (two concepts, RECOMMENDED: Follow = lightweight default, channel-join = opt-in louder, never auto-join either direction, one-tap undo on both); needed before the follower-push rails are wired. ② R4's action-row call: B3 cards keep the standard S6 action row (they are feed posts) — if the council reads L6 stricter (strip reactions from business posts), it is a wrapper-level change, the card is untouched. ③ haat machine-seed (~70% from state records) ships with the report-if-wrong line — steward correction path is app-side, not designed here. ④ followed-business posts → MAIN timeline = Owner Fork B0 #4, referenced in b3d's Follow card but NOT designed (brushes DECISIONS #5). Laws honoured: L2 mic on the one optional field · L4 one traffic-light grammar across mandi/stock/business activity · L7 every number a real tap or thread, zero never renders · L8 the stall prompt + stock-refresh nudge are one-tap notification actions · L9 no nags — no create-channel push, no empty digest, no "get more views". App-only (cited, not designed): BUSINESS_OFFER/STOCK_SIGNAL/HAAT_STALL sources + channel fan-out · follower push rails + stock push payload · NSFW async scan, EXIF strip, ≤200KB compress · 48h staleness job + 3/5 report thresholds · haat calendar seed + corrections · digest scheduler.