Skip to content

SOP-PACK-01: Intelligent Packing Operations v2.0 FINAL

Document ID: SOP-PACK-01-v2.0
Version: 2.0 (Automated System)
Status: ✅ PRODUCTION READY
Owner: Protocol Raw Operations
Review Date: End of Month 3 (after 150-200 deliveries)


Document Purpose

This SOP defines the complete intelligent packing workflow for Protocol Raw frozen dog food. It covers: - Automated PCM calculation based on real weather forecasts - Pack day workflow (Tuesday & Thursday dispatch) - Quality control procedures with automated pass/fail - Geographic delivery controls - Temperature logger feedback loop - 3PL handoff requirements

Basis: Protocol Raw Packaging Specifications v1.2 + Automated Operations Platform


Quick Reference

Pack Day Schedule (Phase A)

Day Action Timing Purpose
Tuesday Calculate PCM 9:00 AM Uses current weather for Wed/Thu delivery
Pack orders 10:00 AM - 4:00 PM Target: <10 mins per box
Dispatch 4:00-6:00 PM DPD collection
Thursday Calculate PCM 9:00 AM Uses current weather for Fri/Sat delivery
Pack orders 10:00 AM - 4:00 PM Target: <10 mins per box
Dispatch 4:00-6:00 PM DPD collection

PCM Requirements (v1.2 Spec)

Box Size Temperature Band PCM Mass PCM Packs Risk Level Logger Required
8kg <20°C 2.0kg 4 STANDARD No
8kg 20-29°C 2.7kg 6 MEDIUM Yes
8kg ≥30°C 3.2kg 7 HIGH Yes
12kg <20°C 3.0kg 6 STANDARD No
12kg 20-29°C 4.1kg 9 MEDIUM Yes
12kg ≥30°C 5.3kg 11 HIGH Yes
16kg <20°C 4.0kg 8 STANDARD Always
16kg 20-29°C 5.5kg 11 MEDIUM Always
16kg ≥30°C 7.1kg 15 HIGH Always

Part 1: System Overview

1.1 Automation Architecture

ORDER PLACED (Shopify)
SOP-INV-01: FEFO Batch Allocation (automatic)
SOP-0X: Export to Fulfillment (automatic)
    order.export_state = 'sent'
TUESDAY/THURSDAY MORNING (9am)
Pack Day Portal: Calculate PCM Button
Edge Function: calculate-pack-day-instructions
    ├─ Gets all exported orders
    ├─ Calls OpenWeatherMap API (real forecast)
    ├─ Determines box size from order_items
    ├─ Calculates PCM requirements
    └─ Creates packing_instructions
View Pack Queue (sorted by risk level)
PACK ORDERS (10am-4pm)
    ├─ Follow packing instructions
    ├─ Record pack times
    └─ Verify weights
QUALITY CHECK (post-pack)
    ├─ Weight variance: ±5% tolerance
    ├─ Pack time: <10 mins (8kg/12kg), <12 mins (16kg)
    └─ Visual inspection
SOP-0Y: Dispatch Confirmation
CUSTOMER DELIVERY (24-48h)
TEMPERATURE LOGGER RECOVERY (10% random + all HIGH risk)
Data Analysis & PCM Optimization

1.2 Core Principles

  1. Weather-Based Calculations: PCM requirements calculated using real OpenWeatherMap API forecasts for next 48h
  2. Phase A Protection: 48h thermal buffer for 24h London transit (100% safety margin)
  3. Automated Quality Control: Weight variance and pack time auto-calculated with pass/fail
  4. Batch Traceability: Every pack linked to batch_id for recall capability
  5. Geographic Controls: Whitelist approach - only London in Phase A, Home Counties in Phase B

1.3 Technology Stack

  • Database: PostgreSQL (Supabase) with raw_ops schema
  • Weather API: OpenWeatherMap (1000 calls/day free tier)
  • Automation: Supabase Edge Functions + Make.com
  • Portal: Simple HTML page (pack-day-portal.html)
  • Analytics: Metabase dashboards (future)

