Place Journey v2 — B2 · Owner management surface

Part 1 of B2, pulled forward on owner request — how a shop/provider/SHG owner manages products, services, rates and hours after B1 creates the page. Governed by B2-brief.md + B-UX-PLAN.md §1 ten laws / §3-B1/B2/B3 + DECISIONS #15 (owned page — owner-only instant-live edits, no pending states ever) and #19 (enquiries = Nyburs inbox; WhatsApp never appears on this surface). The cockpit's character: the page IS the editor (pencils in place, no settings maze), one decision per sheet, mic on every text field (L2), photo leads every product, zero English at decision points, and no completeness scores or nags anywhere (L9) — the only maintenance hook is the positive weekly line (L7). DECISIONS #8: frames English + the brief's binding Devanagari strings; B2·E = the hi locale check on the string-heaviest sheet.

‹ All screensB2·A "My page" owner viewB2·B Add/edit product sheetB2·C Services & ratesB2·D Hours & statusB2·E hi locale checkB2·F Link channelB2·G Enquiry composerB2·H Owner inbox
B2 · my page · the page IS the editor

Sharma ji opens his own shop page — everything edits in place

The business page as the OWNER sees it (DECISIONS #15: owned — his edits go live the moment he taps, no steward, no review, no pending). Ruling R1: no separate "manage" screen — the public page anatomy grows pencils: a per-row pencil on every product, an Edit aside on every section header, an edit chip on the photo. Top of page = the available-now card (pulse dot = the B-series net-new widget; same dot customers see) with the toggle — §3-B2 puts it here + the morning prompt (b2d). Then the enquiries row "3 new messages" → his Nyburs inbox (#19 — customer questions are Nyburs chat, WhatsApp never renders on this surface), and the L7 proof line "5 people viewed your shop this week" (viewed, never "called") — the ONLY maintenance hook on the page; nothing scores, nothing nags (L9). Product rows = the b5e anatomy (photo · name · price/unit · min-order + delivers-to chips) with the photo thumb LEADING. "+ Add item" opens the b2b sheet. Hours rows + the amber "Closed today?" one-tap (drives the same dot — R5).

7:12
••••

Sharma General Store

Kirana · Bheldi, Garkha
Your page
Open now
Customers see the green dot right now
3
3 new messages
Customer questions → your Nyburs inbox
5 people viewed your shop this week
Items & prices3Edit
Sugar
Collect from shop
₹42
/kg
Mustard Oil
Delivery in Bheldi
₹165
/ltr
Wheat Flour (10 kg bag)
Min 1 bagDelivery in Bheldi
₹340
/bag
Add item
Shop hoursEdit
Mon – Sat
8 am – 8 pm
Sunday
Closed
Closed today?
One tap — shows closed today, opens itself tomorrow
Shop photo
Change
B2 · product sheet · photo first, one decision per beat

"+ Add item" — the camera leads, the price board helps

ONE sheet per product (R1), S5/S8 sheet pattern. Beat ① ADD: the camera tile LEADS — binding string "Photo of the item" (photo steering per §3-B1: the thing, never the face or the house) — with the gold assist tile "Add from a photo of your board" beside it: Sharma adds Sugar ₹42/kg by photographing his handwritten price board. Ruling R2: v1 = photo + manual confirm — the tile ships now so the habit forms; OCR pre-fill arrives behind the same tile later. Then name with the mic as the large target (L2; keyboard = the small icon), price + unit chips (₹/kg ₹/pkt… server-driven labels, §6), and the b5e row fields as OPTIONAL dashed chips — min-order + delivers-to/collect-from, owner-set, skippable at equal weight. CTA promises the #15 contract in words: "Add — live instantly" — no save-pending state exists. Beat ② EDIT: same sheet prefilled; delete = the quiet labelled row at the foot (R4 — a 48-year-old never discovers swipe). Photos: NSFW async invisible-when-clean, EXIF stripped, ≤200KB background upload (app-only).

7:13
••••
Beat ① · Add — photo first, then name, then price
Add item
Photo of the item
photo leads — tap to shoot
Add from a photo of your board
your price board, in one shot
Name
e.g. — Sugar
Price
₹/kg ₹/pkt ₹/ltr ₹/pc
Moreoptional — skip freely
Min order Delivery / collect
One decision per beat, top to bottom; nothing is required except name + price. The board-assist photo attaches to the page as the items photo too — one shot, two jobs (R2). Voice fills any field; field-level re-record fixes transcription (L2, app-only).
Beat ② · Edit — same sheet, prefilled · delete is a labelled row
Sugar ₹42/kg
New photo
Name
Sugar
Price
₹42
₹/kg ₹/pkt ₹/ltr ₹/pc
Moreoptional
Collect from shop Min order
Edits are live the moment "Done" is tapped (#15) — the row on b2a updates in place, the customer's b5 view updates on next load. Delete asks one confirm then is gone — no archive concept for v1.
B2 · services & rates · private-rates rule

Anil mistri sets his rates — and is told who sees them, right here

The provider variant (Anil Electric Works). The privacy reassurance sits AT the editor, first thing under the bar — binding string "Rates show only to people who call or message" (§3-B2 private-rates rule: the public going-rates board was KILLED in #17; rates reveal pre-call on the locked sheet, blurred "₹ ???" in the directory). Without this line at the editor, providers under-quote or refuse to fill rates at all. Each row carries ONE of the 3 price modes: Fixed rate (Fan fitting ₹150) / "Starting from" (New wiring ₹80/point — row shown EXPANDED with the mode picker) / "Ask on call" chip (AC servicing — no number, honest). Max 10 rows, no descriptions — the cap renders as the quiet "3/10" counter chip, never a warning (R6, L9). Mic on the name field (L2). Below: the work-photos grid — the + tile invites, no minimum, no nag; photos rank the page (ghost pages sink) but absence never renders as a deficiency.

6:40
••••

Anil Electric Works

Electrician · Bheldi + 14 villages
Your page
Rates show only to people who call or message
Work & rates3/10No descriptions — name + rate only
Fan fitting
₹150
New wiring
₹80 /point starting from
Fixed rateone price
Starting fromminimum
Ask on callno number
₹80 / point
AC servicing
Ask on call
Add service
The expanded row IS the edit sheet for services — one row open at a time, tap elsewhere closes it live (#15). The "Starting from" mode renders on the caller's locked sheet as "₹80/point starting from"; "Ask on call" renders the chip, never a fake number.
Work photosPhotos help your page rank
+ photo
3 people viewed your page this week
B2 · hours & status · one state machine, three surfaces

Hours in two taps — and where the green dot lives every day

Beat ① WEEKLY HOURS: day chips + time PRESETS — the two presets cover most shops; "Custom hours" opens the time drums (advanced path, not the default). The closed day is a chip turned OFF, not a separate form. Below it the "Closed today?" one-tap override (amber): shows closed today, reverts itself tomorrow — no "remember to reopen" debt on the owner. Ruling R5: the override, the page-top toggle (b2a) and the prompts here drive ONE state machine — the same dot the customer sees on b5. Beat ② CLINIC VARIANT (§3-B3): "doctor visiting" = structured pickers — who / day chips / time slot — with the mic shortcut ("Say it by voice") and free text demoted to advanced; a medical store states when the doctor sits without typing a word. Beat ③ WHERE THE TOGGLE LIVES DAY-TO-DAY (§3-B2): the app-open morning prompt ("Is the shop open today?") and the evening AUTO-OFF nudge ("Still open?" — one-tap from the shade, L8) — without the evening nudge the pulse goes meaningless by week two.

8:02
••••
Beat ① · Weekly hours — chips + presets, drums are the advanced path
When is the shop open?
MonTueWedThuFriSatSun
8 am – 8 pm 9 am – 6 pm Custom hours
Closed today?
Shows closed today only — opens itself tomorrow morning
The unticked Sun chip IS the closed day — no separate closed-day form. Lunch breaks and per-day hours are deliberately NOT v1: presets cover the kirana norm; "Custom hours" carries the rest.
Beat ② · Clinic variant — doctor visiting, structured (§3-B3)
When does the doctor visit?
Dr. Sunita SharmaMBBS · visiting
MonTueWedThuFriSatSun
10 am – 1 pm 5 pm – 8 pm
Say it by voice + Add doctor
Who / day chips / slot — the schedule renders on the public page as a structured line ("Dr. Sunita — Tue, Fri · 10 am–1 pm"), never prose. Voice shortcut transcribes into the SAME pickers; free text is the advanced path only.
Beat ③ · Day-to-day — morning prompt + evening auto-off (§3-B2)
Is the shop open today?
App-open prompt, mornings only · one tap sets the dot
Nyburs · notification shade 8:30 pm
Still open? If not, we'll turn the green dot off.
L8: both answers are one-tap from the shade, never in-app navigation. No answer by closing time ⇒ the dot turns OFF silently — an unattended pulse is worse than none (§3-B2 auto-off rule).
B2 · hi locale reference — translation check (NOT a design pattern)

The add-product sheet, rendered end-to-end in hi

DECISIONS #8: ONE language per screen via i18n — this frame renders the b2b ADD sheet end-to-end in hi (the string-heaviest B2 surface, per the brief). The binding Devanagari decision strings are identical in both frames by design; what this frame validates is the structural chrome around them: the photo-tile sublines, field helper "ज़रूरी नहीं", the spec sublines, status/nav keys (होम/जगह/खोजें/डेली/चैट्स). Unit labels (किलो/पैकेट/लीटर/पीस) and product vocabulary = server-driven domain labels (§6), NOT ARB keys. Remaining B2 hi keys (section headers "सामान और दाम"/"दुकान का समय", privacy line, prompts) ride the normal 12-locale pipeline — flagged for the lead.

7:13
••••
सामान जोड़ें
डिब्बे/सामान की फोटो
फोटो से शुरू करें
बोर्ड की फोटो से जोड़ें
रेट-बोर्ड की एक फोटो
नाम
जैसे — चीनी
दाम
₹/किलो ₹/पैकेट ₹/लीटर ₹/पीस
और जानकारीज़रूरी नहीं
कम से कम ऑर्डर डिलीवरी / ले जाएँ
B2 · link channel · #21 — the one-to-many surface

"Our channel" — link his channel, or make one from the page

Closes E2E P0-2: #21 ruled the page↔channel link but no surface designed it. The cockpit gains an "Our channel" section with two states. Beat ① NOT LINKED: one quiet dashed invite ("Link a channel") — invitation grammar like the +photo tile, never a nag, never auto-created (L9). Beat ② THE SHEET, one decision: link an EXISTING channel — his channels listed, one-tap Link (R7: the s8 communities machinery reused, no new wizard) — or"Create new channel" create-from-page: name pre-filled "Sharma General Store", place-locked to the page's anchor (#22a SSOT centroid place — no place picker renders), ONE confirm, instant-live (#15). Beat ③ LINKED: the channel row (member count + the L4 dot) and the quiet "Remove" row (R8 — same labelled-row grammar as R4 delete; unlink detaches the channel from the page, never deletes the channel). WHY a channel at all: DM = Message (#19), channel = one-to-many — the business's broadcast surface; B3 offers will auto-land there (B3 council scope) + the place feed. Customer-side join CTAs ride b5h (group page, in-flight) and b2-discovery (business page). ⚠️ page-follow vs channel-join = ONE follow concept or two — the open #21 Q parked for the B3 council (recommendation stands: page-follow = lightweight default, channel-join = opt-in louder surface). NEVER auto-join — following a page must not subscribe anyone to a broadcast.

7:18
••••
Beat ① · Not linked — one quiet invite on the cockpit (L9)
Our channelbroadcast · one-to-many
Link a channel
Offers and updates — broadcast to everyone
Sits under the enquiries row on b2a. Dashed invite = the same grammar as "+ photo" — an offer, not a deficiency (L9). No channel is ever created or joined automatically.
Beat ② · The sheet — link existing or create from the page (R7)
Link a channel
Your channels
Sharma Kirana Updates
Channel · 38 members
Bheldi Yuva Club
Channel · 12 members
or
Create new channelfrom page — name pre-filled
Sharma General Store
Linked to Bheldi Place-locked
R7: ONE decision per path — existing channel links in one tap; create-from-page asks NOTHING (name pre-filled from the page, place locked to the page anchor — #22a, no place picker). No description, no avatar step — the page's identity IS the channel's. Channel admin/manage = the existing channels surface, never re-built here.
Beat ③ · Linked — the row + the quiet remove (R8)
Our channellinked
Sharma General Store
Channel · 38 members · Offers will land here
The row taps through to the channel; "Offers will land here" states the B3 contract in words (offers auto-land — B3 council wires it). R8: unlink = quiet labelled row + one confirm, detaches only. Customer-side join CTA renders on b5h (group) + b2-discovery (business) — never on this owner surface, never auto-join. Page-follow vs channel-join = the parked B3 council Q.
B2 · enquiry composer · #19 — where "Message" lands

Santosh taps "Message" in Gurgaon — the Sugar card comes with him

Closes E2E P0-3 — the track's PRIMARY CTA finally has a destination. Three entries, ONE thread: the Message button on a business/SHG page (b5e, b2-discovery) · "Check stock" on a B3 stock post · tapping a product row — all open the same Nyburs chat thread with the CONTEXT CARD AUTO-ATTACHED: the product (photo · name · ₹/unit · page attribution) pinned at the top of the thread. R9: everything else is the app's existing chat anatomy 1:1 — bubbles, composer, rails, no ticks/read-receipts (privacy policy) — the context card is the only net-new chat payload, rendered official-not-social (L6: a catalogue entry, zero social chrome; tapping it goes back to the product/page). Quick-ask chips pre-compose the common questions — "Is this available?" / "What's the rate?" / "Ask by voice" (mic custom ask) — R10: a chip fills the composer, never auto-sends (the L7 enquiry count must not inflate on a mis-tap); the mic stays the large composer target (L2). #19 GLOBAL ruling: this path is proximity-free — Santosh sits in Gurgaon messaging a Bheldi shop; rate-limit + report path = the existing chat abuse rails (app-only). Page-tap entry (no product) attaches the business card instead — same anatomy, shop photo + name + category. Send → the thread lives in his normal Chats tab; nothing new to learn.

7:42
••••

Sharma General Store

Kirana · Bheldi, Garkha
Open now
Enquiry from Bheldi page · today
pinned · enquiry context
Sugar
Sharma General Store · Bheldi
₹42
/kg
Is this available?7:42 pm
The card travels WITH the question — Sharma never has to ask "which item?". Tap a chip → it fills the composer (R10, never auto-send); send is the user's tap. Proximity-free per #19 (Gurgaon → Bheldi); rate-limited + report path on the existing chat rails (app-only). No ticks, no read receipts — by design.
What's the rate? Can you deliver? Ask by voice
Write your question…
B2 · owner inbox · the measured enquiry (L7)

Sharma's side — who's asking, about what, from where

The same thread from the owner's Nyburs inbox (the b2a "3 new messages" row lands here). The bar answers the owner's first question before he reads a word: customer name + where he is + where he's from — "Santosh · in Gurgaon, from Bheldi" (the migrant case made legible; a Bheldi boy in Gurgaon is a warmer lead than a stranger). The product context card stays pinned — Sharma knows it's about Sugar without scrolling. Quick-replies pre-compose the two answers that close most enquiries — "Yes, it's available" / "Ask on call" (R10: fill, never auto-send; the "Ask on call" reply offers his number through the SAME locked-sheet path — the number itself never enters the thread). Mic = the large reply target (L2). The quiet L7 line under the thread tells him the honest mechanics: this thread is exactly what "12 people contacted" counts on his page (#22c — measured enquiries, never unmeasured "orders"). The ghost slot below it is the #22c buyer order-confirm — DESIGNED-FOR, NOT BUILT: when the buyer one-tap "Order confirmed" ships in the enquiry thread, it lands in that slot and upgrades the page's proof line from enquiries to ORDERS (b5h #20h). Until then the slot never renders in the app.

7:51
••••

Santosh

in Gurgaon, from Bheldi · Customer
Enquiry
From your page — Sugar · today
pinned · enquiry context
Sugar
Your item · from your page
₹42
/kg
Is this available?7:42 pm
Need 2 kg — can you deliver to Bheldi? Mum's home.7:43 pm
This enquiry was counted — page shows "12 people contacted"
Order confirmed#22c buyer one-tap confirm — designed-for slot, NOT built; never renders until it ships
L7/#22c: the proof line on his page counts THESE threads — measured enquiries, never unmeasured "orders". When the buyer one-tap confirm ships, it lands in the ghost slot above and upgrades the page proof to "N orders via Nyburs" (b5h #20h). "Ask on call" quick-reply = the locked-sheet path; the number never enters the thread.
Yes, it's available Ask on call
Write your reply…

B2 Part-1 position: the owner management cockpit for B1-created pages — the gap the product owner flagged ("no way how they can manage all the products or service"). Part 2 (public discovery/directory) follows with the full B2 council. Ruling log: R1 the page IS the editor — pencils on the public anatomy, one sheet per object, no separate manage screen · R2 board-assist = v1 photo + manual confirm (the "Add from a photo of your board" tile ships now so the habit forms; OCR pre-fill lands behind the same tile later) · R3 .b2-abar/.b2-fresh/.b2-prod/.b2-inp/.b2-mic re-declare b5/b1 FILE-LOCAL patterns 1:1 — flagged for the lead's journey.css consolidation pass · R4 delete = a quiet labelled row inside the edit sheet, never swipe · R5 available-now = ONE state machine, three surfaces (page-top card · morning app-open prompt · evening auto-off nudge · the "Closed today?" hours override drives the same dot) · R6 the max-10 services cap renders as the quiet "3/10" counter chip, never a warning banner (L9). Laws honoured: L2 mic on every text field (incl. price — voice fill works) · L7 the weekly viewed line is the ONLY maintenance hook, real numbers, never "called" · L9 zero completeness scores, zero nag chips anywhere on the cockpit · #15 every CTA states the instant-live contract in words ("live instantly") — no pending state exists in the UI · #19 enquiries land in the Nyburs inbox; WhatsApp never renders on the owner surface. App-only (cited, not designed): NSFW async photo scan invisible-when-clean · EXIF strip + ≤200KB compress + background upload (§5) · async voice transcription w/ field-level re-record · evening auto-off job + morning prompt scheduling · unit/category labels server-driven (§6) · enquiry chat = existing Nyburs chat rails, local+global (#19 owner ruling). For the lead's eye: b5e's CTA ordering is being revised to Message-first by a parallel agent — b2a's enquiries row already assumes that world; remaining B2 hi keys ride the normal 12-locale pipeline (only the b2e frame per the brief).

R+ (2026-06-11, E2E P0 closures — frames b2f/b2g/b2h, B-E2E-VALIDATION P0-2/P0-3): b2f gives #21 its surface — "Our channel" on the cockpit: quiet dashed invite (L9, never a nag, never auto-created) → ONE sheet: link an EXISTING channel one-tap OR create-from-page (name pre-filled from the page, place-locked to the #22a anchor, ONE confirm, #15 instant) → linked row + quiet "Remove" · R7 the sheet reuses the s8 communities machinery — no channel wizard, no settings maze; channel manage = the existing channels surface · R8 unlink = quiet labelled row (R4 grammar, never swipe), detaches the channel from the page, NEVER deletes it · b2g/b2h close P0-3 — the #19 primary CTA's destination: Message / "Check stock" / product-row tap all open ONE Nyburs chat thread with the CONTEXT CARD auto-attached (photo · name · ₹ · attribution, pinned at thread top; page-entry attaches the business card, same anatomy) · R9 chat = the app's EXISTING anatomy 1:1 (bubbles, composer, Chats rail, NO ticks/read-receipts per privacy policy) — the context card is the ONLY net-new chat payload, official-not-social (L6), tap = back to product/page · R10 quick-ask/quick-reply chips PRE-COMPOSE into the composer, never auto-send — the L7 enquiry count must never inflate on a mis-tap · owner bar = name + "in Gurgaon, from Bheldi" (migrant lead legible) · "Ask on call" quick-reply rides the SAME locked sheet, the number never enters the thread · L7/#22c: the in-thread "This enquiry was counted" line states what "N people contacted" counts; the buyer one-tap order-confirm (#22c) = a GHOST designed-for slot in b2h, NOT built, never renders until it ships (then upgrades the b5h #20h proof line to orders) · #19 GLOBAL: enquiry chat is proximity-free (Gurgaon → Bheldi), rate-limit + report on existing chat abuse rails (app-only) · channel join CTAs ride b5h (group, in-flight) + b2-discovery (business); page-follow vs channel-join = the open #21 Q parked for the B3 council; NEVER auto-join.