CONNECT:
jonmaas1978 AT gmail DOT com +1-310-500-5841
Asset Protection and Shrink Management

Here are two tables. The first shows the concepts behind Asset Protection and Shrink Management, the second shows this by Excel formulas, and DAX and OracleSQL Queries.

CategorySubcategoryConceptDescriptionShortcode EquationUse CaseKeywords
Shrink MeasurementCore MetricsShrink RatePercentage of inventory lost compared to sales or inventory valueShrink$ / Sales$ * 100Calculate overall store shrink performance; benchmark against industry standardsshrink percentage, loss rate, inventory variance
Shrink MeasurementCore MetricsShrink DollarsAbsolute dollar value of inventory lossBook Inventory – Physical InventoryQuantify financial impact of shrink; budget for loss prevention investmentsinventory loss, dollar shrink, financial impact
Shrink MeasurementCore MetricsUnknown ShrinkShrink that cannot be attributed to a specific cause after investigationTotal Shrink – (Known Theft + Admin Errors + Vendor + Damage)Identify gaps in tracking systems; prioritize investigation areasunaccounted loss, mystery shrink, unexplained variance
Shrink MeasurementCore MetricsKnown LossShrink attributed to documented incidents (apprehensions, case files, damages)Sum of all documented loss eventsTrack effectiveness of detection and documentation; build case historiesdocumented theft, recorded incidents, case files
Shrink MeasurementDepartment AnalysisDepartment Shrink RateShrink percentage by specific department or category(Dept Book Inv – Dept Physical Inv) / Dept Sales * 100Identify high-risk departments; allocate AP resources strategicallycategory shrink, departmental loss, segment analysis
Shrink MeasurementDepartment AnalysisSKU-Level ShrinkShrink calculated for individual products or SKUsSKU Book Qty – SKU Physical Qty * Unit CostIdentify high-theft items; implement targeted protection strategiesitem-level loss, product shrink, SKU variance
Shrink MeasurementTrendingShrink Trend AnalysisPeriod-over-period comparison of shrink rates(Current Period Shrink – Prior Period Shrink) / Prior Period ShrinkMonitor improvement or deterioration; assess intervention effectivenesstrend analysis, period comparison, shrink trajectory
Shrink MeasurementTrendingRolling Shrink AverageMoving average of shrink over specified time windowAVG(Shrink Rate for last N periods)Smooth out seasonal variations; identify long-term patternsmoving average, smoothed trend, rolling calculation
External TheftShopliftingApprehension RateNumber of shoplifting incidents caught per time periodCount of apprehensions / Time periodMeasure AP team effectiveness; justify staffing levelscatch rate, detention rate, theft incidents
External TheftShopliftingAverage Theft ValueAverage dollar value per shoplifting incidentTotal Recovery Value / Number of ApprehensionsUnderstand theft severity; set case prioritiesaverage loss, theft amount, incident value
External TheftShopliftingRecovery RatePercentage of stolen merchandise recoveredRecovered Merchandise$ / Total Theft$ * 100Assess merchandise recovery effectiveness; evaluate response timemerchandise recovery, recovery percentage, retrieval rate
External TheftORCOrganized Retail Crime (ORC) LossTheft loss attributed to organized crime ringsSum of ORC case valuesTrack sophisticated theft operations; coordinate with law enforcementorganized crime, professional theft, crime rings
External TheftORCORC Incident FrequencyNumber of suspected ORC incidents per periodCount of ORC-flagged transactions or incidentsIdentify ORC patterns; allocate investigative resourcesORC frequency, organized theft rate, crime patterns
External TheftDetectionHigh-Risk Transaction CountTransactions flagged by exception reporting systemsCount of transactions meeting risk criteriaPrioritize investigation targets; refine detection algorithmsexception count, flagged transactions, alert volume
Internal TheftEmployee TheftInternal Theft RateShrink attributed to employee theft as percentageInternal Theft$ / Total Shrink$ * 100Quantify employee theft impact; justify internal controls investmentemployee theft, insider loss, associate dishonesty
Internal TheftEmployee TheftInternal Case CountNumber of internal theft investigations or casesCount of employee theft casesTrack internal threat level; measure investigative workloademployee cases, internal investigations, associate theft incidents
Internal TheftPolicy ViolationsCash Handling ViolationsIncidents of improper cash handling proceduresCount of cash policy violationsIdentify training gaps; enforce cash handling protocolscash violations, till errors, register policy
Internal TheftPolicy ViolationsDiscount Abuse RateExcessive or unauthorized discounts by employeesSuspicious Discounts / Total Discounts * 100Detect employee discount fraud; monitor pricing integritydiscount fraud, pricing abuse, unauthorized markdowns
Internal TheftTransaction AnalysisVoid RatePercentage of transactions voidedVoided Transactions / Total Transactions * 100Identify potential theft concealment; monitor unusual void patternsvoid percentage, transaction cancellations, void abuse
Internal TheftTransaction AnalysisRefund RatePercentage of transactions that are refundsRefund Transactions / Total Transactions * 100Detect refund fraud schemes; monitor return abusereturn rate, refund percentage, return fraud
Internal TheftTransaction AnalysisNo-Sale RateFrequency of register opens without salesNo-Sale Events / Total Transactions * 100Detect cash skimming; monitor register access patternsno-sale frequency, drawer opens, register access
Administrative ErrorsPricingPrice Change AccuracyPercentage of price changes executed correctlyCorrect Price Changes / Total Price Changes * 100Reduce pricing shrink; improve price integritypricing accuracy, markdown errors, price integrity
Administrative ErrorsPricingScan AccuracyPercentage match between scanned price and shelf priceMatching Prices / Total Price Verifications * 100Ensure pricing compliance; reduce customer disputesscan errors, price verification, checkout accuracy
Administrative ErrorsInventoryReceiving Error RatePercentage of receiving discrepanciesReceiving Errors / Total Receipts * 100Improve receiving accuracy; reduce inventory variancereceiving mistakes, inbound errors, receipt accuracy
Administrative ErrorsInventoryInventory Adjustment FrequencyRate of manual inventory adjustmentsManual Adjustments / Total SKU CountMonitor inventory control; identify process weaknessesadjustment rate, inventory corrections, manual changes
Administrative ErrorsAccountingBook-to-Physical VarianceDifference between book inventory and physical countBook Inventory$ – Physical Count$ / Book Inventory$ * 100Measure inventory accuracy; identify systemic issuesinventory variance, count discrepancy, book vs physical
Vendor FraudDeliveryShort Delivery RatePercentage of deliveries with quantity discrepanciesShort Deliveries / Total Deliveries * 100Detect vendor fraud; strengthen receiving controlsdelivery shortages, vendor shorts, receipt discrepancies
Vendor FraudBillingInvoice Discrepancy RatePercentage of invoices with billing errorsDiscrepant Invoices / Total Invoices * 100Identify vendor overbilling; improve AP accuracybilling errors, invoice mistakes, vendor disputes
Vendor FraudQualityDamaged Goods RatePercentage of received goods damaged or defectiveDamaged Units / Total Units Received * 100Monitor vendor quality; claim damaged merchandise creditsproduct damage, vendor quality, receipt damage
Operational LossesPerishablesSpoilage RatePercentage of perishable inventory spoiled or expiredSpoiled Units / Total Perishable Units * 100Optimize ordering; reduce waste in perishablesexpiration, food waste, perishable loss
Operational LossesPerishablesMarkdown RatePercentage of inventory sold at reduced priceMarkdown$ / Regular Price$ * 100Manage markdown timing; optimize pricing strategyclearance, price reduction, promotional markdown
Operational LossesDamageDamage RatePercentage of inventory damaged in-storeDamaged Units / Total Inventory Units * 100Improve handling procedures; reduce operational damageproduct damage, handling loss, breakage
Operational LossesWasteWaste RatePercentage of inventory designated as wasteWaste Units / Total Units * 100Identify waste sources; implement waste reduction programsdisposal, unusable inventory, waste management
Detection & PreventionTechnologyEAS Tag RatePercentage of high-risk items with EAS tagsTagged Items / Total High-Risk Items * 100Ensure protection coverage; optimize tagging strategyelectronic article surveillance, security tags, tag compliance
Detection & PreventionTechnologyCamera Coverage RatePercentage of sales floor covered by camerasCamera Coverage Area / Total Sales Floor Area * 100Assess surveillance effectiveness; identify blind spotsCCTV coverage, video surveillance, camera monitoring
Detection & PreventionTechnologyPOS Exception Alert RatePercentage of transactions triggering exception alertsAlert Transactions / Total Transactions * 100Calibrate detection sensitivity; reduce false positivesexception reporting, alert system, transaction monitoring
Detection & PreventionStaffingAP Coverage HoursHours of AP personnel coverage per weekSum of AP staff hours / Total store hours * 100Optimize AP scheduling; maximize deterrent presenceAP staffing, coverage ratio, personnel allocation
Detection & PreventionAuditingCompliance Audit ScoreStore performance on AP policy compliance auditsPassed Audit Items / Total Audit Items * 100Measure policy adherence; identify training needsaudit compliance, policy adherence, control effectiveness
Financial ImpactProfitabilityShrink Impact on MarginReduction in profit margin due to shrinkShrink$ / (Sales – COGS) * 100Quantify shrink effect on profitability; justify AP investmentsmargin erosion, profit impact, financial loss
Financial ImpactProfitabilityAP ROIReturn on investment for asset protection programs(Shrink Reduction$ – AP Program Cost$) / AP Program Cost$ * 100Evaluate AP program effectiveness; justify budget requestsreturn on investment, program effectiveness, cost benefit
Financial ImpactBenchmarkingIndustry Shrink ComparisonStore shrink rate vs industry benchmarkStore Shrink Rate – Industry Average RateAssess competitive performance; set realistic targetsindustry benchmark, competitive comparison, peer analysis
Financial ImpactForecastingShrink ForecastProjected shrink for future period based on trendsHistorical Avg Shrink * Seasonal FactorBudget planning; set prevention goalsshrink projection, loss forecast, future estimate
InvestigativeCase ManagementCase Closure RatePercentage of investigations completedClosed Cases / Total Cases * 100Track investigative productivity; manage caseloadclosure rate, case resolution, investigation completion
InvestigativeCase ManagementAverage Case ValueAverage dollar value per investigationTotal Case Value$ / Number of CasesPrioritize high-value cases; allocate investigative timecase value, investigation worth, case sizing
InvestigativeCase ManagementInvestigation TimeAverage days to close an investigationSum of (Close Date – Open Date) / Number of CasesImprove investigation efficiency; reduce time to resolutioncase duration, investigation length, resolution time
InvestigativeProsecutionProsecution RatePercentage of cases referred for prosecutionProsecuted Cases / Total Apprehensions * 100Track legal outcomes; maintain law enforcement relationshipsprosecution ratio, legal referral, criminal cases
InvestigativeRecoveryCivil Recovery AmountDollars recovered through civil demandSum of civil recovery paymentsOffset shrink losses; deter repeat offenderscivil demand, restitution, recovery collections
CategorySubcategoryQueryDescriptionUse CaseExcel FormulaDAX QueryOracle SQL QueryKeywords
Shrink AnalysisCore MetricsCalculate Store Shrink RateCalculate the shrink percentage for each store locationMonthly shrink reporting by store; identify high-shrink locations for intervention#NAME?Shrink Rate = DIVIDE(SUM(Inventory[BookValue]) – SUM(Inventory[PhysicalValue]), SUM(Sales[SalesAmount])) * 100SELECT store_id, store_name, ((SUM(book_inventory) – SUM(physical_inventory)) / NULLIF(SUM(sales_amount), 0)) * 100 AS shrink_rate FROM inventory i JOIN sales s ON i.store_id = s.store_id WHERE inventory_date BETWEEN ‘2024-01-01’ AND ‘2024-12-31’ GROUP BY store_id, store_name ORDER BY shrink_rate DESCshrink rate, store performance, location analysis
Shrink AnalysisCore MetricsDepartment Shrink BreakdownAnalyze shrink by department to identify high-loss categoriesTarget AP resources to high-shrink departments; adjust merchandising strategies!ERROR! F3 -> Must specify range of cells, not any kind of literalDept Shrink = CALCULATE(SUM(Inventory[BookValue]) – SUM(Inventory[PhysicalValue]), ALLEXCEPT(Product, Product[Department]))SELECT d.department_name, SUM(i.book_inventory – i.physical_inventory) AS shrink_dollars, (SUM(i.book_inventory – i.physical_inventory) / NULLIF(SUM(s.sales_amount), 0)) * 100 AS shrink_pct FROM inventory i JOIN products p ON i.product_id = p.product_id JOIN departments d ON p.department_id = d.department_id JOIN sales s ON p.product_id = s.product_id AND i.store_id = s.store_id WHERE i.inventory_date = TO_DATE(‘2024-12-31’, ‘YYYY-MM-DD’) GROUP BY d.department_name ORDER BY shrink_dollars DESCdepartment shrink, category loss, segment analysis
Shrink AnalysisCore MetricsTop 20 Shrink SKUsIdentify the top 20 products by shrink dollarsFocus protection efforts on highest-loss items; add EAS tags or security measuresUse pivot table with Product as rows, shrink dollars as values, sorted descending, top 20Top Shrink SKUs = TOPN(20, SUMMARIZE(Inventory, Product[SKU], Product[Description], “Shrink”, SUM(Inventory[BookValue]) – SUM(Inventory[PhysicalValue])), [Shrink], DESC)SELECT * FROM (SELECT p.sku, p.product_name, SUM(i.book_quantity – i.physical_quantity) * p.unit_cost AS shrink_dollars, RANK() OVER (ORDER BY SUM(i.book_quantity – i.physical_quantity) * p.unit_cost DESC) AS shrink_rank FROM inventory i JOIN products p ON i.product_id = p.product_id WHERE i.inventory_date BETWEEN ADD_MONTHS(SYSDATE, -3) AND SYSDATE GROUP BY p.sku, p.product_name, p.unit_cost) WHERE shrink_rank <= 20high shrink items, top loss products, SKU analysis
Shrink AnalysisTrendingMonth-over-Month Shrink TrendCompare current month shrink to previous month by storeTrack shrink improvement or deterioration; assess intervention effectiveness#NAME?MoM Shrink Change = VAR CurrentShrink = CALCULATE([Shrink Rate], DATESMTD(Calendar[Date])) VAR PriorShrink = CALCULATE([Shrink Rate], DATEADD(Calendar[Date], -1, MONTH)) RETURN DIVIDE(CurrentShrink – PriorShrink, PriorShrink) * 100SELECT s.store_id, s.store_name, current.shrink_rate AS current_month_shrink, prior.shrink_rate AS prior_month_shrink, ((current.shrink_rate – prior.shrink_rate) / NULLIF(prior.shrink_rate, 0)) * 100 AS pct_change FROM stores s JOIN (SELECT store_id, shrink_rate FROM monthly_shrink WHERE month_year = TO_DATE(‘2024-12-01’, ‘YYYY-MM-DD’)) current ON s.store_id = current.store_id JOIN (SELECT store_id, shrink_rate FROM monthly_shrink WHERE month_year = TO_DATE(‘2024-11-01’, ‘YYYY-MM-DD’)) prior ON s.store_id = prior.store_id ORDER BY pct_change DESCshrink trend, period comparison, month over month
Shrink AnalysisTrendingRolling 12-Month Shrink AverageCalculate 12-month moving average shrink rate by storeSmooth seasonal variations; identify long-term trends!ERROR! F6 -> Invalid cell coordinate #NAME?Rolling 12M Shrink = CALCULATE([Shrink Rate], DATESINPERIOD(Calendar[Date], LASTDATE(Calendar[Date]), -12, MONTH))SELECT store_id, inventory_month, shrink_rate, AVG(shrink_rate) OVER (PARTITION BY store_id ORDER BY inventory_month ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS rolling_12m_avg FROM monthly_shrink_summary WHERE inventory_month >= ADD_MONTHS(SYSDATE, -24) ORDER BY store_id, inventory_monthmoving average, rolling average, trend smoothing
External TheftIncidentsApprehension Count by StoreCount of shoplifting apprehensions by store and time periodMeasure AP team productivity; justify staffing levels0Apprehensions = CALCULATE(COUNTROWS(Incidents), Incidents[IncidentType] = “Shoplifting”)SELECT s.store_id, s.store_name, COUNT(i.incident_id) AS apprehension_count, SUM(i.recovered_value) AS total_recovery FROM stores s LEFT JOIN incidents i ON s.store_id = i.store_id WHERE i.incident_type = ‘SHOPLIFTING’ AND i.incident_date BETWEEN TO_DATE(‘2024-01-01’, ‘YYYY-MM-DD’) AND TO_DATE(‘2024-12-31’, ‘YYYY-MM-DD’) GROUP BY s.store_id, s.store_name ORDER BY apprehension_count DESCshoplifting incidents, apprehension rate, theft count
External TheftIncidentsAverage Theft Value by Time PeriodCalculate average dollar value per theft incident over timeUnderstand theft severity trends; identify escalating theft patterns#DIV/0!Avg Theft Value = AVERAGEX(FILTER(Incidents, Incidents[IncidentType] = “Shoplifting”), Incidents[RecoveredValue])SELECT TRUNC(incident_date, ‘MM’) AS incident_month, COUNT(incident_id) AS incident_count, AVG(recovered_value) AS avg_theft_value, MEDIAN(recovered_value) AS median_theft_value FROM incidents WHERE incident_type = ‘SHOPLIFTING’ AND incident_date >= ADD_MONTHS(SYSDATE, -12) GROUP BY TRUNC(incident_date, ‘MM’) ORDER BY incident_monthaverage theft, incident value, theft amount
External TheftORCSuspected ORC TransactionsIdentify transactions matching ORC patterns (multiple high-value items, suspicious returns)Flag potential organized retail crime for investigation0ORC Flags = CALCULATE(COUNTROWS(Transactions), Transactions[Quantity] >= 5, Transactions[TransactionAmount] >= 500, Transactions[PaymentMethod] IN {“Cash”, “Gift Card”})SELECT t.transaction_id, t.transaction_date, t.store_id, COUNT(DISTINCT td.product_id) AS unique_items, SUM(td.quantity) AS total_quantity, SUM(td.extended_price) AS transaction_total FROM transactions t JOIN transaction_details td ON t.transaction_id = td.transaction_id WHERE td.product_id IN (SELECT product_id FROM high_theft_items) GROUP BY t.transaction_id, t.transaction_date, t.store_id HAVING COUNT(DISTINCT td.product_id) >= 5 AND SUM(td.extended_price) >= 500 ORDER BY transaction_total DESCorganized retail crime, ORC detection, suspicious transactions
External TheftDetectionHigh-Risk Transaction AlertsCount of transactions triggering exception rulesMonitor detection system effectiveness; prioritize investigations!ERROR! F10 -> Must specify range of cells, not any kind of literalException Alerts = CALCULATE(COUNTROWS(Transactions), Transactions[ExceptionFlag] = TRUE())SELECT alert_type, COUNT(*) AS alert_count, COUNT(DISTINCT transaction_id) AS unique_transactions, COUNT(DISTINCT store_id) AS stores_affected FROM transaction_exceptions WHERE alert_date >= TRUNC(SYSDATE) – 7 GROUP BY alert_type ORDER BY alert_count DESCexception reporting, alert count, fraud detection
Internal TheftEmployee ActivityExcessive Void Transactions by EmployeeIdentify employees with abnormally high void ratesDetect potential theft concealment through voided transactions!ERROR! F11 -> Must specify range of cells, not any kind of literalVoid Rate = DIVIDE(CALCULATE(COUNTROWS(Transactions), Transactions[TransactionType] = “Void”), COUNTROWS(Transactions))SELECT e.employee_id, e.employee_name, e.store_id, COUNT(CASE WHEN t.transaction_type = ‘VOID’ THEN 1 END) AS void_count, COUNT(t.transaction_id) AS total_transactions, (COUNT(CASE WHEN t.transaction_type = ‘VOID’ THEN 1 END) / NULLIF(COUNT(t.transaction_id), 0)) * 100 AS void_rate FROM employees e JOIN transactions t ON e.employee_id = t.cashier_id WHERE t.transaction_date >= TRUNC(SYSDATE) – 30 GROUP BY e.employee_id, e.employee_name, e.store_id HAVING (COUNT(CASE WHEN t.transaction_type = ‘VOID’ THEN 1 END) / NULLIF(COUNT(t.transaction_id), 0)) > 0.05 ORDER BY void_rate DESCvoid rate, employee voids, transaction cancellations
Internal TheftEmployee ActivityExcessive Discount UsageTrack employees giving discounts above normal thresholdsIdentify potential discount abuse or unauthorized markdowns!ERROR! F12 -> Must specify range of cells, not any kind of literalDiscount Rate = DIVIDE(SUM(Transactions[DiscountAmount]), SUM(Transactions[SalesAmount])) * 100SELECT e.employee_id, e.employee_name, COUNT(t.transaction_id) AS transactions_with_discounts, SUM(t.discount_amount) AS total_discounts, AVG(t.discount_amount) AS avg_discount, (SUM(t.discount_amount) / NULLIF(SUM(t.sales_amount), 0)) * 100 AS discount_rate FROM employees e JOIN transactions t ON e.employee_id = t.cashier_id WHERE t.discount_amount > 0 AND t.transaction_date >= TRUNC(SYSDATE) – 30 GROUP BY e.employee_id, e.employee_name HAVING (SUM(t.discount_amount) / NULLIF(SUM(t.sales_amount), 0)) > 0.15 ORDER BY discount_rate DESCdiscount abuse, employee discounts, markdown fraud
Internal TheftEmployee ActivityNo-Sale Frequency AnalysisMonitor register opens without sales by employeeDetect potential cash skimming or theft0No Sales = CALCULATE(COUNTROWS(RegisterEvents), RegisterEvents[EventType] = “No Sale”)SELECT e.employee_id, e.employee_name, COUNT(re.event_id) AS no_sale_count, COUNT(DISTINCT TRUNC(re.event_timestamp)) AS days_worked, COUNT(re.event_id) / NULLIF(COUNT(DISTINCT TRUNC(re.event_timestamp)), 0) AS no_sales_per_day FROM employees e JOIN register_events re ON e.employee_id = re.employee_id WHERE re.event_type = ‘NO_SALE’ AND re.event_timestamp >= TRUNC(SYSDATE) – 30 GROUP BY e.employee_id, e.employee_name HAVING COUNT(re.event_id) / NULLIF(COUNT(DISTINCT TRUNC(re.event_timestamp)), 0) > 3 ORDER BY no_sales_per_day DESCno sale, register opens, cash access
Internal TheftRefundsSuspicious Refund PatternsIdentify refunds without original receipts or to same employeeDetect refund fraud schemes0No Receipt Refunds = CALCULATE(COUNTROWS(Refunds), Refunds[ReceiptProvided] = FALSE())SELECT e.employee_id, e.employee_name, COUNT(r.refund_id) AS no_receipt_refunds, SUM(r.refund_amount) AS total_no_receipt_value, COUNT(CASE WHEN r.refund_to_employee_id = e.employee_id THEN 1 END) AS refunds_to_self FROM employees e JOIN refunds r ON e.employee_id = r.processed_by_employee_id WHERE (r.original_receipt_id IS NULL OR r.refund_to_employee_id = e.employee_id) AND r.refund_date >= TRUNC(SYSDATE) – 30 GROUP BY e.employee_id, e.employee_name HAVING COUNT(r.refund_id) > 5 ORDER BY no_receipt_refunds DESCrefund fraud, no receipt returns, suspicious refunds
Administrative ErrorsPricingPrice Change Accuracy RateCalculate percentage of price changes executed correctlyIdentify training needs; reduce pricing shrink from errors!ERROR! F15 -> Must specify range of cells, not any kind of literalPrice Accuracy = DIVIDE(COUNTROWS(FILTER(PriceChanges, PriceChanges[Accurate] = TRUE())), COUNTROWS(PriceChanges)) * 100SELECT pc.store_id, s.store_name, COUNT(pc.price_change_id) AS total_changes, COUNT(CASE WHEN pc.system_price = pc.shelf_price THEN 1 END) AS accurate_changes, (COUNT(CASE WHEN pc.system_price = pc.shelf_price THEN 1 END) / NULLIF(COUNT(pc.price_change_id), 0)) * 100 AS accuracy_rate FROM price_changes pc JOIN stores s ON pc.store_id = s.store_id WHERE pc.verification_date >= TRUNC(SYSDATE) – 7 GROUP BY pc.store_id, s.store_name ORDER BY accuracy_rate ASCprice accuracy, pricing errors, price integrity
Administrative ErrorsReceivingReceiving Discrepancy ReportTrack differences between ordered and received quantitiesImprove receiving accuracy; identify vendor or process issues!ERROR! F16 -> Must specify range of cells, not any kind of literalReceiving Variance = SUM(Receiving[OrderedQty]) – SUM(Receiving[ReceivedQty])SELECT po.vendor_id, v.vendor_name, COUNT(DISTINCT po.po_number) AS total_pos, SUM(pod.ordered_quantity – pod.received_quantity) AS quantity_variance, SUM((pod.ordered_quantity – pod.received_quantity) * pod.unit_cost) AS dollar_variance FROM purchase_orders po JOIN po_details pod ON po.po_number = pod.po_number JOIN vendors v ON po.vendor_id = v.vendor_id WHERE po.received_date >= ADD_MONTHS(SYSDATE, -3) AND pod.ordered_quantity != pod.received_quantity GROUP BY po.vendor_id, v.vendor_name ORDER BY dollar_variance DESCreceiving errors, delivery discrepancy, vendor shorts
Administrative ErrorsInventoryInventory Adjustment FrequencyMonitor rate of manual inventory adjustments by locationIdentify stores with inventory control issues0Manual Adjustments = CALCULATE(COUNTROWS(InventoryAdjustments), InventoryAdjustments[AdjustmentType] = “Manual”)SELECT ia.store_id, s.store_name, COUNT(ia.adjustment_id) AS adjustment_count, SUM(ABS(ia.adjustment_quantity)) AS total_units_adjusted, SUM(ABS(ia.adjustment_value)) AS total_dollar_adjusted, COUNT(DISTINCT ia.employee_id) AS employees_making_adjustments FROM inventory_adjustments ia JOIN stores s ON ia.store_id = s.store_id WHERE ia.adjustment_date >= TRUNC(SYSDATE) – 30 AND ia.adjustment_type = ‘MANUAL’ GROUP BY ia.store_id, s.store_name ORDER BY adjustment_count DESCinventory adjustments, manual corrections, inventory integrity
Vendor AnalysisDeliveryVendor Short Delivery RateCalculate percentage of deliveries short by vendorIdentify problematic vendors; strengthen receiving controls!ERROR! F18 -> Must specify range of cells, not any kind of literalShort Rate = DIVIDE(CALCULATE(COUNTROWS(Deliveries), Deliveries[IsShort] = TRUE()), COUNTROWS(Deliveries)) * 100SELECT v.vendor_id, v.vendor_name, COUNT(d.delivery_id) AS total_deliveries, COUNT(CASE WHEN d.ordered_qty > d.received_qty THEN 1 END) AS short_deliveries, (COUNT(CASE WHEN d.ordered_qty > d.received_qty THEN 1 END) / NULLIF(COUNT(d.delivery_id), 0)) * 100 AS short_rate, SUM(CASE WHEN d.ordered_qty > d.received_qty THEN (d.ordered_qty – d.received_qty) * d.unit_cost ELSE 0 END) AS short_dollar_value FROM vendors v JOIN deliveries d ON v.vendor_id = d.vendor_id WHERE d.delivery_date >= ADD_MONTHS(SYSDATE, -6) GROUP BY v.vendor_id, v.vendor_name HAVING COUNT(d.delivery_id) >= 10 ORDER BY short_rate DESCvendor shorts, delivery accuracy, vendor performance
Vendor AnalysisQualityDamaged Goods by VendorTrack percentage of received inventory damaged by vendorMonitor vendor quality; claim credits for damaged goods!ERROR! F19 -> Must specify range of cells, not any kind of literalDamage Rate = DIVIDE(SUM(Receiving[DamagedQty]), SUM(Receiving[ReceivedQty])) * 100SELECT v.vendor_id, v.vendor_name, COUNT(ri.inspection_id) AS inspections, SUM(ri.damaged_quantity) AS total_damaged_units, SUM(ri.received_quantity) AS total_received_units, (SUM(ri.damaged_quantity) / NULLIF(SUM(ri.received_quantity), 0)) * 100 AS damage_rate, SUM(ri.damaged_quantity * ri.unit_cost) AS damage_dollar_value FROM vendors v JOIN receiving_inspections ri ON v.vendor_id = ri.vendor_id WHERE ri.inspection_date >= ADD_MONTHS(SYSDATE, -3) GROUP BY v.vendor_id, v.vendor_name HAVING SUM(ri.received_quantity) > 0 ORDER BY damage_rate DESCdamaged goods, vendor quality, product damage
Operational LossesPerishablesSpoilage Rate by DepartmentCalculate percentage of perishable inventory spoiledOptimize ordering for perishables; reduce waste!ERROR! F20 -> Must specify range of cells, not any kind of literalSpoilage = DIVIDE(SUM(Perishables[SpoiledQty]), SUM(Perishables[ReceivedQty])) * 100SELECT d.department_name, SUM(p.spoiled_quantity) AS spoiled_units, SUM(p.received_quantity) AS received_units, (SUM(p.spoiled_quantity) / NULLIF(SUM(p.received_quantity), 0)) * 100 AS spoilage_rate, SUM(p.spoiled_quantity * p.unit_cost) AS spoilage_cost FROM perishables p JOIN products pr ON p.product_id = pr.product_id JOIN departments d ON pr.department_id = d.department_id WHERE p.disposition_date >= TRUNC(SYSDATE) – 30 AND p.disposition_reason = ‘SPOILAGE’ GROUP BY d.department_name ORDER BY spoilage_cost DESCspoilage, food waste, perishable loss
Operational LossesMarkdownMarkdown Analysis by CategoryTrack markdown dollars and percentage by categoryOptimize pricing strategy; improve markdown timing!ERROR! F21 -> Must specify range of cells, not any kind of literalMarkdown % = DIVIDE(SUM(Sales[MarkdownAmount]), SUM(Sales[RegularPrice])) * 100SELECT c.category_name, COUNT(DISTINCT m.product_id) AS items_marked_down, SUM(m.markdown_quantity * (m.original_price – m.markdown_price)) AS total_markdown_dollars, SUM(m.markdown_quantity * m.original_price) AS original_value, (SUM(m.markdown_quantity * (m.original_price – m.markdown_price)) / NULLIF(SUM(m.markdown_quantity * m.original_price), 0)) * 100 AS markdown_pct FROM markdowns m JOIN products p ON m.product_id = p.product_id JOIN categories c ON p.category_id = c.category_id WHERE m.markdown_date >= TRUNC(SYSDATE) – 30 GROUP BY c.category_name ORDER BY total_markdown_dollars DESCmarkdown rate, clearance, price reduction
Detection & PreventionTechnologyEAS Tag Compliance RatePercentage of high-theft items properly taggedEnsure protection coverage on vulnerable merchandise!ERROR! F22 -> Must specify range of cells, not any kind of literalTag Compliance = DIVIDE(CALCULATE(COUNTROWS(Inventory), Inventory[EASTagged] = TRUE()), COUNTROWS(Inventory)) * 100SELECT s.store_id, s.store_name, COUNT(i.item_id) AS high_theft_items, COUNT(CASE WHEN i.eas_tagged = ‘Y’ THEN 1 END) AS tagged_items, (COUNT(CASE WHEN i.eas_tagged = ‘Y’ THEN 1 END) / NULLIF(COUNT(i.item_id), 0)) * 100 AS tag_compliance_rate FROM stores s JOIN inventory i ON s.store_id = i.store_id JOIN products p ON i.product_id = p.product_id WHERE p.high_theft_indicator = ‘Y’ AND i.inventory_date = TRUNC(SYSDATE) GROUP BY s.store_id, s.store_name ORDER BY tag_compliance_rate ASCEAS tags, security tags, tag compliance
Detection & PreventionAuditingAP Audit Compliance ScoreStore performance on asset protection policy auditsMeasure policy adherence; identify training gaps!ERROR! F23 -> Must specify range of cells, not any kind of literalAudit Score = DIVIDE(SUM(Audits[PassedItems]), SUM(Audits[TotalItems])) * 100SELECT a.store_id, s.store_name, a.audit_date, COUNT(ai.audit_item_id) AS total_items, COUNT(CASE WHEN ai.compliant = ‘Y’ THEN 1 END) AS passed_items, (COUNT(CASE WHEN ai.compliant = ‘Y’ THEN 1 END) / NULLIF(COUNT(ai.audit_item_id), 0)) * 100 AS compliance_score FROM audits a JOIN audit_items ai ON a.audit_id = ai.audit_id JOIN stores s ON a.store_id = s.store_id WHERE a.audit_date >= ADD_MONTHS(SYSDATE, -3) GROUP BY a.store_id, s.store_name, a.audit_date ORDER BY a.store_id, a.audit_date DESCaudit compliance, policy adherence, control effectiveness
Financial ImpactROIAsset Protection Program ROICalculate return on investment for AP initiativesJustify AP program spending; demonstrate value#NAME?AP ROI = DIVIDE([Prior Year Shrink] – [Current Year Shrink] – [AP Program Cost], [AP Program Cost]) * 100SELECT ap.program_name, ap.program_cost, (prior.total_shrink – current.total_shrink) AS shrink_reduction, ((prior.total_shrink – current.total_shrink) – ap.program_cost) AS net_savings, (((prior.total_shrink – current.total_shrink) – ap.program_cost) / NULLIF(ap.program_cost, 0)) * 100 AS roi_pct FROM ap_programs ap, (SELECT SUM(shrink_dollars) AS total_shrink FROM shrink_summary WHERE fiscal_year = 2023) prior, (SELECT SUM(shrink_dollars) AS total_shrink FROM shrink_summary WHERE fiscal_year = 2024) current WHERE ap.fiscal_year = 2024ROI, return on investment, program effectiveness
Financial ImpactBenchmarkingStore Shrink vs District AverageCompare individual store shrink to district benchmarkIdentify underperforming locations; set realistic targets!ERROR! F25 -> Must specify range of cells, not any kind of literalvs District = [Store Shrink Rate] – CALCULATE(AVERAGE(Stores[ShrinkRate]), ALLEXCEPT(Stores, Stores[District]))SELECT s.store_id, s.store_name, s.district_id, ss.shrink_rate AS store_shrink_rate, AVG(ss2.shrink_rate) OVER (PARTITION BY s.district_id) AS district_avg_shrink, ss.shrink_rate – AVG(ss2.shrink_rate) OVER (PARTITION BY s.district_id) AS variance_from_district FROM stores s JOIN shrink_summary ss ON s.store_id = ss.store_id JOIN shrink_summary ss2 ON s.district_id = ss2.district_id WHERE ss.period = ‘Q4-2024’ ORDER BY variance_from_district DESCbenchmark comparison, district average, peer analysis
InvestigativeCase ManagementAverage Case Resolution TimeCalculate average days to close investigationsImprove investigation efficiency; identify bottlenecks#VALUE!Avg Resolution = AVERAGE(Cases[ClosedDate] – Cases[OpenedDate])SELECT c.case_type, COUNT(c.case_id) AS total_cases, AVG(c.closed_date – c.opened_date) AS avg_days_to_close, MEDIAN(c.closed_date – c.opened_date) AS median_days_to_close, MAX(c.closed_date – c.opened_date) AS max_days_to_close FROM cases c WHERE c.case_status = ‘CLOSED’ AND c.closed_date >= ADD_MONTHS(SYSDATE, -6) GROUP BY c.case_type ORDER BY avg_days_to_close DESCcase duration, investigation time, resolution speed
InvestigativeRecoveryCivil Recovery Success RatePercentage of civil demands resulting in paymentTrack recovery effectiveness; adjust recovery strategy!ERROR! F27 -> Must specify range of cells, not any kind of literalRecovery Rate = DIVIDE(COUNTROWS(FILTER(CivilDemands, CivilDemands[PaymentStatus] = “Paid”)), COUNTROWS(CivilDemands)) * 100SELECT cd.demand_year, COUNT(cd.demand_id) AS total_demands, SUM(cd.demand_amount) AS total_demanded, COUNT(CASE WHEN cd.payment_status = ‘PAID’ THEN 1 END) AS paid_count, SUM(CASE WHEN cd.payment_status = ‘PAID’ THEN cd.payment_amount ELSE 0 END) AS total_collected, (COUNT(CASE WHEN cd.payment_status = ‘PAID’ THEN 1 END) / NULLIF(COUNT(cd.demand_id), 0)) * 100 AS collection_rate FROM civil_demands cd WHERE cd.demand_date >= ADD_MONTHS(SYSDATE, -12) GROUP BY cd.demand_year ORDER BY cd.demand_yearcivil recovery, restitution, collection rate
Exception ReportingTransaction PatternsAfter-Hours TransactionsIdentify transactions occurring outside normal business hoursDetect unauthorized access or suspicious activity!ERROR! F28 -> Must specify range of cells, not any kind of literalAfter Hours = CALCULATE(COUNTROWS(Transactions), OR(Transactions[TransTime] < TIME(7,0,0), Transactions[TransTime] > TIME(22,0,0)))SELECT t.store_id, s.store_name, TO_CHAR(t.transaction_timestamp, ‘HH24:MI’) AS transaction_time, t.transaction_id, t.cashier_id, e.employee_name, t.transaction_amount FROM transactions t JOIN stores s ON t.store_id = s.store_id JOIN employees e ON t.cashier_id = e.employee_id WHERE (EXTRACT(HOUR FROM t.transaction_timestamp) < 7 OR EXTRACT(HOUR FROM t.transaction_timestamp) > 22) AND t.transaction_date >= TRUNC(SYSDATE) – 7 ORDER BY t.store_id, t.transaction_timestampafter hours, off-hours transactions, unauthorized access
Exception ReportingTransaction PatternsLarge Cash TransactionsFlag cash transactions over threshold amountIdentify potential suspicious activity or fraud0Large Cash = CALCULATE(COUNTROWS(Transactions), Transactions[PaymentMethod] = “Cash”, Transactions[Amount] >= 1000)SELECT t.transaction_id, t.transaction_date, t.store_id, s.store_name, t.cashier_id, e.employee_name, t.transaction_amount, t.payment_method FROM transactions t JOIN stores s ON t.store_id = s.store_id JOIN employees e ON t.cashier_id = e.employee_id WHERE t.payment_method = ‘CASH’ AND t.transaction_amount >= 1000 AND t.transaction_date >= TRUNC(SYSDATE) – 30 ORDER BY t.transaction_amount DESClarge cash, cash transactions, high value sales
Exception ReportingEmployee BehaviorSame-Day Hire and RefundIdentify employees processing refunds on same day as hiringDetect potential collusion or fraud0Same Day Events = CALCULATE(COUNTROWS(Refunds), Refunds[RefundDate] = RELATED(Employees[HireDate]))SELECT e.employee_id, e.employee_name, e.hire_date, r.refund_id, r.refund_date, r.refund_amount, r.transaction_id FROM employees e JOIN refunds r ON e.employee_id = r.processed_by_employee_id WHERE TRUNC(r.refund_date) = TRUNC(e.hire_date) AND r.refund_date >= ADD_MONTHS(SYSDATE, -6) ORDER BY r.refund_amount DESCnew hire fraud, same day refund, employee collusion
Privacy Settings
We use cookies to enhance your experience while using our website. If you are using our Services via a browser you can restrict, block or remove cookies through your web browser settings. We also use content and scripts from third parties that may use tracking technologies. You can selectively provide your consent below to allow such third party embeds. For complete information about the cookies we use, data we collect and how we process them, please check our Privacy Policy
Youtube
Consent to display content from Youtube
Vimeo
Consent to display content from Vimeo
Google Maps
Consent to display content from Google