Reference Companion to Procedures 1–3, 5, 6, 8, 9 · structure explained in How the data file is put together

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.
Current state — Shopify is on standby (not live to customers yet), so Grist is the source of truth for a stone's status — not Shopify inventory — until the storefront launches. The "Shopify is authoritative" notes below describe the steady-state process for once it is.
Note — this file was seeded from a spreadsheet migration and still carries some historical gaps (a few purchase orders with no invoice total, one legacy per-carat field that means different things on different rows, dozens of Shopify listings left Active after their stone sold). Those are tracked in the Exceptions table, not something you need to fix retroactively. This guide is about entering things correctly going forward.
Field kinds: Choice pick from a fixed dropdown list Reference links to a row in another table Formula computed automatically — never type into it Key field gets referenced by other tables — keep it stable

Before you start

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

  1. Vendor — check Vendors for the supplier; add a row only if they're new.
  2. Purchase order — add one PurchaseOrders row per invoice, even for a single stone. Set Total PO cost to the full invoice amount as soon as you have it.
  3. Stone — one Stones row 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.
  4. Certificate — if the stone is certified, one Certificates row per lab report.
  5. Photos — one Photos row per stone, per Procedure 9's SKU-prefixed folder convention.
  6. Extra costs — certification fees, duties, inbound shipping: one ExtraCosts row each, linked to the stone or the PO. These feed into the stone's total cost basis automatically.
  7. Listing — once the Shopify product is published (Procedure 4), add a Listings row linking the two.

A sale happens

  1. Client — check Clients; add a row only if they're new.
  2. Sale — one Sales row per receipt/order, with commission, shipping, and tax as separate figures.
  3. Sale line(s) — one SaleLines row 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 with Stones.Status — is the authoritative "is it sold" flag; once Shopify is live, Shopify inventory takes over that role (Procedure 5/6).
  4. Payment(s) — one Payments row per payment received. Most sales are one payment for the full amount; installments get one row each.

A ring is ordered

  1. 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.
  2. Ring order — one RingOrders row, linked to the sale, the setting design and the jeweller. Set Stone source first: it decides whether a stone gets linked at all.
  3. 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.
  4. Jeweller's invoice — one ExtraCosts row 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.
  5. 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.

FieldNotes
Vendor ID KeyNext sequential V-0000##.
Duplicate FormulaStays 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 nameHow you refer to them day to day.
Channel ChoiceDirect / dealer, Instagram, Telegram, Auction site, Website, Client-sourced, Unknown.
Handle / contactPhone, email, @handle — whatever you'd use to reach them.
Country ReferenceLinks 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 nameThe 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.
Email 
Phone number 
Address / Apartment, suite, etc. / City / State / province / Postal codeThe 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 ChoicePrepaid, 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 ChoiceUSD, EUR, GBP, THB, Other. The currency this vendor invoices in.
Legacy source stringsMigration artifact — the various spellings this vendor appeared under in old records. Leave as-is; don't add to it for new vendors.
NotesAnything 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.

FieldNotes
Client ID KeyNext sequential C-0000##.
Duplicate FormulaStays 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 / PhoneFill in as you collect them — not required to create the row.
Billing / shipping addressFull 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 namesMigration 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.

FieldNotes
PO ID KeyNext sequential PO-0000##.
Duplicate FormulaStays 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 nameShort human label, e.g. "Niamat PO #1".
Vendor ReferenceLinks to Vendors.
Purchase datePick from the calendar widget — enter it as a normal date, Grist stores the rest.
DescriptionWhat was on the invoice, e.g. "Parcel of 20 — pinks/rubellite".
Total PO costThe 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 ChoiceUSD, 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 ChoicePrepaid, Net 15, Net 30, Net 60, Other.
Invoice # BuiltThe 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.
NotesDiscrepancies between what was described and what arrived, anything the next person needs to know.
Stones on PO / Carats on PO / Implied cost per carat FormulaComputed 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.

