{ "fields": [ { "key": "customer", "label": "Customer", "type": "text", "source": "odoo", "pinned": true, "default": true, "description": "The customer's name in Odoo. One row per customer who ordered in the last 24 months." }, { "key": "odoo_status", "label": "Odoo record", "type": "status", "source": "odoo", "default": false, "description": "Whether this customer still exists in Odoo. Archived means deleted there." }, { "key": "agent", "label": "Agent", "type": "text", "source": "odoo", "default": true, "description": "The sales agent who owns this account." }, { "key": "dba", "label": "DBA", "type": "select", "source": "odoo", "default": false, "options": [ "Fisch", "Royal", "Both" ], "description": "The brand this customer buys from - Fisch, Royal, or both. Amazon-channel orders are not a DBA." }, { "key": "salesperson", "label": "Salesperson", "type": "text", "source": "odoo", "default": false, "description": "Who keyed in most of this customer's orders — not the Agent, who owns the account." }, { "key": "street", "label": "Street", "type": "text", "source": "odoo", "default": false, "description": "First address line, from res.partner directly - not the geocoder, so a customer the map cannot place still shows its address." }, { "key": "street2", "label": "Street 2", "type": "text", "source": "odoo", "default": false, "description": "Second address line (suite, unit, floor) on the customer's Odoo address." }, { "key": "city", "label": "City", "type": "text", "source": "odoo", "default": true, "description": "City on the customer's Odoo address." }, { "key": "state", "label": "State", "type": "text", "source": "odoo", "default": true, "description": "State or province on the customer's Odoo address." }, { "key": "country", "label": "Country", "type": "text", "source": "odoo", "default": false, "description": "Country on the customer's Odoo address." }, { "key": "zip", "label": "ZIP", "type": "text", "source": "odoo", "default": false, "description": "Postal code on the customer's Odoo address." }, { "key": "customer_since", "label": "Customer since", "type": "date", "source": "odoo", "default": false, "description": "When this customer was first set up in Odoo." }, { "key": "tags", "label": "Tags", "type": "text", "source": "odoo", "default": false, "description": "Odoo labels on this customer, comma-separated." }, { "key": "pricelist", "label": "Price list", "type": "text", "source": "odoo", "default": false, "description": "The price list this customer buys on." }, { "key": "payment_terms", "label": "Payment terms", "type": "text", "source": "odoo", "default": false, "description": "Payment terms on this customer's account — Net 30, for example." }, { "key": "last_order", "label": "Last order", "type": "date", "source": "odoo", "default": true, "description": "Date of the most recent confirmed order." }, { "key": "overdue_days", "label": "Overdue days", "type": "int", "source": "odoo", "default": true, "description": "How many days late this customer is running against their own usual ordering rhythm." }, { "_note": "filterable:false — DERIVED ANALYTIC: est_missed is min(cycles missed, 3) x AOV, a score we compute rather than an object the business has, so a condition on it would read as a fact about the customer when it is a fact about our arithmetic. It still displays and still sorts. Until wave 6 this flag also covered the frozen-window presets (revenue_ytd / revenue_ly / orders_24m / aov / yoy_pct); those are now DELETED outright under the owner's no-buildable-presets rule — see _comment. est_missed itself STAYS: no creatable measure or formula reproduces the cadence model behind it.", "key": "est_missed", "label": "Est. missed $", "type": "currency", "source": "odoo", "default": true, "agg": "sum", "filterable": false, "description": "Estimated sales missed while quiet: missed orders (capped at 3) times average order value. An estimate, not money owed." }, { "_note": "wave 21 R1 — KEY UNCHANGED, LABEL RENAMED. The computation is a DISJOINT split (ar.py credit_exposure): this column is only the not-yet-due residual, its sibling is the past-grace residual, and the two sum to the total. Under the label 'AR open $' the majority-late book read as 'Overdue > Open', which is nonsense in AR vocabulary — 'open' universally means the total. The label now says what the number is; the key stays so saved views and filters keep working.", "key": "ar_open", "label": "AR current $", "type": "currency", "source": "odoo", "default": false, "description": "Invoiced money owed but not yet due (a 5-day grace applies before it counts as overdue)." }, { "key": "ar_overdue", "label": "AR overdue $", "type": "currency", "source": "odoo", "default": false, "description": "Invoiced money past due — same basis as the Collections page." }, { "_note": "wave 21 R1 — the TOTAL, added beside the rename above. AR current $ + AR overdue $, i.e. what most people mean by 'open AR'. Composed from the same ar.credit_exposure rows the siblings use, so it is transitively reconciled by ar.validate()'s residual read_group tie — no second oracle.", "key": "ar_outstanding", "label": "AR outstanding $", "type": "currency", "source": "odoo", "default": false, "description": "Total invoiced money owed right now: AR current $ plus AR overdue $." }, { "key": "ar_exposure", "label": "Credit exposure $", "type": "currency", "source": "odoo", "default": false, "description": "The most you could be out if they stopped paying today: open, overdue, draft and not-yet-invoiced." }, { "key": "ar_aged_1_30", "label": "1-30 days $", "type": "currency", "source": "odoo", "default": false, "description": "Overdue between 1 and 30 days. The four aging buckets sum to AR overdue $." }, { "key": "ar_aged_31_60", "label": "31-60 days $", "type": "currency", "source": "odoo", "default": false, "description": "Overdue between 31 and 60 days. The four aging buckets sum to AR overdue $." }, { "key": "ar_aged_61_90", "label": "61-90 days $", "type": "currency", "source": "odoo", "default": false, "description": "Overdue between 61 and 90 days. The four aging buckets sum to AR overdue $." }, { "key": "ar_aged_90_plus", "label": "90+ days $", "type": "currency", "source": "odoo", "default": false, "description": "Overdue by more than 90 days. The four aging buckets sum to AR overdue $." }, { "key": "days_to_pay", "label": "Days to pay", "type": "int", "source": "odoo", "default": false, "description": "Average days to pay an invoice in full. Blank means no fully paid invoice yet." }, { "key": "top_category", "label": "Top category", "type": "text", "source": "odoo", "default": false, "description": "The category this customer spent the most on in the last 12 months." }, { "key": "top_category_pct", "label": "Top category %", "type": "pct", "source": "odoo", "default": false, "description": "Share of last-12-months spend that went to the top category." }, { "key": "sku_count", "label": "SKUs bought", "type": "int", "source": "odoo", "default": false, "description": "Distinct products bought in the last 12 months." }, { "key": "top_sku", "label": "Top SKU", "type": "text", "source": "odoo", "default": false, "description": "The product this customer spent the most on in the last 12 months." }, { "key": "days_since", "label": "Days since order", "type": "int", "source": "odoo", "default": false, "description": "Days since the last confirmed order." }, { "key": "typical_gap_days", "label": "Typical gap days", "type": "int", "source": "odoo", "default": false, "description": "Days this customer usually goes between orders, from their own history." }, { "key": "notes", "label": "Notes", "type": "text", "source": "overlay", "default": false, "description": "Your notes on this customer. Saved in this app only, visible only to you." } ], "rows": [ { "pid": 101, "customer": "Poppy Flowers", "status": "New", "agent": "Naomi Linnell Rivera", "city": "Charlottesville", "state": "Virginia (US)", "last_order": "2026-07-21", "est_missed": 0, "notes": "", "country": "United States", "zip": "02720", "payment_terms": "30 Days", "pricelist": "Fisch 1 (USD)", "tags": "Royal", "customer_since": "2023-01-10", "salesperson": "Jessica", "ar_open": 0, "ar_overdue": 0, "ar_exposure": 0, "top_category": "Styrofoam", "top_category_pct": 0.47, "sku_count": 93, "top_sku": "AQUAFOAM FLORAL FOAM BRICK | 48-Piece per Pack", "days_to_pay": 34, "_created": "2023-01-15 09:10:00", "lat": 25.7617, "lon": -80.1918, "odoo_status": "Archived", "dba": "Royal", "ar_outstanding": 0 }, { "pid": 102, "customer": "Meadow & Vine Wholesale", "status": "Growing", "agent": "Carla Jimenez", "city": "Portland", "state": "Oregon (US)", "last_order": "2026-07-19", "est_missed": 0, "notes": "Expanding to a second storefront.", "country": "United States", "zip": "77041", "payment_terms": "Immediate Payment", "pricelist": "Royal 1 (USD)", "tags": "Royal, Key account", "customer_since": "2024-02-11", "salesperson": "Naomi", "ar_open": 1240.5, "ar_overdue": 0, "ar_exposure": 1740.5, "top_category": "Ribbon", "top_category_pct": 0.95, "sku_count": 4, "top_sku": "2\" X 24\" X 36\" GREEN STYROFOAM BOARD", "days_to_pay": null, "_created": "2023-02-15 09:11:00", "lat": 27.9506, "lon": -82.4572, "odoo_status": "Active", "dba": "Fisch", "ar_outstanding": 1240.5 }, { "pid": 103, "customer": "Bluestem Floral Supply", "status": "Growing", "agent": "Naomi Linnell Rivera", "city": "Kansas City", "state": "Missouri (US)", "last_order": "2026-07-17", "est_missed": 0, "notes": "", "country": "United States", "zip": "11219", "payment_terms": "60 Days", "pricelist": "Royal 1 (USD)", "tags": "Fisch", "customer_since": "2025-03-12", "salesperson": "Karen", "ar_open": 0, "ar_overdue": 5120.25, "ar_exposure": 5120.25, "top_category": "Foams & Finishes", "top_category_pct": 0.31, "sku_count": 27, "top_sku": "SATIN RIBBON 2IN", "days_to_pay": 61, "_created": "2023-03-15 09:12:00", "lat": 28.5384, "lon": -81.3789, "odoo_status": "Active", "dba": "Both", "ar_outstanding": 5120.25 }, { "pid": 104, "customer": "Camellia Row Florist", "status": "Declining", "agent": "Devon Marsh", "city": "Savannah", "state": "Georgia (US)", "last_order": "2026-05-30", "est_missed": 41200, "notes": "Switched some volume to a local grower.", "country": "United States", "zip": "07649", "payment_terms": "30 Days", "pricelist": "Fisch 1 (USD)", "tags": "(none)", "customer_since": "2026-04-13", "salesperson": "(none)", "ar_open": 8300, "ar_overdue": 940, "ar_exposure": 11440, "top_category": "All", "top_category_pct": 1.0, "sku_count": 1, "top_sku": "(none)", "days_to_pay": 12, "_created": "2023-04-15 09:13:00", "lat": 30.3322, "lon": -81.6557, "odoo_status": "Active", "dba": "Royal", "ar_outstanding": 9240 }, { "pid": 105, "customer": "Harborlight Wholesale Blooms", "status": "Growing", "agent": "Carla Jimenez", "city": "Seattle", "state": "Washington (US)", "last_order": "2026-07-22", "est_missed": 0, "notes": "Top-10 account.", "country": "United States", "zip": "33125", "payment_terms": "Immediate Payment", "pricelist": "Royal 1 (USD)", "tags": "Royal", "customer_since": "2023-05-14", "salesperson": "Jessica", "ar_open": 0, "ar_overdue": 0, "ar_exposure": 0, "top_category": "Styrofoam", "top_category_pct": 0.47, "sku_count": 93, "top_sku": "AQUAFOAM FLORAL FOAM BRICK | 48-Piece per Pack", "days_to_pay": 34, "_created": "2023-05-15 09:14:00", "lat": 26.1224, "lon": -80.1373, "odoo_status": "Active", "dba": "", "ar_outstanding": 0 }, { "pid": 106, "customer": "Dogwood & Fern Co.", "status": "Dormant", "agent": "Devon Marsh", "city": "Asheville", "state": "North Carolina (US)", "last_order": "2026-02-11", "est_missed": 52400, "notes": "No spring order this year.", "country": "United States", "zip": "90210", "payment_terms": "60 Days", "pricelist": "Royal 1 (USD)", "tags": "Royal, Key account", "customer_since": "2024-06-15", "salesperson": "Naomi", "ar_open": 1240.5, "ar_overdue": 0, "ar_exposure": 1740.5, "top_category": "Ribbon", "top_category_pct": 0.95, "sku_count": 4, "top_sku": "2\" X 24\" X 36\" GREEN STYROFOAM BOARD", "days_to_pay": null, "_created": "2023-06-15 09:15:00", "lat": 27.3364, "lon": -82.5307, "odoo_status": "Active", "dba": "Fisch", "ar_outstanding": 1240.5 }, { "pid": 107, "customer": "Verbena Market Florals", "status": "Lost", "agent": "Naomi Linnell Rivera", "city": "Austin", "state": "Texas (US)", "last_order": "2025-11-04", "est_missed": 78300, "notes": "Went with a competitor on freight terms.", "country": "United States", "zip": "08701", "payment_terms": "30 Days", "pricelist": "Fisch 1 (USD)", "tags": "Fisch", "customer_since": "2025-07-16", "salesperson": "Karen", "ar_open": 0, "ar_overdue": 5120.25, "ar_exposure": 5120.25, "top_category": "Foams & Finishes", "top_category_pct": 0.31, "sku_count": 27, "top_sku": "SATIN RIBBON 2IN", "days_to_pay": 61, "_created": "2023-07-15 09:16:00", "lat": null, "lon": null, "odoo_status": "Active", "dba": "Both", "ar_outstanding": 5120.25 }, { "pid": 108, "customer": "Larkspur Lane Supply", "status": "New", "agent": "Carla Jimenez", "city": "Denver", "state": "Colorado (US)", "last_order": "2026-07-14", "est_missed": 0, "notes": "First order in April.", "country": "United States", "zip": "60614", "payment_terms": "Immediate Payment", "pricelist": "Royal 1 (USD)", "tags": "(none)", "customer_since": "2026-08-17", "salesperson": "(none)", "ar_open": 8300, "ar_overdue": 940, "ar_exposure": 11440, "top_category": "All", "top_category_pct": 1.0, "sku_count": 1, "top_sku": "(none)", "days_to_pay": 12, "_created": "2023-08-15 09:17:00", "lat": 33.749, "lon": -84.388, "odoo_status": "Active", "dba": "Royal", "ar_outstanding": 9240 } ] }