01 Cover
GroundWork Home & Hardware · fictional brand

GroundWork: Writing the Aisle-to-Checkout Journey

The best hardware-store copy sounds like the employee who already knows where the bolts are, not a marketing department.

A UX writing case study covering a product page, cart, checkout, and post-purchase notifications, with the real in-situ copy, not descriptions of it.

Scope 7 artboards · PDP → post-purchase
Craft shown Error states · a11y labels · FR-CA readiness
Walkthrough ~5 minutes, left to right
02 Product detail page
GroundWork
ShopAislesPickupOrders
product shot, cordless drill, unbranded packaging
+3
Aisle 12 · Power tools / Drills

Ridgeline 18V Cordless Drill/Driver, 2 batteries, charger, hard case

$129 SKU 4471-118 · Model RL-D18K
Only {{ stock }} left near you. Order today for pickup tomorrow

Stock counted at Eastbridge Yard, 4.2 km away. Two other stores within 20 km have it.

1

Free pickup. Delivery from $9. Most orders arrive in 2 days.

Which drill do I need?

If you're hanging shelves, assembling furniture, and putting up curtain rods, this 18V kit is more drill than you'll need. It's the one to buy. Step up to the 20V hammer-drill kit ($189) only if you'll be drilling into brick, concrete, or tile, where a regular drill will stall and overheat. Both take the same batteries, so you can start here and add the bigger tool later without buying a second charger.

This page · $129 Wood, drywall, flat-pack, metal brackets
20V hammer kit · $189 Brick, concrete, tile, repeated masonry work
Annotation · accessible name Visible label stays short for the layout; the accessible name carries the context a screen-reader user loses without the surrounding page.
Visible "Add to cart" aria-label "Add Ridgeline 18V drill kit to cart, $129"
Quantity is left out on purpose, the stepper announces it separately, and repeating it read as a price change in testing.
Hover state Hover darkens the button only. No tooltip: if a control needs an explanation on hover, the label is wrong.
03 Cart & error states

Your cart ({{ stock }} items)

State · quantity exceeds stock
!
You've added more than we have in stock, so we've adjusted your cart to {{ stock }}, the most we have nearby. Need all {{ requested }}? We can ship the other {{ shortfall }} from the Northfield warehouse in 4–6 days, or hold your {{ stock }} for pickup tomorrow and send the rest separately.
Ridgeline 18V Cordless Drill/Driver kit Pickup · Eastbridge Yard, ready tomorrow before 10 a.m.
{{ stock }}
{{ subtotalFmt }}
SPRINGYARD ended on May 31. Your GARDEN10 code is still good until October 15, want to use that instead?
Second promo variant "GARDEN10 is for outdoor and garden items. There's nothing in your cart it applies to yet, it covers the soil, mulch, and planters in Aisle 3." Two failures, two different reasons, two different messages.
State · empty cart

Nothing in the cart yet

Your last order was 2×4s and joist hangers back in April. Picking up where you left off?

04 Checkout & purchase flow
1 · Delivery2 · Payment3 · Review

When should we bring it?

Delivery, $9
We unload it at your driveway or garage. You take it from there.
Delivery + install, $89
An installer mounts it, tests it, and takes the packaging away. Most people skip this for a drill, but it's worth it for the wall-mounted charging rack if you're not drilling into your own studs.
Pick a day
Tue, Sep 15 8 a.m.–12 p.m.
Wed, Sep 16 12–4 p.m.
Thu, Sep 17 Fully booked
Fri, Sep 18 Install slots only
Install days are set by the crew's route, so they're fewer. Delivery-only is available every weekday.
State · payment declined
Your bank didn't approve this card. Nothing has been charged and your cart is still here. Banks don't tell us why. The usual reasons are an expired card or a billing address that doesn't match. Try a different card, or call the number on the back of this one.

Review your order

Last look before we charge your card. You can still change the date or the install add-on.

Drill kit × {{ stock }}{{ subtotalFmt }}
Delivery, Tue Sep 15, 8 a.m.–12 p.m.$9.00
Install service, not added$0.00
Tax{{ taxFmt }}
Total charged today{{ totalFmt }}
Localization flag · FR-CA Flagged at hand-off: French runs ~20% longer than English. The declined-payment heading and its button both need room to grow, so the button is set to hug its label with no fixed width, and the error heading is allowed to wrap to three lines.
EN · 22 char Use a different card
FR-CA · 27 char (+23%) Utiliser une autre carte
Strings ship with a 40-character soft cap and a note to translators: keep "rien n'a été facturé" in the first sentence, reassurance before explanation.
05 Confirmation & notifications
Order placed

That's booked. Tuesday between 8 and noon.

Order 4471-8820. We'll text the driver's two-hour window the night before, and again when they're 20 minutes out. Someone over 18 needs to be there to sign.

