IPM Food Pantry
IPM Monthly Dashboard
Integrated Pantry Management · Oasis Data API
March 2026
| ✕
Data flow: Oasis API → TiDB Cloud (SQL) → Dashboard. Records sync automatically each night; use Sync from API to pull immediately.
This Month
Total Household Visits
—
Selected month only
Total People Served
—
Selected month only
Pounds of Food Distributed
—
Selected month only
Boxes / Bags / Kits
—
Selected month only
Year-to-Date Totals
Total Household Visits
—
Total People Served
—
Pounds of Food Distributed
—
All food programs · YTD
Boxes / Bags / Kits
—
Non-food · YTD cumulative
Program Breakdown
Program Breakdown (YTD)
Monthly Household Visits Trend
Growth & Reach
Unique Households · YoY
—
Reach growth, complete years
Re-engagement Pool
—
Lapsed 6mo+ · outreach target
Registered Households
—
Cumulative · all years
Demand Growth by Year
Client Base Growth
AI Insight
Loading AI insight…
📍
County data = client's home county, not the location where they were served. It comes from the county field on each household's Oasis case record. FoodLink is partner event/location data, so it appears under Partner Locations and Program Activity instead of this home-county chart.
All Programs by County — Household Visits (YTD)
County Coverage
Coverage of County
—
Unique families ÷ population
Unique Families Served · YTD
—
Distinct households this year
County Population (est.)
—
Config: COUNTY_POPULATION
County Statistics — All-Time Totals
Source: Oasis Agency Assistance Report · All years  · 
All-Time Program Totals
Source: Oasis Agency Assistance by Category · refreshed from TiDB
Assistance Records
92,507
All programs · all time
Unique Households
12,437
37,426 total members · all time
Pounds of Food Distributed
2.57M
All food programs · all time
Boxes / Bags / Kits
25,518
Incl. diapers & period kits
Households Served by Program — All Time
Pounds of Food Distributed by Program — All Time
Demographics
Communities of Color Served
— of households with demographic data
— households from non-White/Caucasian communities · YTD
Unhoused
—
Veterans
—
Non-English
—
Advanced HOH Query AND conditions
Count HOHs matching all selected conditions
Identity & Background
Gender
Ethnicity · Minority Focus
Circumstances & Eligibility
Veteran Status
Employment Status
Government Benefits (multi-select — counts exceed total households)
Primary Language · Non-English Focus
Education Level
Household Size Distribution
Age, Housing & Visit Behavior
Age Group (YTD)
Housing Status
Visit Frequency Distribution
Member Age Pyramid · All Served Households
Program Activity
—
Busiest program this month
—
Most food per visit · YTD
—
Programs that ran this month
—
Meals provided this year (lbs ÷ 1.2)
New Families
—
First visit ever this year (YTD)
Returning Families
—
Visited in prior years too (YTD)
Unique Households
—
Distinct families served (YTD)
📅 Service Calendar — What Ran Each Day
—
Click a day for the breakdown — tag a mobile location or add a manual count.
ℹ️ How programs are counted
Drive-Through Pantry — daytime drive-thru visits where the Oasis category contains "Drive Thru" or "Drive Through" but does not contain "Evening". Does not include DoorDash deliveries. Each assistance record = one household visit.
Evening Drive-Through — Oasis categories containing "Evening" (e.g. "Evening Drive Through"). Tracked separately from Drive-Through Pantry.
DoorDash Delivery — Oasis categories containing "Door Dash" or "DoorDash". Tracked separately from Drive-Through Pantry.
The Market / Choice Pantry — in-person choice shopping visits where the Oasis category contains "Choice Pantry".
Mobile Pantry — off-site community outreach; Oasis category is exactly "Mobile Pantry". Event count = COUNT(DISTINCT date).
Pop-up Pantry — events with Oasis event type "Pop up Pantry" or "Senior Pop Up". HH and lbs pulled from event activity values.
Fresh Start Kitchen — events with Oasis event type "Fresh Start" / "Re-Start Kitchen". HH and lbs pulled from event activity values.
Senior Box — assistance records where the Oasis category contains "Senior Box". Each record = one household visit.
FoodLink — food distributed to partner agencies via the Oasis Events module (event type = "FoodLink"). Each event = one partner distribution session; agency count = distinct locations served.
Sweet Cheeks Diapers — Oasis categories containing "Sweet Cheeks" or "Diaper". Pack count = SUM(amount) where unit = Boxes/Bags.
Period Kits (Tidal Wave) — Oasis categories containing "Period Kit" or "Tidal Wave". Kit count = SUM(amount) where unit = Boxes/Bags.
Clothing Vouchers — Oasis categories containing "Clothing Voucher", distributed through St. Vincent de Paul. Count = SUM(amount).
Homeless Backpacks — event activity total where activity name = "Homeless Backpacks". Counts packs distributed across all event types.
Program Activity — Year to Date
Green cards — click for full details & family profile, tick Compare to chart them side by side Yellow cards — event programs (FoodLink, Pop-up, Fresh Start, Power Pack) have no per-family records in Oasis, so no family profile; the 🔍 shows their raw event rows
Pantry Programs — click a card for family details
🛒
—
Household visits
Drive-Through Pantry
— lbs
🏠
—
Household visits
The Market / Choice Pantry
— lbs
🚐
—
Household visits
Mobile Pantry Events
—
— lbs
🌙
—
Household visits
Evening Drive-Through
— lbs
📦
—
Household visits
Senior Box
— lbs
🛵
—
Household visits
DoorDash Delivery
— lbs
Event Programs — totals only (no family records in Oasis)
🏪
—
Household visits
Pop-up Pantry Events
—
— lbs
🏢
—
Household visits
Food Link Boxes
— agencies
— lbs
🍳
—
Household visits
Fresh Start Kitchen
—
— lbs
🍱
—
Packs distributed
Power Pack
— lbs
(not included in total)
Non-Food Programs — Year to Date
🍼
—
Unique Households
Sweet Cheeks Diapers
— packs distributed
🌊
—
Unique Households
Period Kits (Tidal Wave)
— kits distributed
👕
—
Unique Households
Clothing Vouchers
St. Vincent de Paul · — vouchers
🎒
—
YTD total
Homeless Backpacks
packs distributed
Service Days per Program · This Month
Year-over-Year Monthly Growth
% change in household visits vs the same month in the prior year — green = growth, red = decline
New vs Returning Households
Each family is counted once per month (not visits). Blue at the bottom = families whose first-ever visit was that month, with the blue number showing what share of the month they are. Green = families who had visited before.
Reach Evolution — who we serve, month by month
Pick a group to see how many distinct families we reached each month since 2021 — useful for grant applications.
Programs:
📋 API & SQL Reference
CSV ↔ SQL Mapping
Main Programs
Mobile by County
Age Breakdown
Events / FRH
Full YTD Summary
Oasis Assistance Report Field Mapping
-- Core summary mapping (CSV ↔ SQL)
-- Duplicated household count  -> COUNT(*) on assistance_assistance within date range
-- Duplicated member count     -> SUM(COALESCE(ch.case_count,1))
-- Household count (unique)    -> COUNT(DISTINCT aa.case_id)
-- Assistance count            -> COUNT(*)