Part 2: Pack Day Workflow

2.1 Pre-Pack Preparation (Day Before)

Checklist: - [ ] Product core temperature ≤-25°C (24h+ hold time verified) - [ ] PCM packs frozen solid ≤-25°C (48h+ conditioning) - [ ] Pack station organized (wool liners, boxes, void fill staged) - [ ] Temperature probes calibrated - [ ] Scales verified (±0.1kg accuracy) - [ ] Weather forecast reviewed (check for >28°C heatwave warnings)

Freezer Requirements: - Product freezer: -25°C or colder, monitored continuously - PCM freezer: Separate, dedicated, -25°C minimum - Squeeze test: No soft spots in PCM packs allowed

2.2 Pack Morning Procedure (9:00 AM)

Step 1: Open Pack Day Portal

Location: pack-day-portal.html (bookmark this)

Step 2: Calculate PCM Requirements

  1. Click "🧊 Calculate PCM for Today's Packs" button
  2. System executes:
  3. Fetches all orders with export_state = 'sent'
  4. Filters out orders that already have packing instructions
  5. Calls OpenWeatherMap API for each postcode
  6. Determines max temperature over next 48 hours
  7. Calculates PCM requirements per v1.2 spec
  8. Creates packing instructions in database
  9. Portal displays results:
  10. Total orders processed
  11. Success/failure count
  12. Risk level breakdown
  13. Any errors requiring attention

Expected Results:

✅ Success!
Processed 23 orders
23 successful, 0 failed

Results:
#1234 - 6 packs - STANDARD
#1235 - 9 packs - MEDIUM
#1236 - 11 packs - HIGH
...

Step 3: View Pack Queue

Query pack queue (via SQL or future Metabase tile):

SELECT 
  order_number_label,
  customer_name,
  delivery_postcode,
  box_size,
  pcm_packs_count,
  risk_level,
  ambient_forecast_max,
  logger_required,
  special_notes
FROM raw_ops.v_pack_queue_with_batch
ORDER BY 
  CASE risk_level 
    WHEN 'HIGH' THEN 1 
    WHEN 'MEDIUM' THEN 2 
    WHEN 'STANDARD' THEN 3 
  END,
  exported_at ASC;

Pack Order Priority: 1. HIGH risk first (logger required, extra PCM) 2. MEDIUM risk second 3. STANDARD risk last

2.3 Packing Procedure (10:00 AM - 4:00 PM)

For Each Order:

A. Pre-Pack Setup - [ ] Start pack timer - [ ] Verify batch_id lab cert PASS (Salmonella/Listeria ABSENT) - [ ] Product at ≤-25°C (probe check OR freezer log) - [ ] PCM packs frozen solid (squeeze test) - [ ] Correct box size for order (8kg/12kg/16kg) - [ ] Wool liner clean, intact, no tears

B. Pack Sequence

Base Layer:

8kg:  1 PCM pack flat on bottom
12kg: 1-2 PCM packs flat on bottom (season dependent)
16kg: 2 PCM packs flat on bottom

Product Layer: - Remove product from freezer - Stack tightly in brick configuration: - 8kg: 2×2×4 (16× 500g pouches) - 12kg: 3×2×4 (24× 500g pouches) - 16kg: 4×2×4 (32× 500g pouches) - Minimize air gaps - Work quickly: Target <3 mins from freezer to box

Top/Side PCM Layer:

COOL (<20°C):
  8kg: 3 packs on top
  12kg: 4-5 packs on top/sides
  16kg: 6 packs on top/sides

STANDARD (20-29°C):
  8kg: 5 packs on top
  12kg: 7-8 packs on top/sides
  16kg: 9 packs on top/sides

HOT (≥30°C):
  8kg: 6 packs on top
  12kg: 9-10 packs on top/sides
  16kg: 13 packs on top/sides

