Jose Perez Terrones

I build the models behind what ships, where, and when.

Inventory and replenishment analyst in Los Angeles. I plan inventory for a home decor vendor stocked on consignment across a national retailer's 20,000+ stores. We own the stock until it sells, so every extra week in a DC is our cash, and every empty shelf is a lost sale.

Work

01 · DC inventory

Stock in a DC sells nothing.

Problem
The DCs held about 90 days of supply. Vendor shipments go out monthly and take about a month to arrive, so a mistake takes two months to correct. The drawdown had to be steered, not switched off.
Finding
Chasing each month's shortfall double-counts stock already on its way, so I planned backward from each month-end target. To pull DC days of supply down without starving stores, I pushed extra case packs out to stores, emptiest shelves first.
Result
90 → 45 days of supply between August and October 2026, while still shipping [X units] into the DCs. Store in-stock held at [X%]. I accepted short weeks at the slowest DC rather than hold the whole network high.

Try this: Find the push that lands this DC at 45 days of supply.

Case pack

Position = units on the shelf; Position 3 means 3+. I assume a shelf max of 6 units and use 3 as the starting position for the 3+ groups. Filled dots receive a case; amber dots exceed that assumed max.

Show the allocation steps
    How I built it

    A binary search finds the shelf fill level that spends the target exactly, kept inside minimum and maximum units-per-slot bands. The macro then simulates store and distribution center inventory forward for 1 to 12 months, rounding every shipment to whole case packs.

    When supply for a slot is capped, it rations across distribution centers by one of four rules: rank-and-fill or weighted split, scored on unit shortfall or percent of target. A compare mode runs all four side by side. Output includes shipment pivots, a tab tracing how a month-one shortage carries forward, and progress charts by slot status.

    The push allocator ranks stores by units on the shelf, emptiest first; among stores with 3+ units, the fastest tier goes first. Demo data is synthetic.

    02 · Store shelves

    The order never sees four days of sales.

    Problem
    Store slots kept landing below their target level.
    Finding
    The inventory snapshot is cut Wednesday, the order goes in Thursday, the DC ships Sunday, and it lands the following Saturday. Thursday-to-Sunday sales never make it into the order, so every cycle starts short, and fast sellers fall shortest.
    Result
    I moved fast-selling slots with small case packs to double case packs so they ride out the gap.

    Try this: Pick Fast seller, then switch to a double case pack.

    Wed snapshot → Thu order → Sun ship
    sales the order can't see
    → Sat lands

    One store shelf, 26 weeks

    The shelf orders a case when stock falls to the reorder point. The case lands about 10 days later. Change the rules and watch the shelf.

    Step chart of units on the shelf by day over 26 weeks, with the reorder point marked and empty-shelf days marked in red along the bottom.
    Reorder point (units)
    Case pack
    Sales pace
    Days in stock
    87%
    Average on shelf
    2.7 units
    Sales lost to empty shelf
    3 units
    Cases shipped
    4
    At or below the reorder point. Days the shelf sat empty. Demand is simulated for illustration; the weekly order cut and 10-day delivery lag mirror the replenishment cycle I work with.

    Days in stock = the percentage of the 182 simulated days that end with at least one unit on the shelf, after receipts and sales.

    How I built it

    HTML and JavaScript, simulated demand. The weekly order cut and 10-day delivery lag mirror the replenishment cycle I work with.

    03 · Demand signal

    One bad month can throw off a whole year's plan.

    Problem
    Demand history across 12,000+ SKUs had one-off spikes and stockout months mixed in. Plan off the raw average and you ship to a pace that isn't real.
    Finding
    Single outlier tests disagree, and each one throws out real demand on some patterns. I run four (Tukey IQR, z-score, MAD, spike) and exclude a month only when two agree.
    Result
    A cleaner demand signal for 12,000+ SKUs across 42,000+ records, and 7,000+ SKUs sorted into velocity tiers. It ships with a 130,000-formula Excel audit workbook, so anyone can check the math without reading Python.

    Try this: Drag any month up. Then load Recurring peaks and flip to Any single test.

    Focus a bar and use arrow keys to change one unit; hold Shift for ten. × marks excluded months. Threshold labels show the current upper bounds.

    How I built it

    Tukey IQR: x < Q1 − 1.5 × IQR or x > Q3 + 1.5 × IQR. Z-score: |x − mean| / population standard deviation > 2.0. MAD: |x − median| > 2.5 × MAD. Spike: x > 3.0 × median. I exclude a month when at least two tests flag it.

    This demo simply drops flagged months. In production, weeks lost to stockouts are rebuilt from peer DC multipliers, so an empty shelf doesn't read as low demand. Velocity tiers come from k-means clustering, with the elbow method choosing the count. Python (pandas, NumPy, SciPy, scikit-learn) in Colab.

    Builds

    Picklist automationA Colab workflow that checks unshipped web orders against stock in two warehouses and outputs the picklists. 30–45 minutes down to 10–15.

    Store performance mapOne self-contained HTML file that filters 21,000+ stores and shows where top performers cluster.

    Report deliverySaved 1010data query recipes, run by a Python script through the API; daily and weekly reports arrive by email. [hours saved per week]

    Case-pack allocation scripts830,000+ units allocated across DCs in case packs, validated with zero unmet demand.

    Smaller builds

    • Shipment planning that cut the number of LTL shipments.
    • Batch SKU overlays on product PDFs from a CSV mapping.
    • EDI 855 converter for purchase order acknowledgments.
    • Rewrote nested SUMIF and VLOOKUP logic in a 50,000-row workbook as array lookups, about 2.5 billion fewer comparisons per run.

    Tools

    What I use, and what I use it for.

    Python
    pandas, NumPy, SciPy and scikit-learn for forecasting, outlier detection, allocation and clustering, packaged in Colab for teammates who don't code.
    Excel and VBA
    Planning models, live-formula audit workbooks and multi-tab report suites.
    1010data
    Store and slot level joins across inventory, sales, receipts and the 4-5-4 fiscal calendar, plus scripted report delivery through the API.
    HTML and JavaScript
    Standalone dashboards and tools that open in any browser, including the shelf simulator on this page.
    n8n
    Two demo builds: a Telegram bot that reads receipts into Google Sheets, and a replenishment workflow.

    About

    • Los Angeles
    • Inventory and replenishment since 2023
    • B.S. Business Administration, Information Systems, Cal State Long Beach
    • English and Spanish

    I started on a warehouse floor, picking and sorting, so I know what a bad allocation looks like from the receiving end.

    I ask why a process works the way it does before I build a better version of it. Most of the work on this page started that way: a number that didn't add up, followed until it did.

    Hiring for inventory or replenishment? Email me.

    Email Jose Request my resume