Freight Quote Tool · Product Requirements

Mini PRD — Freight Quote Tool

Pete · for Nate's reaction · Rogue Agents × Keystone Recognition / Brightmark Imaging · 2026-06-12

Sources: Megan's two build-session intakes; Nate's brief + Pete POV; Nate+Pete call 6/10; three-way verification call 6/11 (Nate, Pete, Megan, Sandra); Nate+Pete wrap-up 6/11; Megan's email answers 6/11 (inputs/outputs + manual-entry addendum).

What it is

A small shared web app for the Brightmark Imaging 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.

This finishes Megan's tool. It replaces the two distribution paths that defeated her build (a browser extension logged in as her; a per-machine .exe), keeps her architecture's good bones, and drops the parts she's already cut herself.

Users & volume

  • ~5 users, primarily Brightmark Imaging; one product set covers both brands.
  • 25–30 quotes on a good day (Megan, 6/11); used on certain customer types, not every order.
  • Branding: minimal. Title "Brightmark Imaging Shipping Quote Tool" — "it doesn't have to look pretty at all, it just needs to work."

Inputs (per quote)

  • Part number — looked up in the local product table (carton dims, weight/carton, units/carton).
  • Quantity.
  • Destination ZIP — ZIP only is enough.
  • Residential vs. commercial — toggle.
  • Manual mode (Megan, 6/11 email addendum): the ability to enter carton weight and dimensions by hand as an alternative to item lookup. Also covers the ~13% of the catalog (crystal) with no dims in the export.
  • Not in scope: multiple line items per quote ("nah, not very common").

Outputs (per quote)

  • One query returns the full UPS service table: every available service level, with negotiated cost and estimated transit time / delivery days, side by side.
  • That's the whole output. No PDF, no markup, no saved artifact.

Product data

  • Source: the distributor-catalog export (~465 products) — item # → carton L/W/H, weight/carton, units/carton.
  • Static, not live — refreshed by re-exporting "once every week or two or whatever you feel like" (confirmed with Megan 6/11). Website/catalog scraping stays dead.
  • Initial load: we seed the table from her current export during the build; refresh: an admin-only "upload new spreadsheet" button in the tool (her stated preference). The upload validates the columns before replacing anything and tells you what's wrong if the format drifted; the UI shows a "catalog last updated" date so it's obvious when a refresh is due.
  • Carton math: cartons = ceil(qty ÷ units/carton); billable weight from weight/carton.

Access

  • Email one-time-PIN login (Cloudflare Access); session ~2 weeks — "security and convenience."
  • Named email addresses (~5 seats), managed by Rogue Agents; free tier covers 50 users.
  • Initial user list comes from Megan (part of the bulk ask): the ~5 emails, and which of them get the admin role (spreadsheet upload).
  • Adds/removes: email Nate/Pete and it's done same-day — no self-serve user admin in v1. Only listed addresses can get in; nobody else until we allow them.

Explicitly out of v1 (decisions, with provenance)

CutWhy
Quote log / audit trailDecided live 6/11: the old screenshots existed only because re-running a quote was painful; at ~30 seconds a quote, "there's really no need to save the old result" (Megan). Cheap to add later (DB + CSV download) if it feels clunky in use.
PO upload / Claude parsingOrder-entry scope, not freight (wrap-up 6/11).
PDF rate sheetSame workflow accommodation as the log; dropped with it.
SharePoint uploadOut with the log.
Pricing engine / markupMegan cut it herself — markup lives in their order-entry software.
Other carriersUPS only for now; "most of our shipments go out UPS."
Reporting, grouping, history views"Watch out for scope creep" — unanimous.

Confirmed facts

  • Origin ZIP always 46514 (Elkhart) — confirmed 6/11.
  • The shipper's UPS account, negotiated rates.
  • A previously-exposed credential was rotated ahead of handoff — moot for v1 anyway with SharePoint out.
  • Megan's rebuilt app (6/10–11): UPS API connecting, but the rating call failed on a missing permission she didn't get to — the validation gate below.

Open questions

  1. UPS rating permission — her failed rating call is almost certainly Rating-product access / account-linking on the UPS developer app (needed for negotiated rates). Day-1 hour-1 gate: bare-bones live rate call before any building. If blocked, build against a stubbed rate and close the UPS loop async within the week.
  2. Credential handoff — UPS client ID/secret + account linking; Nate does one organized bulk ask, plus a scheduled hour on-site/screen-share with Megan.
  3. Hosting account — Rogue Agents' Cloudflare vs. a Keystone-owned account (6/10 principle: client-owned, RA-configured, "they never have to touch it"). Decide before deploy; cheap to move either way.
  4. Credential rotation — rotate the UPS keys at handoff as a standard precaution; fold into the credential handoff.

Engagement framing & timeline

  • Free to client — included in the current engagement as the single quick-win build (really a small-project full build); it replaced the Vendor Price Change quick win.
  • Build days: Mon 6/15 — Tue 6/16, Nate + Pete together; v1 target is the 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 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, with zero setup, and no credentials anywhere a coffee-shop sticky note could leak.