Void Fill: - Kraft paper void fill in ALL empty spaces - No air gaps allowed - Critical for hot weather (HOT season)

Temperature Logger (if required): - Insert between center two product bricks - Must be surrounded by product (not touching liner) - Activate logger immediately before sealing - Record logger_id → order_id mapping

Seal: - Close wool liner completely (no gaps) - H-tape box (all seams reinforced) - PERISHABLE stickers (top and side) - Shipping label correct

C. Post-Pack Verification - [ ] Stop pack timer (must be <10 mins for 8kg/12kg, <12 mins for 16kg) - [ ] Weigh box - [ ] Record weight and pack time

Expected Weights (COOL season):

8kg box:  11.8kg ± 0.6kg (±5% tolerance)
12kg box: 17.4kg ± 0.9kg (±5% tolerance)
16kg box: 23.0kg ± 1.2kg (±5% tolerance)

Weight Variance Alerts: - Under-weight (>5% low): STOP - Reopen and verify PCM count - Over-weight (>5% high): Review void fill usage, optimize

2.4 Quality Check Recording

Via SQL or Future Ops Portal:

SELECT raw_ops.record_pack_quality_check(
  p_order_id := '[order_id]',
  p_actual_weight_kg := 17.2,  -- From scale
  p_pack_started_at := '2025-11-13 10:15:00+00',
  p_pack_completed_at := '2025-11-13 10:23:00+00',  -- 8 mins
  p_logger_activated := false,  -- true if logger inserted
  p_void_fill_complete := true,
  p_visual_check_pass := true,
  p_packed_by := 'Anton',
  p_notes := NULL  -- Optional notes
);

System Auto-Calculates: - Expected weight (from v1.2 BOM) - Weight variance (kg and %) - Pack time (seconds) - Pass/fail status

Quality Check Results:

✅ PASS: Weight within ±5%, pack time <10 mins, visual check passed
❌ FAIL: Any check fails → investigate before dispatch

View Quality Check:

SELECT * FROM raw_ops.v_pack_quality_with_checks
WHERE order_id = '[order_id]';

2.5 Dispatch (4:00-6:00 PM)

Final Checks: - [ ] All orders packed and quality checked - [ ] All quality checks PASS (no failures) - [ ] Batch_id recorded to order mapping - [ ] Logger mappings recorded (if applicable) - [ ] Dispatch time logged (must reach courier within 2h of pack completion)

DPD Collection: - Collection window: 4:00-6:00 PM - All boxes staged for pickup - Collection receipt confirmed

Via SOP-0Y: - Update export_state = 'acked' in database - Record acked_at timestamp - Generate customer notifications


Part 3: Geographic Delivery Controls

3.1 Allowed Delivery Areas (Phase A)

ALLOWED: London Only

EC - Central London (EC)
WC - Central London (WC)
E  - East London
N  - North London
NW - North West London
SE - South East London
SW - South West London
W  - West London

Transit Time: 24h next-day delivery (48h thermal protection = 100% buffer)

3.2 Blocked Areas

Permanently Blocked (>72h transit or impossible for frozen):

IV  - Scottish Highlands (Inverness)
KW  - Scottish Highlands (Caithness)
PA  - Scottish Highlands (Argyll)
PH  - Scottish Highlands (Perth)
AB  - Scottish Highlands (Aberdeen)
BT  - Northern Ireland
HS  - Outer Hebrides
ZE  - Shetland Islands
KA27/KA28 - Isle of Arran/Cumbrae

Customer Message: "We're unable to deliver frozen food to [area] while maintaining our quality standards. We'll notify you when this changes."

Phase A/B Blocked (Not Yet Enabled): - All of UK outside London - Home Counties (enabled in Phase B Month 7+)

Customer Message: "We're not delivering to your area yet. Join our waitlist to be notified when we expand to your postcode."

3.3 Checkout Validation

API Endpoint:

SELECT raw_ops.validate_postcode_for_delivery('[postcode]');

Example Results:

