/work/quotes), so managers are not misled by generic "Charge" or Charge N rows at $0.00 when triaging aging quotes.Product feedback: Pending quotes / Open Quotes show correct services (e.g. "Home/Condo Inspection" at $425.91), while some custom quote worklists show "Charge" or "Charge 1" at $0.00 in the expanded row—and sometimes after opening the quote from that worklist. Reports mention quotes that sat pending for a few days; behavior has also been described as "fixing itself," which likely reflects different list entry points or worklist configs, not data self-healing.
Open Quotes loads via GET /quote with addQuotePopulationStages() in attik-backend/src/util/functions/quote/addQuotePopulationStages.ts, which fully populates charges (including nested services, bundles, discount codes).
Custom quote worklists load via GET /worklist/:id/data in attik-backend/src/routes/worklist.ts. Conditions are split in separateConditions() / requiresPopulation(): only attributes like service-ids, required-info-*, and event-inspection fields are treated as post-population. Typical close-out filters (status, age, address, created-by, etc.) stay pre-population only.
For quote worklists without post-population conditions, buildWorklistPopulationStages() uses getInspectionPopulationPipeline({ includeCharges: false }) (~lines 1016–1027), so charges are returned as unpopulated refs (ObjectIds), not full charge documents.
Worklists with post-population but without service-ids may populate charges via getInspectionPopulationPipeline({ includeCharges: true }), which is still a different shape than addQuotePopulationStages() used by Open Quotes.
Worklists with service-ids use a lightweight charge lookup for filtering, then a follow-up lookup—a third path.
Two custom quote worklists can disagree at the same time for the same quote: one whose conditions trigger post-pop (e.g. includes service-ids or required-info-*) may show real service names; one with only pre-pop filters (common for close-out lists) will not.
On the frontend, SingleQuoteDropdown uses fallbacks when charge.name / charge.amount are missing (Charge N labels and $0.00), so missing population surfaces as generic labels and zero dollars—not as an empty state.
SE region is attempting to isolate quotes that are abandoned status by using the following configuration. The only worklists that have this issue are both using this same group of conditions
Repro / examples (screenshots)
Custom worklist showing incorrect charge data:
Open Quotes list showing correct service and amount:
FHI Example 1
FHI example 2
RIA
GET /worklist/:id/data — attik-backend/src/routes/worklist.ts: requiresPopulation(), buildWorklistFilterStages(), buildWorklistPopulationStages(), and the aggregate pipeline that applies population after sort/limit.includeCharges: false when hasPostPopConditions is false; alternate branches when post-pop or service-ids are present use getInspectionPopulationPipeline() from attik-backend/src/util/functions/aggregation/inspectionPopulation.ts instead of addQuotePopulationStages().attik-backend/src/util/functions/quote/addQuotePopulationStages.ts (used by attik-backend/src/routes/quote.ts for list/detail).charges with name and amount (and nested service data if the UI depends on it), regardless of which condition branch was used for filtering.service-ids post-pop $match should remain separate from the final response shape returned to the client.charges[0].name).attik-frontend/src/components/task-check/WorklistResolver.tsx → SingleQuoteBar.tsx → SingleQuoteDropdown.tsx (expanded charges section with fallbacks).attik-frontend/src/components/task-check/QuoteList.tsx → same SingleQuoteBar / SingleQuoteDropdown, fed by GET quote with full population.primaryCharge?._serviceId?._segmentId in QuoteList.tsx; worklists with unpopulated charges may also affect segment-related display where that pattern is reused.Charge N, $0.00) when data is missing, or surface an explicit empty/error state after backend is fixed.attik-backend/src/routes/worklist.tsattik-backend/src/util/functions/quote/addQuotePopulationStages.tsattik-backend/src/util/functions/aggregation/inspectionPopulation.tsattik-backend/src/routes/quote.tsattik-frontend/src/components/task-check/SingleQuoteDropdown.tsxattik-frontend/src/components/task-check/WorklistResolver.tsxPlease authenticate to join the conversation.
Next Up
Main App
23 days ago
Linear
Get notified by email when there are changes.
Next Up
Main App
23 days ago
Linear
Get notified by email when there are changes.