Skip to content

Key Screen Specifications

Detailed specs for the eight highest-stakes MVP screens — the ones that carry conversion, trust, and revenue. Each spec: purpose · layout (text wireframe, described LTR; the full layout mirrors in Arabic per Arabic-First & RTL) · components · states · validation & microcopy · edge cases. Screen IDs reference the Screen Inventory.


1. Customer Home (C08)

Purpose: Inspire first-time visitors and let returning customers resume in one tap. The screen answers "what can Yam3at do for my event?" and "where was I?" — in that order for new users, reversed for returning ones.

Layout (mobile):

[Header: logo · location "Kuwait City ▾" · notifications bell]
[Search bar: "What are you planning?"]
[IF active event] → Resume card: event name, date countdown,
   "2 quotes waiting" chip, progress ring
[Category rail: Venues · Catering · Photography · Decoration · … (icons, h-scroll)]
[Featured vendors carousel: photo cards w/ verified badge, rating, from-price]
[Occasion collections: "Weddings" / "Graduations" / "Corporate" banner cards]
[Recently viewed (if any)]
[Bottom nav: Home · Search · My Events · Messages · Profile]

Web adds a hero band with search and trust strip (vendors count, "licensed & verified" line) above the same content, 1200px column.

Components: search entry, resume-event card, category chips/rail, vendor card (image, name ar/en, verified badge, ★rating + count, "from KWD 250.000"), collection banner, notification bell with badge.

States: Loading — skeleton rails (no spinners). Empty (new user) — hero + "خطط أول يمعة لك" / "Plan your first event" CTA opening event wizard; categories still shown (browse must never be blocked by signup). Error — cached categories + retry banner. Success — as above; resume card only when an event has activity.

Microcopy: Search placeholder — AR: «شنو مناسبتك الجاية؟» EN: "What's your next occasion?". Resume card — AR: «وصلك عرضان جديدان لحفل تخرج سارة» EN: "2 new quotes for Sara's graduation". Never show raw status enums.

Edge cases: multiple active events → resume card becomes a pager (dots); logged-out mobile user taps My Events → auth sheet, then returns to intent; notification permission prompt only after first meaningful action (RFQ sent), never on first launch; location defaults to Kuwait City, changing it filters featured content but never hides categories.


2. Search Results (C10)

Purpose: Get from intent to a shortlist of 2–5 trustworthy vendors fast. Filtering must feel instant (Meilisearch); trust signals must be scannable on cards.

Layout (mobile):

[Search bar (editable) · filter icon w/ active-count badge]
[Filter chips row: Category ▾ · Budget ▾ · Area ▾ · Rating ▾ · Date ▾]
[Result count + sort: "34 vendors · Sort: Recommended ▾"]
[Vendor cards, vertical list:
   photo | name + verified ✓ | category · area
   ★ 4.8 (127) | "from KWD 350.000" | response-time chip
   [♡ favorite] ]
