HelsaGrace
All work

Case study — 05

Borrowly

A neighbourhood marketplace for borrowing everyday things — free or paid per day, with refundable deposits, honest pricing maths, and discovery across cities rather than one building.

MarketplaceProduct DesignReactPrototype
My role
Product Designer + Frontend Developer
Category
Community marketplace
Scope
Research framing, flows, UI system, build
Status
Interactive prototype — no live demo

The problem

Borrowing from neighbours works in spite of its tools, not because of them

Asking to borrow something is a social act held together by group chats, doorbell rings and memory. The person lending has no easy way to say when the item is free, what it costs to borrow, or what happens if it comes back damaged. The person borrowing has no way to compare what is nearby without asking around.

Marketplaces solved this for buying and selling, then borrowed the wrong parts for lending: escrow, guarantees and delivery. I wanted to see what a marketplace looks like when it is honest about being local, social and mostly free.

The bet

Price clarity and location honesty beat a wall of badges

Most of the design work went into two questions people actually ask before they tap: what will this cost me, and how far away is it? Everything else — trust cues, condition, accessories, handover — supports those two answers.

The prototype covers the full loop: discover, item detail, request, confirmation, active borrowing, extension and return, plus an owner-side listing flow.

  • Free lending stays first-class: a free listing never shows a fee or a deposit.
  • Paid lending charges per borrowing day, using the same date maths everywhere.
  • A deposit is always shown separately from the fee, because it is returned, not spent.
  • Location is a neighbourhood, never an address — the exact handover point is private until you agree a collection.
The journeyEight screens, one loop
  1. Discover
  2. Item
  3. Request
  4. Confirmation
  5. Borrowing
  6. Return

State moves forward only when the action that causes it happens: a request is approved, an item is collected, a return is handed back. Extensions and overdue states sit inside the same loop rather than becoming separate journeys.

The pricing model

One rule, applied everywhere

The daily fee is multiplied by the number of borrowing days, taken from the same date utilities that validate the request. The listing form, item page, request summary, active loan and extension sheet all read from that one calculation, so the numbers can never disagree.

A deposit is a separate line and a separate decision. It is refundable by agreement between the two people, and the interface never implies Borrowly holds or settles it.

What a borrower sees3-day borrow at ₦500/day

Free listings

No fee, no deposit, no badge clutter. A free listing never shows a price at all.

Paid listings

The daily fee is charged per borrowing day, using the same date maths that validates the request — so 1 day is ₦500, 3 days is ₦1,500 and 7 days is ₦3,500.

Refundable deposit

A separate decision for the lender, shown on its own line. It is returned by agreement; Borrowly never implies it holds or settles the money.

Borrowing period3 days
Borrowing fee₦1,500

₦500 a day × 3 days

Refundable deposit₦5,000

Returned when the item comes back

Before handoff₦6,500

Discovery

Neighbourhoods, not one building

The first version assumed Maple House was the whole world. Real borrowing happens across a city: you might walk to the next street but drive to another neighbourhood. Search is therefore a manually chosen area plus a distance tier, matched against the neighbourhood each listing declares.

No location permission is ever requested. There are no coordinates and no invented distances — the model ranks by community, then neighbourhood, then city, and names the area instead of promising a number of metres.

How far you are lookingChosen by hand — no GPS prompt
  • AnywhereEvery city in the sample set
  • Whole cityLagos
  • NeighbourhoodYaba
  • CommunityMaple House

Each listing declares a city, neighbourhood and optional building. Ranking is derived from that declaration — never from coordinates — and the exact handover spot stays private until a request exists.

The system

A warm, editorial shell around a practical object

Borrowly deliberately avoids the fintech look. Paper surfaces and a forest-green ink read closer to a noticeboard than a checkout. Fraunces carries headings and prices; DM Sans stays out of the way for everything you have to read quickly.

The component set is small on purpose: one card, one pill, one sheet, one calendar, one price breakdown. Reusing those five things across eight screens is what keeps the prototype coherent at speed.

Design tokensWarm paper, forest ink, coral for price
  • PaperSurfaces#f5f0e6
  • InkText and actions#173e35
  • CoralPrice and emphasis#dc6449
  • SageQuiet panels#dde7d6
  • EarthLines and borders#c9bba5

Type pairing

Fraunces

Headings, prices, empty states

DM Sans

Interface, labels, body copy

What I'd do next

The hard parts are the human ones

This is a front-end prototype: one account, local state, no payments and no messaging backend. The other side of a request is automated so the journey can be walked end to end.

The next honest step is not more screens — it is testing whether people will actually charge a neighbour, and whether a refundable deposit reads as fair or as suspicion. Those are research questions, not UI questions.

Built with

React 19TypeScriptViteTailwind CSS v4localStorage