Requirements
Living specification of what Vintage Value does, by module. Last updated 13 August 2026.
Capture
Get an item and its photos into the system with as little friction as possible.
- CAP-1Users can take photos with the device camera or upload existing files.
- CAP-2Acquisition cost and collection are optional at capture time.
- CAP-3Saving creates an Item plus an ItemImage per photo, with the first marked primary.
- CAP-5Each captured photo is stored in two sizes: a store-sized copy (1600px) used for display and ConsignCloud, and a smaller research copy (900px) used for AI identification.
- CAP-6Photos are always re-encoded as JPEG on upload, so device-specific formats such as HEIC never reach storage or the store.
- CAP-9A photo's orientation never changes during resizing. Phone cameras record rotation in EXIF rather than in the pixels, and re-encoding discards EXIF, so the rotation is applied to the pixels before the copy is written — in the browser by decoding with the image's own orientation, and on the server by reading the EXIF orientation tag and rotating or mirroring to match.
- CAP-7Profile offers a one-time cleanup that re-encodes photos captured before downscaling existed, replacing the full-size file with the current two sizes and reporting how much storage was freed.
- CAP-8The cleanup runs in the browser, processes one photo at a time with visible progress, and skips any photo it cannot read without aborting the rest.
- CAP-4Identification is triggered automatically after save.
Identification
Turn photos into a confident, named identification.
- IDN-1Vision analysis returns ranked candidates with confidence scores.
- IDN-5Identification sends the smaller research copy of each photo, so analysis starts faster without any loss of accuracy — vision models downsample large images regardless.
- IDN-2Each candidate carries category, era, maker, and a short history.
- IDN-3Users select one candidate as the working identification for the item.
- IDN-4Users can refine with extra detail and re-run identification.
Pricing
Estimate resale value from real market data and recommend a decision.
- PRC-1Comparables are pulled from eBay and Etsy, with AI market synthesis as fallback.
- PRC-2Estimates expose a low, mid, and high band plus the basis used and a confidence label.
- PRC-3Commission and flat fees default from the user profile and remain editable per item.
- PRC-4Recommendation badge is one of strong buy, buy, caution, or pass, with a stated reason.
- PRC-5Snapshots are saved so pricing history can be tracked over time.
Inventory & Collections
Organise and retrieve everything the user has researched.
- INV-1Items can belong to zero or one collection and be reassigned at any time.
- INV-2Search filters by free text, status, and recommendation badge.
- INV-3Portfolio summary reports total cost, expected resale, profit, and margin.
ConsignCloud Integration
Push researched inventory into the live consignment store.
- CC-1The store API key is held as a server-side secret and never exposed to the browser.
- CC-2Account linking matches strictly on the signed-in email address — a user can only ever link the consignor account whose email matches their own, and cannot browse or link other consignors.
- CC-7If no consignor account uses the signed-in email, the app explains the mismatch and tells the user to have the store add that email to their consignor record.
- CC-8Signup advises users intending to send items to use the same email as their consignor account.
- CC-3Inventory type (consignment, buy outright, retail) and split are configurable per user.
- CC-4Push maps title, description, details, category, cost, tag price, and SKU (the item id).
- CC-24Only the user's own item notes are sent as the store description. Internal research output — the buy / caution / pass rationale and any estimated margin or net-profit figure — is never sent to ConsignCloud, because store records are customer-facing.
- CC-5Item photos are uploaded and attached automatically during the push, up to eight per item.
- CC-6Items store their ConsignCloud id and sent date; already-sent items cannot be sent again.
- CC-7Push failures are recorded on the item and surfaced to the user with the reason.
- CC-8A user can only push their own items, and only into the account linked on their own profile.
- CC-9A public field mapping page documents every field sent to ConsignCloud, the transform applied, what is deliberately not sent, and what is written back after a successful push.
- CC-10Sending is blocked, and the block is logged, when the user has no linked consignor account.
- CC-11The consignment split is the consignor's share of each sale, stored by ConsignCloud as a decimal fraction (0.86 = consignor keeps 86%, store keeps 14%).
- CC-12The split is read from ConsignCloud automatically — taken from the split already used on the consignor's existing items — when the account is linked, and re-read at send time if it is not yet stored.
- CC-13Users cannot enter or edit their split. It is displayed read-only as "you keep X% / the store keeps Y%", because only the store can change consignment terms.
- CC-14Acquisition cost is sent to the store's "Purchase Price" field, which accepts a value on every inventory type including consignment. It is additionally sent as the built-in cost per item for buy-outright and retail only, because ConsignCloud rejects a cost per item on consignment inventory.
- CC-16Resale price maps to the item Price (tag price) in ConsignCloud.
- CC-17Each item is given a Vintage Value SKU in the form Vv000001 — the letters "Vv" followed by six digits, numbered sequentially across the whole app from Vv000001 onward — so any record in ConsignCloud is immediately identifiable as originating here.
- CC-18A SKU is assigned once, on the first successful send, and is then stored on the item and never changed or reused.
- CC-19Photos are downscaled in the browser when captured (longest edge 1600px, JPEG) so every stored photo stays within the 2MB request ceiling ConsignCloud enforces on base64 uploads.
- CC-20If a photo still cannot be sent, the item is created without it and the user is shown a warning naming the reason; the same warning is recorded in the integration log rather than being silently dropped.
- CC-21If the store-sized photo is rejected, the smaller research copy is tried automatically so the item still arrives with a picture.
- CC-22Items already in ConsignCloud offer a "Resend photos" action that re-uploads and re-attaches their photos to the existing store record, without creating a duplicate item.
- CC-23Resending photos is logged like any other integration call, and is refused with a clear reason when the item has no photos or has never been sent.
- CC-15An item with no resale price is held back before the call is made, with a message asking the user to set one, because ConsignCloud requires a tag price on every item.
Diagnostics & Logging
Make integration failures visible and diagnosable without guesswork.
- LOG-1Every ConsignCloud call writes a log entry recording the action, user, item, outcome, message, HTTP status, and duration.
- LOG-2Outcomes are classified as success, failure (external error or exception), or blocked (stopped by a precondition).
- LOG-3Successful and failed pushes store the exact payload sent, so mapping problems can be inspected after the fact.
- LOG-4Logs are readable, writable, and deletable only by admin accounts, enforced by row-level security.
- LOG-5Logging is written with the service role and never throws, so a logging failure cannot break the operation being logged.
- LOG-6Admins reach the log from Profile and can filter by outcome and expand any entry for full technical detail.
- LOG-7Every stored record type carries an optional free-text description field (up to 1000 characters) so records can be labelled in plain language for search indexing and admin review. It is optional everywhere and no existing behaviour reads or writes it.
Public Site & Navigation
Explain the product and make supporting material easy to find.
- NAV-1Header navigation groups pages under three hover dropdowns: How, Why, and FAQ.
- NAV-2The FAQ dropdown contains FAQ, Demo, Help Center, and ConsignCloud Field Mapping.
- NAV-3Contact sits as a direct header link; Change Log, Requirements, and legal pages sit in the footer.
- NAV-4All header dropdowns share one component and highlight the label when a page inside it is open.
Onboarding & Setup
Get a brand-new user from sign-up to their first researched item without confusion.
- ONB-1A new account is taken to a guided four-step setup wizard — currency, selling fees, store connection, privacy — one decision per screen, with a progress bar and a "Step N of 4" label.
- ONB-2Each step saves as the user advances, so setup can be left and resumed without losing answers, and Back never discards an entered value.
- ONB-3Only currency is answered by default; the fees, store, and privacy steps are marked optional and can be passed through without entering anything.
- ONB-4Every field is explained in plain language with a worked example (e.g. a 20% commission on a $100 sale leaves you $80) instead of bare labels.
- ONB-5Setup ends on a confirmation screen whose primary action photographs the first item, with a secondary link to review settings.
- ONB-6Profile shows a "Finish setting up" checklist listing what is still outstanding and linking back into the wizard; it disappears once nothing is left.
- ONB-7Profile itself is a plain settings page — it no longer doubles as the onboarding screen and no longer redirects after a save.
Accounts & Privacy
Keep each user isolated and in control of their data.
- ACC-1Email/password and Google sign-in, with OTP verification on registration.
- ACC-2Row-level security scopes items, images, collections, profiles, identifications, comparables, and pricing snapshots to their owner — enforced server-side, not in the browser.
- ACC-4The app supports unlimited users; each sees only their own inventory, collections, pricing, and settings.
- ACC-5Every owned record stores an owner at creation time, and every list view filters on the signed-in user.
- ACC-6Only accounts with the admin role can see cross-user aggregate data, and only where the contributor consented.
- ACC-3Community data and photo reuse consent are opt-in and versioned with an audit record.