Charged{{ totalFmt }} · card ••4471
Returns90 days, receipt in your email
Change itFree until Monday 6 p.m.
One event, "order confirmed", across three channels
SMS · 160 char cap
GroundWork: order 4471-8820 confirmed. Delivery Tue Sep 15, 8am–12pm. We'll text the driver's window Monday night. Change or cancel: gw.co/o/8820
148 characters · brand name first, because the number is unknown to them
Email · inbox preview
GroundWork Your drill kit arrives Tuesday morning Order 4471-8820 · 8 a.m.–12 p.m. · someone over 18 needs to sign. Full receipt inside.
Subject leads with the thing, not the order number. That's what they'll search for later. Preview carries the sign-on-delivery constraint the SMS had no room for.
Push · 2 lines, no scroll
Install crew comes tomorrow, 1 to 3 p.m. Clear a path to the wall and unlock the side gate. Tap to reschedule.
Push is the only channel that asks them to do something before the crew arrives, so the ask comes before the link.
Rule of thumb Same facts, different jobs. SMS = proof it worked. Email = the record. Push = the nudge to act. None of the three is a truncation of another.
06 Content guidelines · excerpt

Voice principles

Five rules, each with the line that proves it. If a draft fails one of these, the fix is usually deleting an adjective.

01
Sound like a knowledgeable neighbour, not a catalog "This 18V kit is more drill than you'll need. It's the one to buy."
02
Say what happened and what to do next "Your bank didn't approve this card. Nothing has been charged. Try a different card."
03
Never blame the customer for an error "We've adjusted your cart to 4", not "you entered an invalid quantity".
04
Numbers over adjectives "Only 4 left near you" beats "Hurry, going fast!" Every time, in testing and in returns.
05
One decision per screen, in the customer's words "When should we bring it?" is the question they're actually answering. "Fulfilment method" is ours.

Before / after

Inherited line
GroundWork version
Why
"Error: invalid quantity."
"You've added more than we have in stock, so we've adjusted your cart to 4, the most we have nearby."
Names the cause, reports the fix already applied, and gives the number so they can decide what to do about the rest.
"Limited availability. Act now!"
"Only 4 left near you. Order today for pickup tomorrow."
Scarcity is only persuasive when it's checkable. A count and a date are both.
"Enhance your purchase with our premium installation solution."
"Most people skip this for a drill, but it's worth it for the wall-mounted charging rack if you're not drilling into your own studs."
An upsell that tells you when to decline earns the trust that makes the yes real. Attach rate went up, install refunds went down.
07 Research & QA
Usability script · excerpt, 5 of 11 questions

Testing the quantity-error message

Unmoderated, 8 participants, first-time drill buyers. Cart pre-loaded with 7 units against stock of 4, so the message fires on load.

  1. Q1Look at this cart and tell me, in your own words, what just happened.
  2. Q2How many drills are in the cart right now, and how many did you ask for?
  3. Q3Did anything change on this page without you doing it? How do you feel about that?
  4. Q4If you still wanted all seven, what would you do next? Show me.
  5. Q5Whose fault does this message sound like: yours, the store's, or nobody's?
Findings → what shipped
6 of 8 read "nearby" as "in this store only" and assumed the other three didn't exist anywhere. Added the warehouse option inside the error itself: "We can ship the other {{ shortfall }} from the Northfield warehouse in 4–6 days."
3 participants re-typed the quantity, not noticing the cart had already been corrected, they read the message as an instruction, not a report. Moved "we've adjusted your cart to 4" into the first sentence and outlined the stepper in the same clay as the banner.
Nobody blamed themselves for the quantity error, but 4 of 8 blamed themselves for the declined card, mentioning "I probably typed it wrong". Rewrote the decline to open with the bank, add "nothing has been charged", and name the two common causes before any retry.
Content QA · run before every release
Tone pass: read every new string aloud. If it sounds like a sign in a mall, rewrite it.
Reading level: grade 7 or below for errors and checkout; measured, not guessed.
Accessible names: every icon-only and short-label control has an aria-label that makes sense read alone.
Translation-readiness: no concatenated strings, +20% room on FR-CA labels, notes attached for anything idiomatic.
Channel limits: SMS ≤ 160, push title ≤ 40, email subject ≤ 45, each checked on a real device.
Brand terms: "pickup" not "click & collect", "install service" not "installation solution", "yard" not "branch".
08 Mobile · what the copy does, not just the layout

375 px viewport. Layout reflow is the easy half. The decisions worth reviewing are which sentences survive intact, which get held behind a tap, and which get rewritten shorter without losing the fact they carry.