// London (allowed)
{
  "allowed": true,
  "policy": "STANDARD",
  "transit_hours": 24,
  "region_name": "South West London",
  "phase": "A",
  "message": null
}

// Manchester (blocked - not in Phase A/B area)
{
  "allowed": false,
  "policy": "BLOCK",
  "transit_hours": null,
  "region_name": "Outside current delivery area",
  "message": "We're not delivering to your area yet. Join our waitlist to be notified when we expand to your postcode."
}

// Highlands (permanently blocked)
{
  "allowed": false,
  "policy": "BLOCK",
  "transit_hours": 96,
  "region_name": "Scottish Highlands - Inverness",
  "message": "We're unable to deliver frozen food to Highland postcodes while maintaining our quality standards."
}

Shopify Integration: - Call validation API on postcode entry - Display message if blocked - Prevent checkout completion if allowed: false

3.4 Phase B Expansion (Month 7+)

Enable Home Counties Gradually:

-- Example: Enable Surrey first (Month 7)
UPDATE raw_ops.allowed_delivery_areas
SET is_active = true,
    enabled_from_date = CURRENT_DATE
WHERE phase = 'B'
  AND postcode_prefix IN ('GU', 'KT', 'RH', 'SM');

-- Month 8: Add Hertfordshire
UPDATE raw_ops.allowed_delivery_areas
SET is_active = true,
    enabled_from_date = CURRENT_DATE
WHERE phase = 'B'
  AND postcode_prefix IN ('AL', 'WD', 'HP', 'SG');

Validation: Test with new postcodes before enabling


Part 4: Temperature Logger Protocol

4.1 When Logger Required

Mandatory (Phase A): - ALL 16kg boxes (high value, longer pack time) - ALL HOT season orders (≥30°C forecast) - 10% random sampling (systematic: every 10th order) - Any customer escalation or complaint history - New postcode areas (first delivery to zone)

Target: Minimum 10% of all deliveries

4.2 Logger Placement

Standard Procedure: 1. Position between center two bricks of product stack 2. Surround with product on all sides (not touching liner) 3. Activate immediately before sealing box 4. Record logger_id → order_id → batch_id mapping 5. Include prepaid return envelope with delivery note

Logger ID Format: TL-XXXX (e.g., TL-0234)

4.3 Pass/Fail Thresholds (v1.2 Spec)

Upon Customer Receipt:

Outcome Core Temp at Receipt Visual Check Action
IDEAL PASS ≤-12°C Ice crystals visible, fully frozen solid Log success
ACCEPTABLE PASS -5°C to -12°C Ice crystals present, firm throughout Log success with note
FAIL >-5°C Pliable, soft spots, or fully thawed Immediate refund + root cause analysis

4.4 Logger Data Ingestion

When Logger Recovered:

-- Parse logger CSV/JSON and insert
SELECT raw_ops.insert_logger_data(
  p_order_id := '[order_id]',
  p_logger_id := 'TL-0234',
  p_readings := '[
    {"timestamp":"2025-11-13T10:00:00Z","temp_c":-15.2,"humidity_pct":65},
    {"timestamp":"2025-11-13T11:00:00Z","temp_c":-14.8,"humidity_pct":67},
    {"timestamp":"2025-11-13T12:00:00Z","temp_c":-13.5,"humidity_pct":70},
    ...
  ]'::jsonb,
  p_trip_start_at := '2025-11-13 10:00:00+00',
  p_trip_end_at := '2025-11-14 09:30:00+00'
);

System Auto-Calculates: - Min/max/avg temperature - Temperature at delivery (last reading) - Outcome classification (IDEAL_PASS/ACCEPTABLE_PASS/FAIL) - Cold chain integrity status - Breach detection and details

View Logger Results:

SELECT 
  logger_id,
  order_id,
  outcome,
  temp_at_delivery_c,
  min_temp_c,
  max_temp_c,
  trip_duration_hours,
  cold_chain_intact
FROM raw_ops.temperature_logger_data
ORDER BY data_uploaded_at DESC;

