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)
| Cut | Why |
|---|---|
| Quote log / audit trail | Decided 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 parsing | Order-entry scope, not freight (wrap-up 6/11). |
| PDF rate sheet | Same workflow accommodation as the log; dropped with it. |
| SharePoint upload | Out with the log. |
| Pricing engine / markup | Megan cut it herself — markup lives in their order-entry software. |
| Other carriers | UPS 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
- 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.
- Credential handoff — UPS client ID/secret + account linking; Nate does one organized bulk ask, plus a scheduled hour on-site/screen-share with Megan.
- 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.
- 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.