FieldNotes
SKU KeyNext sequential GC-0000##. Permanent once issued — never reassigned, per Procedure 1.
Duplicate FormulaStays 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 ReferenceLinks to L_GemType (Sapphire, Tourmaline, Spinel, …).
Variety / trade nameFree text, e.g. "Rubellite", "Padparadscha".
Shape ReferenceLinks to L_Shape.
Color nuance ReferenceLinks to L_ColorNuance.
Clarity ReferenceLinks to L_Clarity.
Origin ReferenceLinks to L_Country.
Treatment ReferenceLinks 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 countAlmost always 1. Only >1 for a genuinely inseparable matched set sold as one SKU.
Set groupFree text tag linking pieces sold only as a set. Leave blank otherwise.
Status FormulaCandidate (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 ChoiceLab 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 ReferenceLinks 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 costWhat 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 FormulaAcquisition 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 FormulaPulled 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 FormulaThe 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 FormulaIn-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.

FieldWhat goes in it
Gemstone ReferenceThe stone this happened to.
What happened ChoiceOwnership: 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.
WhenThe 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 AutomaticWhen 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 ChoiceFilled 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 ReferenceWhat caused the movement, when something did. "Ordered" needs its purchase order and "Sold" needs its sale; the rest are optional.
Jeweller / lab / vendor ReferenceWho the stone went to, for a custody movement.
Reference labelA 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.
TrackingCourier reference for a shipment. Always fill this in when a stone leaves the premises.
Source ChoiceWhich 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.

FieldNotes
Cost ID Key 
Stone ReferenceLink when the cost is specific to one stone (e.g. its certification fee).
Purchase order ReferenceLink 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 ReferenceLink 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 FormulaStays 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 ReferenceLinks to L_CostType.
Date 
Amount 
Vendor ReferenceWho 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.

FieldNotes
Certificate ID KeyThe lab report number, e.g. AAP90739.
Duplicate FormulaStays 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 ReferenceLinks to Stones.
Laboratorye.g. "GFCO Gem Lab", "AIG".
Report number / Report code / Report date / Report typeCopy exactly as printed on the certificate.
Species / Trade name / Weight / Color / Shape / Dimensions as reportedCopy 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 cutAs printed, when the report includes them.
Origin as reportedAs printed — may differ from the Stones Origin field if that one is Vendor claim rather than lab-verified.
Cost of certificationAlso 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.

FieldNotes
Photo set ID KeyNext sequential PH-0000##.
Stone ReferenceLinks to Stones.
FolderPath 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 textFor the Shopify listing.
ImagesGrist 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).

FieldNotes
Listing ID KeyNext sequential SHOP-0000##.
Stone ReferenceLinks to Stones.
Shopify status ChoiceActive, 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 typeCopy from the Shopify product.
Certificate IDFree-text copy of the certificate number shown on the listing (not a live reference — just for cross-checking).
SEO title / SEO description 
Needs attention FormulaFlags "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.

FieldNotes
Sale ID KeyNext sequential S-0000##.
Duplicate FormulaStays 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 ReferenceLinks to Clients.
Date of sale 
Payment method ReferenceLinks to L_PaymentMethod.
CommissionDollar amount, if a dealer/referrer commission applied.
Commission basisFree 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 FormulaSummed from linked SaleLines / Payments rows.
Total due / Balance due FormulaLine subtotal plus commission, shipping, tax, minus amount paid.
Payment status FormulaPaid 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.

FieldNotes
Line ID Key{Sale ID}-L{n}.
Duplicate FormulaStays 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 ReferenceLinks to Sales.
Line kind ChoiceGemstone / Ring. Set this first — it decides which of the next two fields to fill. Every existing line is a Gemstone line.
Stone ReferenceLinks 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 ReferenceLinks to RingOrders. On a Ring line only, and it is what gives that line its cost.
Price per caratThe 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 receiptCopy exactly as printed on the receipt given to the client.
Notes 
Carats / Line total / Cost basis FormulaWorked 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 FormulaStays 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.