4.5 Failure Response Protocol

Within 4 Hours of Failure Notification:

  1. Customer Action:
  2. Apologize immediately
  3. Full refund OR free replacement (customer choice)
  4. No questions asked

  5. Retrieve Logger Data (if available)

  6. Document Conditions:

  7. Weather actual vs forecast
  8. Pack time recorded
  9. Courier tracking events
  10. Customer receipt timestamp
  11. Weight verification data

  12. Categorize Root Cause:

Root Cause Action
Weather spike API underestimated → Add +0.5kg PCM buffer
Pack error Incorrect PCM count → Retrain + add weight verification
Courier delay Missed SLA → Escalate with DPD account manager
Product temp Freezer not cold enough → Recalibrate or replace
Unknown Insufficient data → Add logger to next 20 orders in same zone
  1. Adjustment Protocol:
  2. 2+ failures same week, same cause: Increase PCM spec by 0.5kg immediately
  3. 5+ failures same month: PAUSE new orders, run stress test, update recipes
  4. Failure rate >5% sustained: Trigger Month 3 CPD Stop-Rule review

Part 5: 3PL Transition Requirements (Phase B Entry)

5.1 Operational Handover (Month 6-7)

Documentation Deliverables: - [ ] This SOP-PACK-01 document (operational procedures) - [ ] Packing recipes with photos (each season, each box size) - [ ] Weather API integration documentation - [ ] QC checklist templates (laminated for pack station) - [ ] Temperature logger handling protocol - [ ] Failure mode response playbook - [ ] Supplier contact list with MOQs and lead times - [ ] Cost tracking methodology (BOM by season/box)

Physical Infrastructure: - [ ] Freezer capacity: -25°C or colder (with backup) - [ ] Segregated PCM storage (dedicated freezer) - [ ] Calibrated scales (±0.1kg accuracy, certified) - [ ] Temperature probes (digital, calibrated) - [ ] Pack station setup (photos + layout diagram) - [ ] Materials storage (organized by season/box size) - [ ] Quality control station (separate from pack area)

5.2 3PL Data Requirements

Per Shipment (via API/CSV):

order_id,packaging_type,coolant_units_used,dispatch_temp_recorded,pack_time_seconds,actual_weight_kg,weather_forecast_temp,logger_id,pack_station_operator
uuid,Wool_12kg_STANDARD,9,-24.5,485,17.2,18.3,TL-0234,Operator-A

Required Fields: - packaging_type: "Wool_8kg_COOL" / "Wool_12kg_STANDARD" / etc - coolant_units_used: Integer count of 0.5kg PCM packs - dispatch_temp_recorded: Product core temp at dispatch (°C) - pack_time_seconds: Time from freezer removal to box seal - actual_weight_kg: Final package weight - weather_forecast_temp: Max temp used for recipe selection - logger_id: If temperature logger inserted (or NULL) - pack_station_operator: Operator ID for quality tracking

5.3 3PL Operational SLAs

Metric Target Alert Threshold Penalty
FEFO Rotation 100% compliance Any violation £50/incident
Pack Time <10 mins (12kg) >12 mins sustained Review + retraining
Weight Variance <5% outside tolerance >10% failure rate £25/failure
Frozen Success ≥95% <90% in any week £5/failed delivery
Dispatch SLA Within 2hrs of pack >4hrs Courier cost + £20
Daily Reporting By 6pm same day Missed report £100/day
Exception Alerts <2hrs >4hrs response £50/incident

5.4 Expected 3PL Cost Impact

Phase B CPD Structure:

BOM (materials):         £8.83-11.51 (season dependent, 12kg)
3PL Pick/Pack Fee:       £2.50-3.50 (vs imputed £2.25)
Cold Storage:            £0.50-1.00 per box-month
WMS Integration:         £0.20-0.30 per transaction
──────────────────────────────────────────────────────
Total Normalized CPD:    £22-27 (vs Phase A £21-23)
Net Phase B Impact:      +£0.50-1.50 per box initially