SELECT
  COUNT(*) AS duplicated_household_count,
  COUNT(DISTINCT aa.case_id) AS household_count,
  SUM(COALESCE(ch.case_count, 1)) AS duplicated_member_count,
  COUNT(*) AS assistance_count
FROM assistance_assistance aa
JOIN cases_case hoh ON hoh.id = aa.case_id
LEFT JOIN cases_household ch ON ch.id = hoh.household_id
WHERE aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}';
Demographics Mapping (EAV)
-- CSV columns like Gender/Ethnicity/Employment/Veteran/Benefits/Language
-- come from cases_casedetail (EAV model) + details tables

SELECT
  dg.name  AS detail_group,
  dd.name  AS detail_name,
  COUNT(DISTINCT aa.case_id) AS households
FROM assistance_assistance aa
JOIN cases_casedetail ccd ON ccd.case_id = aa.case_id
JOIN details_detail dd ON dd.id = ccd.detail_id
JOIN details_group dg ON dg.id = dd.group_id
WHERE aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}'
  AND dg.name IN ('Gender','Ethnicity','Employment','Veteran','Government Benefits','Language','Education')
GROUP BY dg.name, dd.name
ORDER BY dg.name, households DESC;
Date Field Rule
-- Oasis CSV "Assistance Date" matches assistance_assistance.date
-- Use aa.date for report alignment (not entry_date fields).
Drive Through (D) — households & individuals
-- Drive Through duplicated household + member counts
SELECT
  COUNT(*) AS duplicated_households,
  SUM(COALESCE(ch.case_count, 1)) AS duplicated_members