FieldNotes
Setting code KeyThe design's short code, taken from the middle of its Shopify SKU: RS-BZ-14KYG-54BZ. That way a setting SKU on an invoice can be matched to a design at a glance.
Setting nameHow you and the jeweller refer to the design.
Metals offeredThe 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 priceWhat you charge for the ring. Not a cost — the jeweller's charge is recorded per order, because it varies.
Typical jeweller chargeYour working estimate, for quoting. The real figure comes from his invoice.
Shopify product handle / Shopify product IDThe published product this design corresponds to. Filled in during the Shopify pass.
Offered todaySwitch off to stop offering a design without deleting the ring orders that reference it.
Notes 
Rings ordered FormulaHow 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.

FieldNotes
Ring order ID KeyNext sequential R-0000##. Nothing was numbered this way before, so R-000001 is genuinely the first.
Sale ReferenceLinks to Sales.
Stone source ChoiceGem Candies stone / Client-supplied. Set this first — it decides whether the next field should be filled.
Stone ReferenceLinks 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 descriptionOnly for a client-supplied stone. Plain text — what the jeweller is setting, and what the receipt should say. Not a valuation.
Setting ReferenceLinks to SettingModels.
Metal / Ring sizeThe configuration actually ordered.
Jeweller ReferenceLinks to Vendors — the jeweller is a vendor like any other supplier.
Status ChoiceOrdered, Stone with jeweller, In production, Shipped to client, Delivered, Canceled.
Sent to jeweller on / Shipped to client onDates. 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.
TrackingWhichever leg you're responsible for.
Notes 
Client FormulaRead from the linked sale, so it can never disagree with it.
Ring cost FormulaSum 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 FormulaStays 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.
Note — a ring sale has two sale lines: one for the gemstone and one for the ring. Only the ring line links to this ring order; the gemstone line links to the stone, as any gemstone line does. A ring made from the client's own stone has just the ring line. An empty stone link on the ring order is only correct when Stone source says so.

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.

FieldNotes
Payment ID KeyNext sequential P-0000##.
Duplicate FormulaStays 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 ReferenceLinks to Sales.
Client FormulaRead 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 ReferenceLinks 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.

FieldNotes
Sale ReferenceLinks 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 receiptAs 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 fileFilename of the receipt document, per Procedure 9.
Notes 
Client FormulaRead through the linked sale — not typed, so a receipt can never name a different client than its sale.
Drift vs computed sale total FormulaThe 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.

FieldNotes
Invoice number KeyAs issued by the reveal site.
Sale ReferenceLinks to Sales.
Client email / Setting / Setting SKUCopied from the invoice.
Total / Florida taxWritten 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 ChoiceDraft, 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 FormulaRead 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.

FieldNotes
Ingestion ID KeyStable identifier for this ingestion item.
Source file ID / Source revision / Source hashThe 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 filenameWhere the source was found before processing.
Canonical path / Canonical filenameThe reviewed destination and name proposed or applied by the importer.
Parent source file ID / Bundle IDProvenance for documents split from one source or merged because they describe the same logical record.
Nature ChoiceVendor document, Purchase invoice, Purchase order, Stone certificate, Client document, Sales invoice, Sales receipt, Payment proof, Shipping document, or Other.
Counterpart / DetailsThe vendor, client, laboratory, carrier, or other party and the stable document detail used for review and naming.
Extracted data / EvidenceRedacted, size-bounded JSON text only — never raw document contents or secrets.
Target table / Target row IDThe business row created or safely enriched.
Duplicate-of table / Duplicate-of row IDThe existing business row used when the document is a clear duplicate and no new business row is created.
Review status ChoiceUnconfirmed, Dubious, Confirmed. Only human review sets Confirmed.
Processing status ChoicePending, Applied, Duplicate, Failed, Archived. Kept separate from Review status.
ConfidenceA 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 atOperator 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).

FieldNotes
#Sequential number.
Severity ChoiceUrgent, Action, Review, Info.
Area ChoiceStone, Sale, Lot, Listing, Certificate, Vendor, Payment.
KeyThe ID of the affected row, e.g. a SKU or certificate number.
IssuePlain description of what's wrong.
Suggested actionWhat 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.