Optimization Target: Return to £19-21 by Month 12 through: - 3PL volume discounts - Negotiated courier rates (£10.30 target) - Material bulk pricing - Process efficiency gains


Part 6: Performance Monitoring

6.1 Daily KPIs

Pack Day Metrics:

-- Daily pack summary
SELECT 
  DATE(packed_at) as pack_date,
  COUNT(*) as total_packs,
  AVG(pack_time_seconds) as avg_pack_time_sec,
  COUNT(*) FILTER (WHERE overall_pass = true) as qc_pass_count,
  COUNT(*) FILTER (WHERE overall_pass = false) as qc_fail_count,
  ROUND(AVG(weight_variance_pct), 2) as avg_weight_variance_pct
FROM raw_ops.v_pack_quality_with_checks
WHERE DATE(packed_at) = CURRENT_DATE
GROUP BY DATE(packed_at);

Target Metrics: - Pack time: <9 mins average (12kg) - QC pass rate: ≥95% - Weight variance: <2% average

6.2 Weekly KPIs

PCM Usage by Season:

SELECT 
  box_size,
  risk_level,
  COUNT(*) as order_count,
  AVG(pcm_packs_count) as avg_pcm_packs,
  AVG(ambient_forecast_max) as avg_forecast_temp
FROM raw_ops.packing_instructions
WHERE created_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY box_size, risk_level
ORDER BY box_size, risk_level;

Logger Success Rate:

SELECT 
  outcome,
  COUNT(*) as count,
  ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) as percentage
FROM raw_ops.temperature_logger_data
WHERE trip_end_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY outcome;

Target: ≥95% IDEAL_PASS + ACCEPTABLE_PASS combined

6.3 Monthly KPIs

Cost Per Delivery (CPD) Tracking:

-- Blended CPD by season mix
SELECT 
  DATE_TRUNC('month', created_at) as month,
  box_size,
  risk_level,
  COUNT(*) as order_count,
  AVG(pcm_mass_kg) as avg_pcm_kg,
  AVG(pcm_mass_kg * 1.26) as avg_pcm_cost_gbp  -- £1.26/kg
FROM raw_ops.packing_instructions
GROUP BY DATE_TRUNC('month', created_at), box_size, risk_level
ORDER BY month DESC, box_size;

Target CPD (12kg): - Phase A Month 1-2: £20-21 cash - Phase A Month 4-6: £19-20 cash (with courier negotiation) - Phase B: £22-24 cash initially, optimize to £19-21 by Month 12


Part 7: Troubleshooting & Exception Handling

7.1 Weather API Failure

Symptoms: Edge Function returns error, no packing instructions created

Fallback Procedure: 1. Check OpenWeatherMap API status 2. If API down, use manual Met Office forecast 3. Conservative assumption: Use STANDARD (20-29°C) band for safety 4. Document manual override in notes field

Prevention: - Monitor API quota (1000 calls/day) - Set up Make.com alert if API fails

7.2 Heatwave Protocol (≥28°C for 3+ Days)

Trigger: Met Office forecast shows 3+ consecutive days ≥28°C

Actions: 1. Switch ALL orders to HOT spec (≥30°C) regardless of actual forecast 2. Pause new orders if heatwave continues >5 days 3. Email customers: "Delivery paused during heatwave for frozen integrity" 4. Resume when forecast <25°C for 2+ days

Customer Communication:

Subject: Temporary Delivery Pause - Heatwave Protection

We've paused deliveries this week due to extreme temperatures.
Your frozen food will be dispatched next [Tuesday/Thursday] when 
conditions return to safe levels.

This pause ensures your food arrives frozen solid, maintaining 
our quality standards.

Your delivery date has been automatically updated.

7.3 16kg Hot Weather Orders

Risk Assessment: 16kg box + ≥30°C = HIGH RISK

