Filling in the Gem Candies data file
- What
- The "Gem Candies" Grist document — the single ledger behind the "SKU ledger" / "PO ledger" referenced throughout these procedures. One row per real-world thing: one vendor, one stone, one sale, one payment.
- Where
- docs.getgrist.com/27LRLgF2Q5hd/Gem-Candies
- Powers
- The internal tools site (
services/gem-candies) — dashboard and data-entry forms — reads and writes this file directly. A bad row shows up there within seconds, not just here.
Before you start
- One row per real-world thing. A physical stone that gets recut, reset, or re-certified is still the same stone — update its existing
Stonesrow, don't create a second one. - Never edit a formula field. Grist greys these out, but if you're pasting a block of cells, make sure you don't paste over them. Anything in a table below tagged Formula is computed from other fields — fix the input, not the output.
- Match the ID formats already in use so cross-references and lookups stay predictable. Examples from the live data are given in each section below — follow them rather than inventing a new pattern.
- Unknown is a value, not a blank. If a stone's origin or clarity genuinely isn't known, pick "Unknown" from that field's list rather than leaving it empty — an empty reference field and a deliberate "Unknown" mean different things (not recorded yet, vs. recorded as unverifiable).
- New choice not in a dropdown? Add it to the underlying lookup table first (see Lookup tables below), then pick it — don't type a near-duplicate as free text.
- Review imported rows. The Dropbox importer adds Review status to
Vendors,PurchaseOrders,Stones,Certificates,Clients,Sales,SaleLines,Receipts,Payments,ExtraCosts, andStoneEvents. Unconfirmed means a clear automatic result still needs human review; Dubious means evidence conflicted or matched ambiguously; only a person sets Confirmed. This is separate from whether ingestion is pending, applied, duplicate, failed, or archived. The Worker-ownedInvoicestable does not receive this field.
Recommended entry order
The tables are wired together with references and formulas, so filling them in this order means every total is already correct by the time you get to the last step — no separate reconciliation pass needed.
A new stone arrives
- Vendor — check
Vendorsfor the supplier; add a row only if they're new. - Purchase order — add one
PurchaseOrdersrow per invoice, even for a single stone. Set Total PO cost to the full invoice amount as soon as you have it. - Stone — one
Stonesrow per physical stone, linked to that purchase order. Leave Acquisition cost blank unless you know this specific stone's price separately from the rest of the invoice — with the PO's total cost and every stone's carat weight filled in, the per-stone cost allocates itself. - Certificate — if the stone is certified, one
Certificatesrow per lab report. - Photos — one
Photosrow per stone, per Procedure 9's SKU-prefixed folder convention. - Extra costs — certification fees, duties, inbound shipping: one
ExtraCostsrow each, linked to the stone or the PO. These feed into the stone's total cost basis automatically. - Listing — once the Shopify product is published (Procedure 4), add a
Listingsrow linking the two.
A sale happens
- Client — check
Clients; add a row only if they're new. - Sale — one
Salesrow per receipt/order, with commission, shipping, and tax as separate figures. - Sale line(s) — one
SaleLinesrow per stone in that sale, linked to both the sale and the stone. This is what marks the stone sold in the ledger's cost/margin math. While Shopify is on standby, this Grist row — together withStones.Status— is the authoritative "is it sold" flag; once Shopify is live, Shopify inventory takes over that role (Procedure 5/6). - Payment(s) — one
Paymentsrow per payment received. Most sales are one payment for the full amount; installments get one row each.
A ring is ordered
- Sale and sale line(s) — as above. A ring bought with one of our stones has two lines: a Gemstone line linked to the stone, and a Ring line linked to the ring order below. A ring on the client's own stone has just the ring line.
- Ring order — one
RingOrdersrow, linked to the sale, the setting design and the jeweller. Set Stone source first: it decides whether a stone gets linked at all. - Custody — update the stone's Location as it actually moves, and the ring order's Status alongside it. If the client sent her own stone straight to the jeweller, there's nothing of ours in transit and nothing to update.
- Jeweller's invoice — one
ExtraCostsrow of type Ring making, linked to the ring order, when his bill arrives. This is what turns the ring line's margin from a guess into a fact. - Close it — set the ring order to Delivered once the client has it.
Table by table
Vendors — suppliers you buy stones from
ID format in use: V-000001, V-000002, … Add a row before you can record a purchase order from a new supplier. Since 2026-09-03 the fields here are the same ones Shopify's Create supplier form asks for (Procedure S01), so a new supplier can be entered in both places from the one invoice — only the name is ever required.
| Field | Notes |
|---|---|
| Vendor ID Key | Next sequential V-0000##. |
| Duplicate Formula | Stays blank while this Vendor ID is unique. Turns red with DUPLICATE VENDOR ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Vendor name | How you refer to them day to day. |
| Channel Choice | Direct / dealer, Instagram, Telegram, Auction site, Website, Client-sourced, Unknown. |
| Handle / contact | Phone, email, @handle — whatever you'd use to reach them. |
| Country Reference | Links to L_Country, the same lookup Stones' Origin field uses. Added 2026-08-31 for the dashboard's Purchases-tab world map — fill it in for existing vendors as you get to them; blank just means that vendor's spend won't show up on the map yet. Briefly a Choice holding the country name instead (2026-08-31 to 2026-09-06); see GRIST_DATA_MODEL.md's change log. Add a new country as an L_Country row, not a choice on this field. |
| Contact name | The person you deal with, if the vendor is a company. The Handle / contact field above is the @handle or Telegram name; this one is a name. |
| Phone number | |
| Address / Apartment, suite, etc. / City / State / province / Postal code | The vendor's address, one field each, alongside Country above. Fill in what you have — none of it is required, and none of it feeds a calculation. |
| Payment terms Choice | Prepaid, Net 15, Net 30, Net 60, Other — the same list as a purchase order's. This is the vendor's usual terms; the PO records what was actually agreed for that order. |
| Supplier currency Choice | USD, EUR, GBP, THB, Other. The currency this vendor invoices in. |
| Legacy source strings | Migration artifact — the various spellings this vendor appeared under in old records. Leave as-is; don't add to it for new vendors. |
| Notes | Anything else worth remembering about dealing with them. |
Clients — buyers
ID format in use: C-000001, C-000002, … Add a row before recording a sale to a new client.
| Field | Notes |
|---|---|
| Client ID Key | Next sequential C-0000##. |
| Duplicate Formula | Stays blank while this Client ID is unique. Turns red with DUPLICATE CLIENT ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Client name | |
| Email / Phone | Fill in as you collect them — not required to create the row. |
| Billing / shipping address | Full address as it should appear on a receipt or shipping label. Also what the sales dashboard parses for state-level sales reporting, so keep the state abbreviation and ZIP at the end of the line. |
| Legacy names | Migration artifact, same purpose as Vendors' legacy field. Leave as-is. |
| Notes |
PurchaseOrders — one row per supplier invoice
ID format in use: PO-000001, PO-000002, … Every owned stone should trace back to one of these — a parcel PO for a multi-stone invoice, a one-stone PO for a single buy.
| Field | Notes |
|---|---|
| PO ID Key | Next sequential PO-0000##. |
| Duplicate Formula | Stays blank while this PO ID is unique. Turns red with DUPLICATE PO ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| PO name | Short human label, e.g. "Niamat PO #1". |
| Vendor Reference | Links to Vendors. |
| Purchase date | Pick from the calendar widget — enter it as a normal date, Grist stores the rest. |
| Description | What was on the invoice, e.g. "Parcel of 20 — pinks/rubellite". |
| Total PO cost | The full invoice total, in whatever currency Currency says — enter it as soon as you have the invoice, even if not every stone on the parcel has been intake-processed yet. Reference only as of 2026-09-06 — it no longer splits automatically across the parcel's stones (see the gemstone rows below, and Acquisition cost on Stones). |
| Currency Choice | USD, EUR, GBP, THB, Other. Informational only — nothing converts or recalculates from it, so if a vendor invoices in something other than USD, note the rate used (if any) in Notes. |
| Payment terms Choice | Prepaid, Net 15, Net 30, Net 60, Other. |
| Invoice # Built | The vendor's own invoice number, e.g. "1746". Its own column as of 2026-09-06 — older POs entered before that date still carry it in Notes instead. |
| Notes | Discrepancies between what was described and what arrived, anything the next person needs to know. |
| Stones on PO / Carats on PO / Implied cost per carat Formula | Computed from the linked Stones rows — a quick check that every stone from this invoice has actually been entered. |
Stones — the core ledger, one row per physical stone
SKU format in use: GC-000001, GC-000002, … (six digits — confirmed as the format by the owner on 2026-08-24, and matched by Procedure 1). Assign the SKU and record intake per Procedure 1.
| Field | Notes |
|---|---|
| SKU Key | Next sequential GC-0000##. Permanent once issued — never reassigned, per Procedure 1. |
| Duplicate Formula | Stays blank while this SKU is unique. Turns red with DUPLICATE SKU if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Legacy inventory no. | Migration artifact from the old numbering. Leave blank for new stones. |
| Gem type Reference | Links to L_GemType (Sapphire, Tourmaline, Spinel, …). |
| Variety / trade name | Free text, e.g. "Rubellite", "Padparadscha". |
| Shape Reference | Links to L_Shape. |
| Color nuance Reference | Links to L_ColorNuance. |
| Clarity Reference | Links to L_Clarity. |
| Origin Reference | Links to L_Country. |
| Treatment Reference | Links to L_Treatment. |
| Carat weight (ct) | Drives cost allocation and every downstream $/ct figure — get this right before anything else. |
| Length / Width / Depth (mm) | |
| Piece count | Almost always 1. Only >1 for a genuinely inseparable matched set sold as one SKU. |
| Set group | Free text tag linking pieces sold only as a set. Leave blank otherwise. |
| Status Formula | Candidate (not owned), On order, In stock, Reserved, Sold, Returned, Unknown. You can't type this any more — it is worked out from the stone's movements in StoneEvents (see below), so you change it by recording what happened, not by editing the field. While Shopify is on standby it remains the source of truth for "can this be bought" — nothing else is authoritative yet. Once Shopify is live, Shopify inventory becomes the storefront-facing source of truth and this should track it instead. |
| Spec source Choice | Lab report, Measured in-house, Vendor claim, Unknown. Not cosmetic — your receipts assert in-house verification, and the 14-day return clause turns on this being accurate. |
| Purchase order Reference | Links to PurchaseOrders. Every owned stone should have one. There is no separate Vendor field on this table (removed 2026-09-06, redundant with the PO's own Vendor) — a stone's vendor is whoever is on this purchase order. |
| Purchase date | |
| Legacy $/ct (ambiguous) | Don't use for new stones. A migration artifact that meant selling price on some old rows and cost on others. It's kept only as a last-resort fallback in the cost formula below. Use Acquisition cost instead. |
| Acquisition cost | What this exact stone cost — fill it in for every stone. As of 2026-09-06 there is no PO-level fallback any more: a parcel's Total PO cost is reference only, and a blank Acquisition cost leaves this stone with no cost basis (aside from the legacy $/ct fallback, on old rows only). |
| Notes | |
| Total cost basis Formula | Acquisition cost (or, as a last resort, the legacy $/ct figure) plus the ExtraCosts rows attached to this stone. This is what values the stone in inventory. Ring-making costs never appear here — they belong to the ring order. Cost allocation across a purchase order's stones (Allocated cost, Allocated extra costs) was removed 2026-09-06 — a shared parcel cost no longer reaches any stone automatically. |
| Sold for Formula | Pulled from the matching SaleLines row once one exists. No Margin field of its own as of 2026-09-06 (removed, along with SaleLines.Margin) — margin is no longer stored anywhere; compute it by hand as Line total minus Cost basis when you need it. |
| Last movement Formula | The date of the most recent thing that happened to this stone. Useful for spotting stock that has sat untouched, or a stone that went out and never came back. |
| Location Formula | In-house, In transit from vendor, In transit to jeweller, At jeweller, At lab, In transit to client, With client, Unknown. Physical custody — independent of Status; a stone can be In stock and At jeweller at once (Make Your Ring production), or Sold and In transit to client. Like Status, this is worked out from the stone's movements rather than typed: log where it went. |
StoneEvents — what happened to each stone, and when
ID format: sequential SE-000001. One row per thing that happened to a stone: it was ordered, it arrived, it was reserved, sold, sent to the jeweller, shipped to the client. This is where a stone's Status and Location come from — both are worked out from the newest movement, so recording a movement is how you change them.
Nothing here is ever edited or deleted. It is a history: if a movement was recorded wrongly, record the right one after it, or add a Note explaining. Rewriting the past is exactly what this table exists to prevent.
Most movements are recorded for you. Selling a stone on the Sales form logs "Sold"; putting a stone on a purchase order logs "Received"; adding a gemstone logs its opening movement. What you log by hand is the physical side — the "Log a movement" box on the gemstone form, which is where "Sent to jeweller", "Shipped to client" and the rest belong.
| Field | What goes in it |
|---|---|
| Gemstone Reference | The stone this happened to. |
| What happened Choice | Ownership: Identified (not owned), Ordered, Received, Reserved, Reservation released, Sold, Sale reversed, Returned by client, Lost or written off. Custody: Sent to jeweller, Received by jeweller, Returned from jeweller, Sent to lab, Returned from lab, Shipped to client, Delivered to client. Plus Note, for a dated remark that changes nothing. |
| When | The date it actually happened, not the date you are typing. Leave blank only if the date is genuinely unknown. This date is the historical record — it is what any "how long did this sit in stock" figure measures from — but it is not what decides the stone's current status; the most recently recorded movement does that. |
| Recorded at Automatic | When the row was written. Set for you, and it is what decides which movement is the current one — the newest thing recorded wins. |
| New status / New location Choice | Filled in automatically from what happened. A movement sets one, both, or neither — "Shipped to client" moves the location and leaves the status reading Sold, which is right: a sold stone in transit is both. |
| Purchase order / Sale / Ring order Reference | What caused the movement, when something did. "Ordered" needs its purchase order and "Sold" needs its sale; the rest are optional. |
| Jeweller / lab / vendor Reference | Who the stone went to, for a custody movement. |
| Reference label | A written copy of the purchase order or sale number, so the history stays readable even if that record is later deleted. Filled in for you. |
| Tracking | Courier reference for a shipment. Always fill this in when a stone leaves the premises. |
| Source Choice | Which form wrote the row, or "Backfill" for history reconstructed when this table was first created. It records where a row came from, not who typed it. |
| Notes |
One thing to watch: the most recently recorded movement is the one that counts, whatever date you give it. That is what you want when correcting a mistake — log what is true now and it takes effect. It also means entering history out of order has an effect: if you log last month's shipment after logging this month's, the stone ends up showing last month's. Catch up on history oldest-first, and finish with whatever is true today.
ExtraCosts — costs beyond the invoice price, per stone, per PO or per ring
ID format: sequential EC-000001, consistent with the other tables. Use Procedure 3's included-cost list — certification, inbound shipping, duties/customs, recutting, outbound shipping, insurance, payment processing — plus ring making. Never general overhead. Every row attaches to exactly one of a stone, a purchase order or a ring order. A stone or ring-order holder counts toward that stone's or ring's cost; a purchase-order holder (as of 2026-09-06) is reference only — it does not reach any stone.
| Field | Notes |
|---|---|
| Cost ID Key | |
| Stone Reference | Link when the cost is specific to one stone (e.g. its certification fee). |
| Purchase order Reference | Link when the cost is shared across a whole parcel (e.g. one shipment's freight) and you just want it recorded against the PO. As of 2026-09-06 this no longer reaches any stone's cost basis — cost allocation across a PO's stones was removed, so a row held here is reference only. If a shared cost should count toward a stone's value, split it by hand and enter each share on the relevant stone (its own ExtraCosts row, or folded into its Acquisition cost). |
| Ring order Reference | Link when the cost exists because a ring is being made — above all the jeweller's invoice. Not the stone: the stone's cost basis is what the stone cost you and is what values your inventory, and for a client-supplied stone there is no stone row to link to at all. |
| Check Formula | Stays blank when the row is right. Says MORE THAN ONE HOLDER if you've linked more than one of Stone/Purchase order/Ring order on the same row, and NO HOLDER — COUNTED NOWHERE if you've linked none. A Purchase order holder still passes this check, even though it no longer reaches any cost basis (see above) — it exists to catch a row with no holder at all, not to guarantee every holder does something. |
| Cost type Reference | Links to L_CostType. |
| Date | |
| Amount | |
| Vendor Reference | Who was actually paid (the lab, the freight forwarder) — not necessarily the stone's Vendor. |
| Notes |
Certificates — lab reports, one row per report
ID convention in use: the lab's own report number, e.g. AAP90739 — not a separate sequential ID. A stone that's recertified later gets a second row, not an overwrite.
| Field | Notes |
|---|---|
| Certificate ID Key | The lab report number, e.g. AAP90739. |
| Duplicate Formula | Stays blank while this Certificate ID is unique. Turns red with DUPLICATE CERTIFICATE ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Stone Reference | Links to Stones. |
| Laboratory | e.g. "GFCO Gem Lab", "AIG". |
| Report number / Report code / Report date / Report type | Copy exactly as printed on the certificate. |
| Species / Trade name / Weight / Color / Shape / Dimensions as reported | Copy exactly as printed — this is what "as reported" means; it's expected to differ slightly from your own measured fields on Stones, and that's fine. |
| Crown cut / Pavilion cut | As printed, when the report includes them. |
| Origin as reported | As printed — may differ from the Stones Origin field if that one is Vendor claim rather than lab-verified. |
| Cost of certification | Also record this as an ExtraCosts row linked to the same stone, so it's included in cost basis — this field alone doesn't feed the cost formula. |
| Notes |
Photos — one row per stone's photo set
ID format in use: PH-000001, PH-000002, … Create at intake per Procedure 1.
| Field | Notes |
|---|---|
| Photo set ID Key | Next sequential PH-0000##. |
| Stone Reference | Links to Stones. |
| Folder | Path to where the actual image files live. Use the SKU-prefixed Dropbox folder from Procedure 9, e.g. Pics/GC-000001 — this table indexes them, it doesn't store the originals except via the Images field below. (Older rows in the live data still use a certificate-number folder like Pics/AAP90739 from before this convention; don't copy that pattern for new stones.) |
| Image count | |
| Alt text | For the Shopify listing. |
| Images | Grist attachment field — drop files here if you want a copy inside the doc itself, in addition to the external folder. |
| Notes |
Listings — links a stone to its Shopify product
ID format in use: SHOP-000001, SHOP-000002, … Add a row when the product is published (Procedure 4).
| Field | Notes |
|---|---|
| Listing ID Key | Next sequential SHOP-0000##. |
| Stone Reference | Links to Stones. |
| Shopify status Choice | Active, Draft, Archived — keep this in sync with the actual Shopify product status; it's what the Needs attention check below relies on. |
| Title / Handle / Product type | Copy from the Shopify product. |
| Certificate ID | Free-text copy of the certificate number shown on the listing (not a live reference — just for cross-checking). |
| SEO title / SEO description | |
| Needs attention Formula | Flags "NO STONE LINKED", "ARCHIVE — stone is already sold", or "REVIEW — listed but not owned" when Shopify status and the linked stone's Status disagree. Check this after every sale — a stone marked Sold with a listing still Active is exactly the double-sell risk Procedure 8 exists to catch. |
Sales — one row per receipt/order
ID format in use: S-000001, S-000002, … (six digits, matching Stones' SKU width). What was actually printed on the client's receipt lives in Receipts, not here — this table holds what the figures should be.
| Field | Notes |
|---|---|
| Sale ID Key | Next sequential S-0000##. |
| Duplicate Formula | Stays blank while this Sale ID is unique. Turns red with DUPLICATE SALE ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Client Reference | Links to Clients. |
| Date of sale | |
| Payment method Reference | Links to L_PaymentMethod. |
| Commission | Dollar amount, if a dealer/referrer commission applied. |
| Commission basis | Free text describing which regime applied, e.g. "10%, $100 minimum", "waived", "(not stated)" — keep to a short consistent phrase rather than a new wording each time. |
| Shipping & insurance / Sales tax | |
| Notes | |
| Line subtotal / Amount paid Formula | Summed from linked SaleLines / Payments rows. |
| Total due / Balance due Formula | Line subtotal plus commission, shipping, tax, minus amount paid. |
| Payment status Formula | Paid in full, Partly paid, Unpaid, Overpaid, or Open (no balance computed yet). |
SaleLines — one row per thing sold within a sale
ID format in use: S-000001-L1, S-000002-L1, S-000002-L2, … — the parent Sale ID plus a line number. A line is either a gemstone or a ring, never both: fill in the stone or the ring order, not the two together.
| Field | Notes |
|---|---|
| Line ID Key | {Sale ID}-L{n}. |
| Duplicate Formula | Stays blank while this Line ID is unique. Turns red with DUPLICATE LINE ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Sale ID Reference | Links to Sales. |
| Line kind Choice | Gemstone / Ring. Set this first — it decides which of the next two fields to fill. Every existing line is a Gemstone line. |
| Stone Reference | Links to Stones. On a Gemstone line only. This is the link that marks the stone sold in the ledger — don't forget it. |
| Ring order Reference | Links to RingOrders. On a Ring line only, and it is what gives that line its cost. |
| Price per carat | The normal case: enter this, the line total computes from it and the stone's carat weight. |
| Flat price (overrides $/ct) | Only fill this in for a genuine lump-sum deal not expressed per carat (e.g. a negotiated flat price for a finished ring). When set, it wins over Price per carat entirely — leave it at 0/blank otherwise. |
| Description on receipt / Certification on receipt | Copy exactly as printed on the receipt given to the client. |
| Notes | |
| Carats / Line total / Cost basis Formula | Worked out for you and then kept. Since 2026-08-29 these are captured onto the line when you create it, not recalculated forever: if you later recut the stone and update its carat weight (which you should), this sale keeps the figures it was actually made at. Editing the line itself — its price per carat, flat price, or which stone it points at — still updates them. There is no Margin field any more (removed 2026-09-06) — if you need it, it's Line total minus Cost basis. |
| Check Formula | Stays blank when the row is right. Tells you if the line's kind and its links disagree — a Ring line with a stone on it, a Gemstone line with no stone, and so on. |
SettingModels — the ring settings you offer
A catalogue, not inventory. Nothing here is ever bought, stocked, counted or valued — a setting exists only once a client orders one. Add a row when you start offering a new design; there is nothing to do at intake, because there is no intake.
| Field | Notes |
|---|---|
| Setting code Key | The design's short code, taken from the middle of its Shopify SKU: RS-BZ-14KYG-54 → BZ. That way a setting SKU on an invoice can be matched to a design at a glance. |
| Setting name | How you and the jeweller refer to the design. |
| Metals offered | The metals this design can be made in, as plain text — e.g. 14k Yellow Gold, 18k White Gold, Platinum. Not a dropdown on purpose: Shopify's own Metal option is the authority, and a fixed list here would drift away from it. |
| List price | What you charge for the ring. Not a cost — the jeweller's charge is recorded per order, because it varies. |
| Typical jeweller charge | Your working estimate, for quoting. The real figure comes from his invoice. |
| Shopify product handle / Shopify product ID | The published product this design corresponds to. Filled in during the Shopify pass. |
| Offered today | Switch off to stop offering a design without deleting the ring orders that reference it. |
| Notes | |
| Rings ordered Formula | How many ring orders use this design. A count of work done, not a stock level — there is no stock. |
RingOrders — one row per ring being made
ID format: R-000001, R-000002, … Create the row when the order is placed, not when the ring is finished — this is what you track production against, and what the jeweller's invoice attaches to.
| Field | Notes |
|---|---|
| Ring order ID Key | Next sequential R-0000##. Nothing was numbered this way before, so R-000001 is genuinely the first. |
| Sale Reference | Links to Sales. |
| Stone source Choice | Gem Candies stone / Client-supplied. Set this first — it decides whether the next field should be filled. |
| Stone Reference | Links to Stones. Leave empty when the client supplied her own: her stone is not ours, is not inventory, and gets no Stones row. |
| Client's stone description | Only for a client-supplied stone. Plain text — what the jeweller is setting, and what the receipt should say. Not a valuation. |
| Setting Reference | Links to SettingModels. |
| Metal / Ring size | The configuration actually ordered. |
| Jeweller Reference | Links to Vendors — the jeweller is a vendor like any other supplier. |
| Status Choice | Ordered, Stone with jeweller, In production, Shipped to client, Delivered, Canceled. |
| Sent to jeweller on / Shipped to client on | Dates. Together with Status these are the answer to "where is it?" when a client asks. Leave the first blank when the client sent her own stone straight to the jeweller — nothing of ours travelled. |
| Tracking | Whichever leg you're responsible for. |
| Notes | |
| Client Formula | Read from the linked sale, so it can never disagree with it. |
| Ring cost Formula | Sum of the ExtraCosts rows linked to this ring order — normally just the jeweller's invoice. Stays blank until one is entered, so a ring he hasn't billed for yet doesn't look like pure profit. |
| Needs attention Formula | Stays blank when the row is right. Flags a missing sale, setting or stone source; a Gem Candies stone with no stone linked; a client-supplied ring that has one anyway; and a ring at the jeweller with no jeweller named. |
Payments — one row per payment received
ID format in use: P-000001, P-000002, … Most sales are a single payment for the full amount; only installments or deposits get more than one row per sale.
| Field | Notes |
|---|---|
| Payment ID Key | Next sequential P-0000##. |
| Duplicate Formula | Stays blank while this Payment ID is unique. Turns red with DUPLICATE PAYMENT ID if another row has the same one. Grist cannot refuse a duplicate, so it flags one instead — check it after any bulk entry, and never resolve it by editing whichever row you happen to be looking at. |
| Sale ID Reference | Links to Sales. |
| Client Formula | Read through the linked sale — not typed, so a payment can never name a different client than the sale it pays for. (Was a typed reference until 2026-08-28.) |
| Date | |
| Method Reference | Links to L_PaymentMethod. |
| Amount | |
| Notes |
Receipts — what the client was actually handed
One row per sale. Kept apart from Sales on purpose: the sale holds what the figures should be, the receipt holds what was printed, and comparing the two is what catches a mistake.
| Field | Notes |
|---|---|
| Sale Reference | Links to Sales. |
| Receipt no. | Your own receipt numbering, which may be shorter or separate from the Sale ID, e.g. "001". |
| Receipt total (as printed) | Type the number exactly as it appears on the paper or PDF you gave the client — even if you suspect it's wrong. This is what lets the Drift field below catch entry mistakes; "correct" it here and there's nothing left to catch. |
| Address on receipt | As printed on that specific receipt. May differ from the client's stored address if something was shipped elsewhere, and the sales dashboard reads it in preference to the stored one for state-level reporting. |
| Source file | Filename of the receipt document, per Procedure 9. |
| Notes | |
| Client Formula | Read through the linked sale — not typed, so a receipt can never name a different client than its sale. |
| Drift vs computed sale total Formula | The sale's total due minus the printed total. Non-zero means a line item, a fee, or the printed receipt itself has a typo — investigate before moving on. |
Invoices — ring invoices raised through the reveal site
Written by the private reveal site when an invoice is approved, so it appears in the ledger alongside everything else — not filled in by hand, and not used for an ordinary Shopify sale.
| Field | Notes |
|---|---|
| Invoice number Key | As issued by the reveal site. |
| Sale Reference | Links to Sales. |
| Client email / Setting / Setting SKU | Copied from the invoice. |
| Total / Florida tax | Written by the reveal site, not by hand. One dollar figure each since 2026-08-29 — the duplicate cents columns were removed, so there is no second copy of either amount to fall out of step. The tax arithmetic happens in the reveal site, not here. |
| Status Choice | Draft, Approved, Sent, Paid, In production, Shipped, Completed, Canceled — the reveal site's own lifecycle. |
| Issued at | |
| Mock? | A test invoice. Ticked rows are not real business and must stay out of any total. |
| Client Formula | Read through the linked sale — not typed. |
IngestionItems — Dropbox ingestion audit and review
One row per source or derived logical document. This is the replay/audit trail: it records what exact Dropbox revision was evaluated, where the file came from and went, what business row was affected (or matched as a duplicate), and what still needs human review. It never stores raw documents or secrets. As of 2026-09-07 the repository migration is ready but intentionally not yet applied to the live document; inspection is the default and writing requires the explicit --apply mode.
| Field | Notes |
|---|---|
| Ingestion ID Key | Stable identifier for this ingestion item. |
| Source file ID / Source revision / Source hash | The exact Dropbox file identity, revision, and content hash inspected. A changed revision must be processed as changed input, never silently moved under the old result. |
| Original path / Original filename | Where the source was found before processing. |
| Canonical path / Canonical filename | The reviewed destination and name proposed or applied by the importer. |
| Parent source file ID / Bundle ID | Provenance for documents split from one source or merged because they describe the same logical record. |
| Nature Choice | Vendor document, Purchase invoice, Purchase order, Stone certificate, Client document, Sales invoice, Sales receipt, Payment proof, Shipping document, or Other. |
| Counterpart / Details | The vendor, client, laboratory, carrier, or other party and the stable document detail used for review and naming. |
| Extracted data / Evidence | Redacted, size-bounded JSON text only — never raw document contents or secrets. |
| Target table / Target row ID | The business row created or safely enriched. |
| Duplicate-of table / Duplicate-of row ID | The existing business row used when the document is a clear duplicate and no new business row is created. |
| Review status Choice | Unconfirmed, Dubious, Confirmed. Only human review sets Confirmed. |
| Processing status Choice | Pending, Applied, Duplicate, Failed, Archived. Kept separate from Review status. |
| Confidence | A number from 0 through 1. It helps review but never authorizes a write by itself; all deterministic safety conditions still have to pass. |
| Notes / Created at / Updated at | Operator notes and New York timestamps for the audit trail. |
Exceptions — the data-quality log
Not part of the normal entry workflow above — this is where you (or a future reconciliation pass, Procedure 8) log a problem spotted in the ledger that needs a decision rather than a routine edit. Currently holds mostly migration-era findings (e.g. listings left Active after their stone sold).
| Field | Notes |
|---|---|
| # | Sequential number. |
| Severity Choice | Urgent, Action, Review, Info. |
| Area Choice | Stone, Sale, Lot, Listing, Certificate, Vendor, Payment. |
| Key | The ID of the affected row, e.g. a SKU or certificate number. |
| Issue | Plain description of what's wrong. |
| Suggested action | What to do about it. |
| Resolved? | Check off once fixed. Don't delete resolved rows — they're your audit trail that the issue was actually addressed. |
Lookup tables — L_GemType, L_Shape, L_ColorNuance, L_Clarity, L_Treatment, L_Country, L_PaymentMethod, L_CostType
These are what every Reference-tagged field above actually points to. Each has just a Value and a Notes column. If a new stone genuinely needs a gem type, shape, color, origin, etc. that isn't in the list yet, add one row to the relevant L_ table first, then select it from the Stones (or Sales/ExtraCosts) row — don't type a free-text near-duplicate into the reference field, since that breaks grouping and filtering everywhere else the field is used. Keep the wording consistent with existing entries (e.g. "Unknown / not stated" vs. "Unknown" — check what's already there before adding a variant). L_CostType now includes Ring making, for jeweller invoices.