loopable / web /public /sample_customers.json
fsanyoto's picture
Deploy AIOS web (React glide grid + FastAPI slice)
e1b3e71 verified
Raw
History Blame Contribute Delete
17.3 kB
{
"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
}
]
}