Options for Customer: 1. Split into 2× 8kg boxes (recommended) - Dispatch 48h apart - Each box uses 8kg HOT spec (7 PCM packs) - Lower risk, better frozen integrity - Customer message: "Split delivery for optimal frozen quality"

  1. Wait for cooler weather (<30°C)
  2. Hold order until forecast drops
  3. Customer notified of delay

  4. Proceed with extra protection

  5. Use 15 PCM packs (maximum)
  6. Mandatory logger
  7. Customer notification of elevated risk
  8. Refund guarantee if thaws

7.4 Pack Time Exceeds Target

If Pack Time >12 Minutes:

Immediate Actions: 1. Product has been at room temp too long 2. Check product core temp with probe 3. If >-20°C, return to freezer for 30 mins minimum 4. Re-pack with fresh PCM packs 5. Document incident

Root Cause Analysis: - Interruptions during pack? (eliminate distractions) - Pack station disorganized? (improve staging) - Unfamiliar with order? (review pack queue before starting) - Need additional training?

Prevention: - Stage all materials before removing product from freezer - No interruptions policy during pack sequence - Pack similar box sizes together (muscle memory)

7.5 Weight Variance >±5%

Under-Weight (>5% Low):

Critical - Do Not Dispatch: 1. Reopen box immediately 2. Verify PCM pack count against instruction 3. If PCM missing, add correct amount 4. If product missing, verify order items vs packed items 5. Re-seal and re-weigh 6. Document discrepancy

Over-Weight (>5% High):

Review But May Dispatch: 1. Excess void fill? (optimize kraft paper usage) 2. Extra PCM packs? (verify against instruction) 3. Wet PCM packs? (condensation = bad freeze, replace) 4. If >10% over, reopen and optimize


Part 8: Seasonal Adaptations

8.1 Phase A Seasonal Profile (March-June Launch)

Month Typical Max Temp Expected Recipe % of Volume Cash CPD (12kg)
March 10-14°C COOL 100% £19.13-20.69
April 13-17°C COOL 90% / STANDARD 10% Mixed £19.30-20.85
May 16-20°C COOL 60% / STANDARD 40% Mixed £19.60-21.15
June 19-23°C STANDARD 70% / HOT 5% Mixed £20.15-21.70

Strategy: - Launch in March (100% COOL = lowest CPD) - Build operational confidence before STANDARD season - Validate HOT protocol in June (small volume, controlled) - Seed raise timing: End of May (proven across COOL/STANDARD)

8.2 Future National Seasonal Profile (Phase C)

Months Typical Max Temp Recommended Spec % of Annual Volume
Dec-Feb 5-12°C COOL 25%
Mar-May 10-18°C COOL 30%
Jun-Aug 18-25°C STANDARD 25%
Sep-Nov 12-18°C COOL 20%

Heatwave Exceptions: ~5% of year (3+ days ≥28°C)


Part 9: Version History & Change Log

v2.0 (2025-11-13) - Automated System

Major Changes: - ✅ Real-time weather API integration (OpenWeatherMap) - ✅ Automated PCM calculation (no manual input) - ✅ Pack-day batch processing (Tuesday/Thursday workflow) - ✅ Geographic delivery controls (whitelist + blacklist) - ✅ Quality control automation (weight variance, pack time, pass/fail) - ✅ Temperature logger feedback loop - ✅ Batch traceability for recalls - ✅ 3PL handoff requirements - ✅ v1.2 packaging spec compliance

Breaking Changes from v1.0: - Replaced manual weather input with automated API - Changed from "export triggers instruction" to "pack day triggers instruction" - Added geographic blocking (Phase A London only) - Updated PCM values to match v1.2 spec exactly

v1.0 (2024-11-12) - Manual System

  • Initial manual packing procedures
  • Static PCM recipes
  • No automation
  • Manual weather checks

Part 10: Quick Start Checklist

First Pack Day (Pre-Launch Validation)