[FAB or inline card every ~8 results: "Not sure? Send one request
 to several vendors" → RFQ wizard]

Web: filters as left sidebar (right in AR), results grid 3-up, map toggle deferred to Scale.

Components: filter bottom-sheet (C11), chip row, sort menu (Recommended, Rating, Price low→high, Most reviewed), vendor card, favorite toggle (optimistic), RFQ nudge card.

States: Loading — 6 skeleton cards; chip taps show inline shimmer, previous results stay visible (no blanking). Empty — "لا توجد نتائج مطابقة" / "No vendors match these filters" + the two loosest filters suggested for removal + "Send an RFQ anyway" escape hatch. Error — retry card, filters preserved. Success — list; infinite scroll with page markers.

Validation: budget slider min<max, KWD, 3-decimal display but 5 KWD step granularity; date filter cannot be in the past.

Microcopy: result count — AR uses correct plurals: «٣٤ مزوّد خدمة» rendered "34 مزوّد خدمة" (Latin digits, see digit policy). Sponsored slots (Scale) always labeled «إعلان» / "Sponsored".

Edge cases: query in the "wrong" language (English query in AR UI) must still match — search index carries both name fields; zero-result category in a small launch market shows nearby-category suggestions instead of a dead end; favoriting while logged out queues the action through the auth sheet; a suspended vendor never appears even via a stale deep link (404 → category page).


3. Vendor Profile (C12)

Purpose: The trust-decision page. A customer arriving from Instagram or search decides here whether this vendor is real, good, and in budget. Primary conversion: Request Quote.

Layout (mobile):

[Gallery: full-width swipeable, 1st image = cover, count badge "1/24"]
[Header: logo avatar · name (ar/en) · verified ✓ (tap = explainer)
 ★ 4.8 (127 reviews) · category · area · "responds in ~4h"]
[Sticky bottom bar: [♡] [Message] [Request Quote ●primary]]
[Tabs or stacked sections:]
  About: description, languages spoken, working hours, location map
  Services & Packages: cards w/ name, from-price, inclusions → C13
  Reviews: rating breakdown bars, top 3 reviews w/ event type + date → C15
  Policies: cancellation policy, deposit norms, FAQ

Web: gallery left / summary right; sticky right rail holds CTA card.

Components: gallery viewer (C14), verified-badge popover, review summary block, service card, policy accordion, share sheet (profile URLs are public + indexable, hreflang paired), report-vendor link (low prominence).

States: Loading — cover-image blurhash + skeleton sections. Empty sections — no reviews yet: «مزوّد جديد على يمعات» / "New on Yam3at" (neutral, not negative); no packages: services listed without prices + "request a quote for pricing". Error — retry. Suspended/unpublished — public URL returns friendly 404 with category suggestions.

Microcopy: verified explainer — AR: «تم التحقق من الرخصة التجارية لهذا المزوّد من قبل فريق يمعات» EN: "This vendor's commercial license has been verified by the Yam3at team." From-price — AR: «يبدأ من 350.000 د.ك» EN: "from KWD 350.000" (formatted per bidi rules, never concatenated).

Edge cases: vendor wrote content in one language only → show it as-authored with a subtle "(بالإنجليزية)" / "(in Arabic)" tag, never machine-translate silently; quote-request while vendor is at plan quota → customer still sends, vendor sees upgrade prompt (customer never sees vendor's plan limits); phone numbers inside vendor descriptions are not auto-linked (anti-disintermediation: contact stays in-platform pre-booking, per RFQ business rules); gallery images pending moderation are hidden from public view only.


4. RFQ Wizard (C19)

Purpose: Turn a vague need into a structured, comparable request sent to up to N vendors — without form fatigue. This is the platform's core liquidity engine; each step is one decision (progressive disclosure).

Flow & layout:

[Stepper: ● ● ● ○  step 3 of 4 — mirrors in RTL]
Step 1 — Event basics: link to existing Event OR inline-create
         (type, date [+flexible ±days toggle], city/area, guests)
Step 2 — What do you need: category (pre-filled if entered from a
         vendor/category), free-text requirements, structured extras
         per category (e.g. Venues: indoor/outdoor, seating style)
Step 3 — Budget & attachments: budget band (slider or "not sure"),
         attachments (images/PDF ≤10 files, ≤10 MB each), quote deadline
Step 4 — Choose vendors: pre-filtered matching list, select 1–10
         (checkboxes), entry vendor pre-selected
Review sheet: summary card → [Send request ●]
[Every step: ‹ Back · autosave "Draft saved ✓" · Next ›]

Components: stepper, event picker/creator, category-specific field groups (config-driven), budget slider with "غير متأكد" / "Not sure yet" checkbox, file uploader with progress + previews, vendor multi-select cards, review summary.

States: Draft autosave after every step (RFQ status Draft); resumable from Home and RFQ list. Sending — blocking progress ≤3s then optimistic success. Success — celebration-light confirmation: «تم إرسال طلبك إلى 5 مزوّدين» / "Your request went to 5 vendors" + expected-response note + [Track quotes]. Error — draft preserved, retry; per-file upload errors inline.

Validation: date ≥ today+1 (same-day RFQs disallowed at MVP); guests 1–5,000 integer; budget min ≥ KWD 10.000 when specified; requirements text ≤ 2,000 chars; ≥1 vendor selected, ≤10 (and per-plan receive-quotas apply vendor-side); deadline between +1 and +14 days, default +5. Field errors inline in the field's language — AR: «اختر تاريخ المناسبة أولًا» EN: "Choose your event date first."

Microcopy: budget helper — AR: «الميزانية التقريبية تساعد المزوّدين يقدمون عرض أدق — وما تُشارك إلا معهم» EN: "A rough budget helps vendors quote accurately — it's only shared with them." Step titles are questions, not nouns («شنو تحتاج؟» / "What do you need?").

Edge cases: entry from vendor profile skips vendor selection but shows "add more vendors like this" suggestion; category with zero other vendors → step 4 shows the single vendor honestly, no padding; user abandons mid-upload → draft keeps completed uploads; changing category at step 2 after filling step 3 preserves budget/attachments, resets structured extras with a confirm; event date change after draft creation re-validates vendor availability hints.


5. Quote Compare (C21)

Purpose: The "confidence moment": put received quotes side-by-side so the customer decides on substance (price, inclusions, terms), not on whoever messaged last. Primary action: Accept one quote → booking flow.

Layout (mobile):

[Header: RFQ title · status chip "3 of 5 responded" · deadline countdown]
[Horizontal card pager, one quote per card (peek of next):
   vendor mini-header (name, ✓, ★)
   TOTAL: KWD 1,250.500 (large)
   line items (first 4, expandable)
   validity: "expires in 3 days"
   chips: deposit %, cancellation terms
   [Accept ●] [Message] [Reject ⋯]]
[Compare table toggle (2–3 quotes side-by-side, h-scroll):
 rows = total · deposit · line items ✓/– matrix · validity · rating]
[Non-responders row: "Awaiting: X, Y — remind"]

Web: table view is primary, cards secondary.

Components: quote card, comparison matrix, countdown chips, accept-confirmation sheet (restates total, deposit due now, validity), reject sheet with optional reason (helps vendor quality loop), negotiate → opens message thread with quote pinned.

States: Zero quotes yet — timeline expectation: «عادةً توصل أول العروض خلال 24 ساعة» / "First quotes usually arrive within 24 hours" + [Add more vendors]. Partial — as layout. All expired — explain + [Extend deadline] / [Resend RFQ]. Loading — skeleton cards. Accepted — accepted quote pinned with success treatment; others auto-marked Rejected with notice.

Validation: Accept blocked on expired quote (offer "request revalidation" which pings the vendor); accepting requires an active event date match — if the vendor marked a date conflict since quoting, warn before accept.

Microcopy: accept sheet — AR: «بقبولك هذا العرض، بيتم إنشاء حجز وتدفع عربون 250.000 د.ك الآن. باقي المبلغ حسب اتفاقك مع المزوّد.» EN: "Accepting creates a booking. You'll pay a KWD 250.000 deposit now; the balance follows your agreement with the vendor." Reject reasons list: price, changed plans, chose another vendor, other.

Edge cases: quote revised during negotiation → card shows "Updated" badge + change history link; two quotes accepted race (double-tap/multi-device) → server enforces single acceptance, second attempt gets friendly conflict message; vendor withdraws a quote → card grays with reason; comparing quotes with different structures (hourly vs package) → matrix falls back to totals + free-text rows, never fakes equivalence; RFQ cancelled by customer → all vendors notified, compare screen becomes read-only archive.


6. Event Dashboard (C18)

Purpose: The Event OS made visible: one screen where a customer sees everything about one event — budget position, vendor pipeline, bookings, conversations — and always knows the next action. This screen is why Yam3at is not a directory.

Layout (mobile):

[Event header: name · type icon · date + countdown "in 45 days"
 · Hijri annotation when near religious dates]
[Budget bar: committed KWD 2,150.000 / budget KWD 4,000.000
 (segments: paid · deposits due · quoted-pending)]
[Next actions strip (max 3, priority-ordered):
 "Pay venue deposit by Thu" · "3 quotes to review" · "Rate your photographer"]
[Vendor pipeline board (h-scroll columns or stacked lists):
 Requested (2) → Quoted (3) → Booked (2) — cards = vendor mini + status]
[Bookings timeline: date-ordered confirmed services]
[Quick links: Messages (3 unread) · Files · Add vendors +]

Web: two-column — pipeline + timeline left, budget + actions rail right.

Components: budget progress bar with legend, next-action cards (deep links), pipeline status cards, booking timeline items, event edit sheet (name/date/guests), add-vendor entry → RFQ wizard.

States: Fresh event (empty) — friendly scaffold: budget bar at 0, pipeline empty with «ابدأ بإضافة المزوّدين» / "Start by adding vendors" + top categories for the event type. Loading — skeleton blocks per module. Error — per-module error cards (budget can fail without killing pipeline). Post-event — dashboard flips to wrap-up mode: outstanding balances, review prompts, "rebook favorites" (Rebook is the lifecycle's last step).

Microcopy: budget over-commitment — AR: «العروض المقبولة تجاوزت ميزانيتك بـ 350.000 د.ك — تقدر تعدّل الميزانية أو تراجع الحجوزات» EN: "Your commitments exceed budget by KWD 350.000 — adjust your budget or review bookings." Tone reassuring, never alarming red-alert.

Edge cases: event date passes with pending RFQs → auto-expire with digest notification; deleted/cancelled booking returns its amount to available budget with a ledger note; multiple events share a vendor conversation → thread shows event context chips; guest-count/date edits after bookings exist → warn that confirmed vendors are notified of changes; budget never blocks actions (it informs — the customer stays in control).


7. Vendor RFQ Inbox + Quote Composer (V11–V13)

Purpose: The vendor's money screen. Inbox: triage new requests fast, spot the ones worth quoting, never miss an expiry. Composer: produce a professional, comparable quote in under 3 minutes on a phone.

Layout — Inbox (mobile):

[Header: "طلبات العروض / Requests" · quota chip "12/20 quotes left this month"]
[Filter tabs: New (5) · Quoted · Negotiating · Expiring ⚠ · Archived]
[RFQ cards: event type icon · "Wedding · 250 guests"
 date · area · budget band "KWD 2,000–3,000"
 countdown "respond within 2d 4h" · match chip "matches: Venues"
 [Quote ●] [Decline]]

Layout — Composer:

[Context header: collapsed RFQ summary (expandable) — requirements
 & attachments always one tap away]
[Line items: description (ar/en free text) · qty · unit price → auto totals]
[+ Add item · + Add discount (amount or %)]
[Totals: subtotal · discount · TOTAL KWD 2,450.000 (auto, tabular figures)]
[Deposit required: % or fixed → shows computed amount]
[Validity: 7 days ▾ (3–30)] [Terms & notes ≤1,000 chars] [Attach PDF/images]
[Preview as customer] [Send quote ●] [Save draft]

Components: quota meter (plan-linked, Vendor Subscriptions), RFQ card with countdown, decline sheet (reason required: unavailable date, out of area, budget mismatch, other), line-item editor with numeric keypad, deposit calculator, quote preview modal (renders exactly what the customer sees, in the customer's language layout).

States: Inbox empty (new vendor) — checklist to improve matching: complete profile %, add gallery, add services. Inbox loading — skeleton cards. Quota exhausted — RFQs still visible (never hide demand) but Quote CTA becomes [Upgrade to respond] with plan sheet. Composer draft — autosaved; Sending → optimistic; Sent — success + "customer notified" + expected next statuses.

Validation: ≥1 line item; qty ≥1 integer; unit price > 0, KWD 3 decimals; discount ≤ subtotal; deposit 0–100% (default from vendor settings, warning above 50%: customers accept lower deposits more often); validity 3–30 days; total > 0. Errors inline — AR: «أضف بندًا واحدًا على الأقل» EN: "Add at least one line item."

Microcopy: decline confirmation reassures — AR: «ما بيأثر الرفض على ترتيبك إذا كان السبب عدم توفر التاريخ» EN: "Declining for an unavailable date doesn't hurt your ranking." Expiring tab card: "expires today at 6 PM" absolute+relative.

Edge cases: RFQ cancelled by customer while composing → composer locks with notice, draft archived; two team members (Enterprise) open same RFQ → soft lock "Ahmed is drafting a quote"; attachment from customer fails virus scan → shown as blocked, not broken; vendor edits a sent quote → allowed only in Negotiating status and creates a revision (never silent mutation); RFQ arrives outside vendor's declared service area (customer forced it) → area-mismatch chip shown, vendor decides; plan downgrade mid-month → existing sent quotes unaffected, remaining quota recalculated.


8. Checkout / Payment (C24–C25)

Purpose: Convert an accepted quote into a confirmed booking by taking the deposit — with zero ambiguity about what is being paid, to whom, and what happens if plans change. KNET-first (Kuwait), then cards/wallets, via MyFatoorah/Tap behind the payment abstraction.

Layout:

[Order summary card (collapsed, expandable):
 vendor · event · service · event date
 total KWD 2,450.000 · deposit due now KWD 490.000 · balance later]
[Cancellation policy summary: 2 lines + "read full policy"]
[Payment methods (radio):
 ◉ KNET  ○ Visa/Mastercard  ○ Apple Pay (iOS)  ○ Google Pay (Android)]
[Trust strip: PSP logos · "payments processed securely — Yam3at never
 stores your card number"]
[Pay KWD 490.000 ● — amount ON the button]
→ PSP hosted page / native sheet → return
[Result screen: ✓ success (booking ref, receipt, next steps)
 or ✗ failure (reason, retry, switch method)]

Components: summary card, policy disclosure, method selector (KNET pre-selected in Kuwait), PSP redirect/webview handler, result screen with receipt download (PDF, bilingual), booking deep link.

States: Loading — summary skeleton; Pay disabled until totals verified server-side. Processing — full-screen blocking state with PSP branding: «لا تغلق الصفحة أثناء إتمام الدفع» / "Don't close this page while we complete your payment". Success — the one full celebration moment in the app (single confetti burst, respects reduced-motion) + booking status Confirmed + calendar-add + [Go to my event]. Failure — human reason mapping (declined, insufficient funds, timeout), amount unchanged, [Try again] [Choose another method]; no double-charge possible (idempotency key per attempt). Pending/unknown (webhook lag) — honest state: «ندقق على عملية الدفع — بنأكد لك خلال دقائق» / "We're confirming your payment — you'll hear from us within minutes"; booking held in Pending.

Validation: amount server-authoritative — client never computes the charge; quote must still be valid & accepted at pay time (revalidate on screen open); currency KWD, 3 decimals everywhere including the button; Apple/Google Pay shown only when device-capable.

Microcopy: deposit clarity — AR: «تدفع الآن العربون فقط (490.000 د.ك). المتبقي 1,960.000 د.ك يُدفع حسب سياسة المزوّد.» EN: "You're paying the deposit only (KWD 490.000). The remaining KWD 1,960.000 is due per the vendor's policy." Failure copy never blames the user.

Edge cases: user backgrounds the app during KNET redirect → resume logic re-queries payment status before showing anything; quote expires between accept and pay → graceful revalidation path, not an error wall; duplicate webhook / replay → idempotent booking confirmation; partial refund flows route through booking detail (C27) → Refund Requested status, admin queue (A10); network loss on result screen → status pull on reconnect; receipt email always sent in the customer's preferred_locale with bidi-safe amounts.


Build order

Recommended implementation sequence: 7 → 3 → 2 → 4 → 5 → 8 → 6 → 1. Vendor supply tooling and the vendor profile create marketplace inventory; discovery and RFQ create demand; payment closes the loop; home and event dashboard polish retention last.

Related: Design Principles · Design Tokens · Screen Inventory