FROM assistance_assistance aa
JOIN assistance_category ac ON aa.category_id = ac.id
JOIN cases_case hoh ON hoh.id = aa.case_id
LEFT JOIN cases_household ch ON ch.id = hoh.household_id
WHERE (ac.name LIKE '%Drive Thru%' OR ac.name LIKE '%Drive Through%'
    OR ac.name LIKE '%Door Dash%' OR ac.name LIKE '%DoorDash%')
  AND aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}';
Market (C) — households & individuals
-- Market (Choice Pantry) duplicated household + member counts
SELECT
  COUNT(*) AS duplicated_households,
  SUM(COALESCE(ch.case_count, 1)) AS duplicated_members
FROM assistance_assistance aa
JOIN assistance_category ac ON aa.category_id = ac.id
JOIN cases_case hoh ON hoh.id = aa.case_id
LEFT JOIN cases_household ch ON ch.id = hoh.household_id
WHERE ac.name LIKE '%Choice Pantry%'
  AND aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}';
Mobile Pantry (M) — households & individuals
-- Mobile Pantry duplicated household + member counts
SELECT
  COUNT(*) AS duplicated_households,
  SUM(COALESCE(ch.case_count, 1)) AS duplicated_members
FROM assistance_assistance aa
JOIN assistance_category ac ON aa.category_id = ac.id
JOIN cases_case hoh ON hoh.id = aa.case_id
LEFT JOIN cases_household ch ON ch.id = hoh.household_id
WHERE ac.name = 'Mobile Pantry'
  AND aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}';
Mobile Pantry by County — with vs. without children
-- Mobile Pantry by county with/without children
SELECT
  COALESCE(dc.name, 'Other') AS county,
  SUM(CASE WHEN ch.max_dob > DATE_SUB(CURDATE(), INTERVAL 18 YEAR) THEN 1 ELSE 0 END) AS with_children,
  SUM(CASE WHEN ch.max_dob IS NULL OR ch.max_dob <= DATE_SUB(CURDATE(), INTERVAL 18 YEAR) THEN 1 ELSE 0 END) AS without_children,
  COUNT(*) AS duplicated_households
FROM assistance_assistance aa
JOIN assistance_category ac ON aa.category_id = ac.id
JOIN cases_case hoh ON hoh.id = aa.case_id
JOIN cases_household ch ON ch.id = hoh.household_id
LEFT JOIN details_county dc ON dc.id = ch.county_id
WHERE ac.name = 'Mobile Pantry'
  AND aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}'