Week Before: - [ ] Run OpenWeatherMap API test (verify 1000 call quota) - [ ] Bookmark pack-day-portal.html - [ ] Print QC checklists (laminate for pack station) - [ ] Calibrate scales and temperature probes - [ ] Test weight variance calculations with dummy boxes - [ ] Verify freezer temperatures (-25°C minimum) - [ ] Condition PCM packs (48h at -25°C) - [ ] Stage materials (boxes, liners, void fill, tape)

Pack Day Morning: - [ ] Verify product at -25°C (24h+ hold) - [ ] PCM packs frozen solid (squeeze test) - [ ] Open pack-day-portal.html - [ ] Click "Calculate PCM for Today's Packs" - [ ] Review pack queue (print if needed) - [ ] Stage materials for first order

Per Order: - [ ] Start timer - [ ] Verify batch cert PASS - [ ] Follow packing sequence (base → product → top PCM → void fill) - [ ] Insert logger if required - [ ] Seal and label - [ ] Stop timer - [ ] Weigh - [ ] Record quality check - [ ] Verify PASS before moving to next order

End of Pack Day: - [ ] All quality checks PASS - [ ] All weights within ±5% - [ ] All pack times <10 mins (or <12 for 16kg) - [ ] Logger mappings recorded - [ ] DPD collection confirmed - [ ] Update dispatch status (SOP-0Y)


Appendix A: Database Schema Reference

Key Tables

packing_instructions - Stores PCM requirements per order - Linked to batch_id for traceability - Created by Edge Function on pack day

pack_quality_checks - Records actual vs expected metrics - Auto-calculates pass/fail - Links to packing_instructions

temperature_logger_data - Stores post-delivery temperature readings - Auto-classifies outcome (IDEAL_PASS/ACCEPTABLE_PASS/FAIL) - Enables PCM optimization

high_risk_postcodes - Postcodes requiring >72h transit (permanently blocked) - Used for checkout validation

allowed_delivery_areas - Whitelist of deliverable postcodes (Phase A/B/C) - Enables gradual geographic expansion

Key Functions

calculate_pcm_requirements(box_size, temp, transit_hours) - Returns PCM mass, pack count, risk level, logger requirement - Implements v1.2 spec decision matrix

validate_postcode_for_delivery(postcode) - Returns {allowed, policy, transit_hours, message} - Used at checkout to block bad postcodes

record_pack_quality_check(...) - Inserts quality check with auto-calculations - Uses v1.2 BOM weights

insert_logger_data(...) - Parses logger readings JSON - Auto-classifies outcome per v1.2 thresholds

Key Views

v_pack_queue - Shows orders ready to pack with instructions - Sorted by risk level (HIGH first)

v_pack_queue_with_batch - Pack queue with batch traceability - Shows batch_code and expiry_date

v_pack_quality_with_checks - Quality checks with pass/fail calculations


Appendix B: Emergency Contacts

Supplier Escalation: - Woolcool (insulation): [contact info] - Hydropac (PCM): [contact info] - Box supplier: [contact info]

Courier Escalation: - DPD account manager: [contact info] - DPD customer service: [phone]

Technical Support: - Supabase status: https://status.supabase.com - OpenWeatherMap status: https://status.openweathermap.org


Document Approval

Prepared by: Protocol Raw Operations Team
Reviewed by: Pending
Approved by: Pending
Effective Date: 2026-03-01 (Phase A Launch)

Next Review: End of Month 3 (after 150-200 deliveries)


Summary: What You Now Have

Automated intelligent packing system - Weather API + PCM calculation
Pack-day workflow - Tuesday/Thursday batch processing
Quality control - Automated pass/fail with v1.2 BOM weights
Geographic controls - London Phase A, blocked Highlands/NI/Islands
Temperature feedback loop - Logger data ingestion and optimization
Batch traceability - Full recall capability
3PL handoff ready - Complete documentation and SLAs
v1.2 spec compliant - Exact PCM values from packaging spec

Your system is production-ready for Phase A launch. 🚀


End of SOP-PACK-01 v2.0 FINAL