Product page
9:41GroundWork
product shot
Ridgeline 18V Cordless Drill/Driver kit $129
Only {{ stock }} left near you. Pickup tomorrow.
Which drill do I need? For shelves, furniture, and curtain rods, this kit is the one to buy. Read the full comparison ↓
Cart · quantity error
9:43Cart
We only have {{ stock }} nearby, so your cart now says {{ stock }}. We can ship the other {{ shortfall }} in 4–6 days.
Drill/Driver kit ×{{ stock }} {{ subtotalFmt }}
Checkout · declined
9:46Payment
DeliveryPaymentReview
Your bank didn't approve this card. Nothing has been charged and your cart is still here. Banks don't tell us why. The usual reasons are an expired card or a billing address that doesn't match. Try a different card, or call the number on the back of this one.
Total stays {{ totalFmt }}. Your Tuesday delivery window is held for 30 minutes.
String
Mobile treatment
Why
Payment declined, both sentences
Kept word for word
This is where people panic about being charged twice. Scroll is cheaper than a support call.
"Which drill do I need?"
First sentence + "Read the full comparison"
The recommendation is the payload; the masonry caveat only matters to the minority who need it. Expansion, not deletion.
Quantity error heading
Rewritten shorter, same two facts
"We only have {{ stock }} nearby, so your cart now says {{ stock }}" keeps cause and correction inside two lines at 375 px.
Stock line + store distance
Count kept, "4.2 km away" moved to the store sheet
Numbers over adjectives still applies, but only one number can lead. The count drives the decision; the distance answers a later question.
Error buttons
Same labels, stacked full width
Shortening a destructive-feeling choice to fit side by side is how "Keep {{ stock }}" becomes "OK". Stack instead.
09 Translation readiness · EN → FR-CA

String spec, five representative labels

Character counts measured on the live strings, not estimated. Anything over the 40-character soft cap in either language goes back to English for a rewrite before it reaches a translator.

English
FR-CA
EN
FR
Layout note
Add to cart
Ajouter au panier
11
17
+55%. Primary button hugs its label, no fixed width. Fits.
Use a different card
Utiliser une autre carte
20
24
+20%. The canvas-04 case. Button grows, error heading wraps to three lines.
Keep {{ stock }} and continue
Conserver {{ stock }} et continuer
19
24
+26%. Number is a placeholder, not concatenated text, so plural rules stay with the translator.
Order today for pickup tomorrow
Commandez aujourd'hui, ramassage demain
31
39
+26%. One character under the cap. Flagged as at-risk if the date format ever changes.
Reserve for in-store pickup
Réserver pour ramassage en magasin
27
33
+22%. Secondary button is full width on both viewports, so growth is free here.
Never translate
GroundWorkBrand name. Never "TravauxTerrain", never split into two words.
Aisle 12"Allée 12" is correct French, but the number is painted on a physical sign. Keep the digit, translate the word only in body copy, never in wayfinding.
Eastbridge YardStore name as registered and as it appears on the building. Not "Cour Eastbridge".
Ridgeline, RL-D18KProduct line and model code. Searchable strings; translating them breaks support.
Always translate the same way
pickupramassage
install serviceservice d'installation
delivery windowplage de livraison
in stocken stock
One term, one translation, everywhere: page, SMS, email, push, receipt. Drift between "ramassage" and "cueillette" is the same bug as drift between "pickup" and "click & collect".
Rewritten in English because the French didn't fit
Before · 36 / 50 char "Add the install service to this order" "Ajouter le service d'installation à cette commande" · 10 over the cap
After · 19 / 26 char "Add install service" "Ajouter l'installation" · fits both viewports
"To this order" was doing no work in either language. The cap didn't compromise the English, it found padding in it. That is usually what a localization constraint turns up first.
10 Results · illustrative impact model
Illustrative impact model GroundWork is a fictional brand and these figures are modelled, not measured. What is real is the measurement plan: each number below is tied to one copy decision on this canvas and to the instrument that would read it.

What this work is measured against

Four metrics, each with the specific line written to move it. If a metric has no line attached, it isn't this project's to claim.

Cart abandonment after an error −18% modelled · 30-day window
Targeted by: the quantity error reporting the correction it already made, with the warehouse option inside the message. Read as: sessions that hit the stock error and still reach confirmation. The old line ended the session by leaving the customer with nothing to do; the new one offers two ways forward, so the error becomes a fork instead of a wall.
Support contacts per 1,000 orders −24% modelled · "where is my order" tickets
Targeted by: the confirmation screen and the three-channel notification set stating the window, the signature rule, and the change deadline up front. Read as: tickets tagged delivery-timing or order-status within 7 days of purchase. Every question answered in the SMS or the email subject is a call that doesn't happen, which is why "someone over 18 needs to sign" earns its place in the preview text.
Install service attach rate +6 pts modelled · with install refunds down
Targeted by: the upsell that tells you when to say no. "Most people skip this for a drill, but it's worth it for the wall-mounted charging rack." Read as: attach rate paired with install refunds, never alone. Attach rate alone rewards pressure; the pair only improves if the people who said yes actually needed it. This is the before/after row on canvas 06 turned into a metric.
FR-CA layout defects at QA −90% modelled · truncation bugs per release
Targeted by: the 40-character soft cap, no concatenated strings, and the +20% room budgeted on every label. Read as: strings returned by localization QA for clipping or overflow. Cheapest metric on this list to move, because it is caught in English before the translator ever sees the string.
What I would not claim Revenue and conversion rate. Copy moves them, but so does price, stock, and the weather in April. The four above are close enough to the words that a copy change is a plausible cause, and that is the bar I would hold my own work to in a real review.