Overview / Technical Docs / Product Requirements
Freight Quote Tool · Product Requirements

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)

CutWhy
Quote log / audit trailAt ~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 / parsingOrder-entry scope, not freight.
PDF rate sheetSame workflow accommodation as the log; dropped with it.
Pricing engine / markupMarkup lives in the order-entry software.
Other carriersUPS only for now — most shipments go UPS.
Reporting, grouping, history viewsHeld 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

  1. 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.
  2. Credential handoff — UPS client ID/secret + account linking, handled in one organized request plus a scheduled working hour.
  3. 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.