GROUP BY county
ORDER BY duplicated_households DESC;
Age breakdown — Drive Through + Market + Mobile
-- Duplicated member age counts (each visit x each household member)
WITH visits AS (
  SELECT aa.id, aa.case_id
  FROM assistance_assistance aa
  JOIN assistance_category ac ON ac.id = aa.category_id
  WHERE (ac.name LIKE '%Drive Thru%' OR ac.name LIKE '%Drive Through%'
      OR ac.name LIKE '%Door Dash%' OR ac.name LIKE '%DoorDash%'
      OR ac.name LIKE '%Choice Pantry%' OR ac.name = 'Mobile Pantry')
    AND aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}'
)
SELECT
  SUM(CASE WHEN TIMESTAMPDIFF(YEAR, c2.date_of_birth, CURDATE()) < 18 THEN 1 ELSE 0 END)  AS dup_members_0_17,
  SUM(CASE WHEN TIMESTAMPDIFF(YEAR, c2.date_of_birth, CURDATE()) BETWEEN 18 AND 59 THEN 1 ELSE 0 END) AS dup_members_18_59,
  SUM(CASE WHEN TIMESTAMPDIFF(YEAR, c2.date_of_birth, CURDATE()) >= 60 THEN 1 ELSE 0 END) AS dup_members_60_plus,
  SUM(CASE WHEN c2.date_of_birth IS NULL THEN 1 ELSE 0 END) AS dup_members_unknown
FROM visits v
JOIN cases_case hoh ON hoh.id = v.case_id
JOIN cases_case c2 ON c2.household_id = hoh.household_id AND c2.deceased = 0;
FoodLink — events & unique agencies
-- FoodLink events and unique agencies
SELECT
  COUNT(*) AS frh_events,
  COUNT(DISTINCT ee.location_id) AS unique_agencies
FROM events_event ee
JOIN events_eventtype et ON ee.event_type_id = et.id
WHERE et.name = 'FoodLink'
  AND ee.date >= '{{start_date}}' AND ee.date < '{{end_exclusive}}';
Pop-up Pantries + Fresh Start Kitchen events
-- Pop-up + Fresh Start event totals
SELECT
  et.name,
  COUNT(*) AS events
FROM events_event ee
JOIN events_eventtype et ON ee.event_type_id = et.id
WHERE et.name IN ('Pop up Pantry', 'Senior Pop Up', 'Fresh Start/Re-Start Kitchen')
  AND ee.date >= '{{start_date}}' AND ee.date < '{{end_exclusive}}'
GROUP BY et.name
ORDER BY events DESC;
Complete YTD summary — all programs
-- YTD master summary aligned to Oasis assistance report logic
SELECT
  COUNT(*) AS duplicated_household_count,
  COUNT(DISTINCT aa.case_id) AS household_count,
  SUM(COALESCE(ch.case_count, 1)) AS duplicated_member_count,
  ROUND(SUM(CASE WHEN aa.unit_id = 2 THEN aa.amount ELSE 0 END)) AS pounds_distributed,
  ROUND(SUM(CASE WHEN aa.unit_id = 3 THEN aa.amount ELSE 0 END)) AS boxes_bags_distributed
FROM assistance_assistance aa
JOIN assistance_category ac ON ac.id = aa.category_id
JOIN cases_case hoh ON hoh.id = aa.case_id
LEFT JOIN cases_household ch ON ch.id = hoh.household_id
WHERE aa.date >= '{{start_date}}' AND aa.date < '{{end_exclusive}}'
  AND (ac.name LIKE '%Drive Thru%' OR ac.name LIKE '%Drive Through%'
    OR ac.name LIKE '%Door Dash%' OR ac.name LIKE '%DoorDash%'
    OR ac.name LIKE '%Choice Pantry%'
    OR ac.name = 'Mobile Pantry'
    OR ac.name LIKE '%Fresh Start%' OR ac.name LIKE '%Senior Box%');
