Product Requirements
What the tool needs to do, who it's for, and — just as important — the decisions about what it deliberately leaves out.
What it is
A small shared web app for the Exquisite Images team: enter a part number, quantity, and destination ZIP — get back live UPS negotiated rates and transit times for all available service levels, in seconds. One link, email-PIN login, nothing installed, no credentials on anyone's desktop.
It finishes the in-house prototype Briana had started: it keeps the good bones of her architecture and replaces the two distribution problems that had stalled it — a browser extension logged in as one person, and a per-machine installer.
Users & volume
- ~5 users, primarily on the Exquisite Images side; one product set covers both brands.
- ~25–30 quotes on a busy day — used on certain customer types, not every order.
- Branding intentionally minimal: it has to work, it doesn't have to be pretty.
Inputs (per quote)
- Part number — looked up in the local product table (carton dimensions, weight/carton, units/carton).
- Quantity.
- Destination ZIP — ZIP alone is enough.
- Residential vs. commercial — toggle.
- Manual mode — enter carton weight and dimensions by hand as an alternative to item lookup; also covers the slice of the catalog (crystal) that has no dimensions in the export.
- Out of scope: multiple line items per quote (uncommon).
Outputs (per quote)
- One query returns the full UPS service table: every available service level, with negotiated cost and estimated transit time, side by side.
- That's the whole output — no PDF, no markup, no saved artifact (markup lives in the order-entry software).
Product data
- Source: the SAGE catalog export (~465 products) — item # → carton L/W/H, weight/carton, units/carton.
- Static, not live — refreshed by re-exporting every week or two. No website/catalog scraping.
- Initial load seeded from the current export during the build; refresh via an admin-only "upload new spreadsheet" button. The upload validates the columns before replacing anything and tells you exactly what's wrong if the format drifted; the UI shows a "catalog last updated" date.
- Carton math: cartons = ceil(qty ÷ units-per-carton); billable weight from weight-per-carton.
Access
- Email one-time-PIN login (Cloudflare Access); ~2-week session — security and convenience.
- Named email addresses (~5 seats), managed for you; the free tier covers up to 50 users.
- Initial user list set at build; the admin role (catalog upload) assigned to specific named users.
- Adds/removes are a same-day change to the named list; only listed addresses can get in.
Explicitly out of v1 (decisions, with rationale)
| Cut | Why |
|---|---|
| Quote log / audit trail | At ~30 seconds a quote, re-running beats storing — there's no real need to save the old result. Cheap to add later (a table + CSV download) if it's missed in real use. |
| PO upload / parsing | Order-entry scope, not freight. |
| PDF rate sheet | Same workflow accommodation as the log; dropped with it. |
| Pricing engine / markup | Markup lives in the order-entry software. |
| Other carriers | UPS only for now — most shipments go UPS. |
| Reporting, grouping, history views | Held back deliberately to avoid scope creep. |
Known facts at design time
- Fixed origin ZIP (Waukesha).
- Negotiated UPS rates on the company's own UPS account.
- The in-house prototype connected to UPS, but its rating call hadn't yet cleared the negotiated-rate permission — the first thing validated on build day.
Open questions at design time
- UPS rating permission — the rating call needs Rating-product access and the account linked on the UPS developer app. Day-1, hour-1 gate: a bare-bones live rate call before any building. If blocked, build against a stubbed rate and close the UPS loop within the week.
- Credential handoff — UPS client ID/secret + account linking, handled in one organized request plus a scheduled working hour.
- Hosting account — RA-configured vs. a client-owned account (the principle: client-owned, RA-configured, "they never have to touch it"). Decided before deploy; cheap to move either way.
Scope & delivery
- Delivered within the engagement as the flagship engineering build.
- Built in a focused two-person session (Nate + Pete together); the v1 target was a one-day build with nothing deferred into it.
- Design-feedback model: one big up-front session gets ~90%, one follow-up round of tweaks — no open-ended redesign loop.
Success looks like
A teammate clicks a link, logs in once with an email PIN, types part number + quantity + ZIP, and reads the full UPS rate/transit table in under 30 seconds — on any machine, zero setup, and no credentials anywhere they could leak.