| { | |
| "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 | |
| } | |
| ] | |
| } | |