Monthly Manual Inputs
—
Source: —
InKind lbs—
FSFB lbs—
Milk (cases)—
Eggs (dozens)—
Other food lbs—
Composted lbs—
Upcycled lbs—
Non-food recyclables lbs—
Manual Inputs Tracking & Forecast
Loading tracking data…
Manual Input lbs — YTD by year
Monthly Manual Inputs + 6-Month Forecast
Food Waste vs Net Served
Food Waste — Year over Year
Monthly Impact Report
Prints the live report on this page directly in Chrome, Arc, Safari, and save-to-PDF flows.
IPM Food Pantry
MONTHLY IMPACT REPORT
—
Overview
Total Household Visits
—
Families
—
Unique Households
—
Families
—
Total People Served
—
Individuals
—
Program
—
Total Pounds of
Food Distributed
—
—
Drive-Through
Pantry
—
lbs
The Market
(Choice Pantry)
—
lbs
Mobile
Pantry
—
lbs
FoodLink
(Partner Agencies)
lbs
Demographic
Veterans —
Unhoused —
Non-English —
Non-White —
Unemployed —
HH with
Children
—
Household Composition
Gender (Household Representatives)
Age Group (All Household Members)
Service Map
Households served by county
WARREN CLINTON HIGHLAND HAMILTON CLERMONT BROWN ADAMS
Growth Trends
Monthly Visits · Jan-Dec
— — —
—
Busiest Day of Week
—
Peak Hour
—
Repeat Visitors
Key Ratios
Avg Visits / Family
—
Visits ÷ unique families · YTD
Client Retention
—
Returning ÷ all families · YTD
Pounds / Individual
—
Food lbs ÷ people served · YTD
Est. Cost / Household
—
Estimate · YTD
Unhoused Share
—
Unhoused ÷ unique families · YTD
Visit Timing & Frequency
Most Popular Day of Week
Total check-ins per day across selected period
Click a bar to filter hour chart
Peak Hours
Visit volume by hour of day
Click a bar to filter day chart
Seasonal Trends
Average monthly visit volume by calendar month
Visit Frequency Analytics
How often clients return — households by number of visits
Week-by-Week vs Prior Years
How each week of the selected month performed historically, week by week across years
Year-by-Year
Total household visits per calendar year
Return Analytics
Two complementary retention metrics — different cohorts, both matter
Returning Households (cross-year)
—
of this year's households
Visited this year AND had visited in a prior year. Different from "Repeat Visitors" above — that counts 2+ visits within this year only.
Non-Returners from Last Year
—
households haven't come back
Visited in —, not yet seen in —.
Visitor Behavior
Preferred Week of Month
Which week of the month families tend to visit — useful for staffing
Family Loyalty
How families engage — single program vs multi-program, and same-week regulars
Loading…
Gaps & Churn Signals
Households that paused or lapsed — early warning signals for outreach
Loading…
Forecast Drivers
How behavior patterns shape the 6-month projection
Loading…
Forecasting & Staff Activity
Monthly Visit Trend + 6-Month Forecast
All-time monthly totals with linear trend projection
Agent Activity Heatmap — When Staff is Busiest
Check-in volume by day of week × hour of day
Low
High
Top Staff by Activity
Agents ranked by number of check-ins recorded
Staff Activity by Day of Week
When each top agent is most active
Anomaly & Alerting — Unusual Traffic Spikes / Dips
Months where visit volume was more than 2 standard deviations from the 12-month rolling baseline
Loading…
—
Avg lbs / food visit
—
Avg household size
—
Avg days between visits
Operations · Appointments, Locations & Cohorts
Client Journey Funnel
Attrition from first visit → food → repeat → multi-service
Loading…
Appointment Scheduling Stats
Scheduled vs confirmed, lead time distribution
Location Utilization
Event count and active days per partner location (all time)
Cohort / Retention Analysis
Each row = clients whose first visit was that month. Columns = % still returning in subsequent months (M+1 … M+11). Darker green = better retention.
Loading…
📌
No charts pinned yet. Click the + button on any chart card across the dashboard to pin it here.
Configure your report on the left,
then click Generate Report.
Loading…