How it works
From spreadsheet to optimized schedules in three steps.
Gather
Fill the Excel template with your history.
Upload & set
Upload, pick a forecast method — or bring your own — and set your goals.
Review & download
Visualize results, fine-tune schedules, download everything.
Have your own forecast already? Use the BYOF template and we'll staff and schedule it.
Input format in detail
The input file
Foresight expects a single Build Data workbook (.xlsx) with exactly these tabs and column names. The validator checks your upload before a run starts and returns plain-English fix lists.
historic-daily
Columns: date, volume, x1
Weekly history for forecasting. Minimum ~67 complete Sun–Sat weeks; ~130 weeks recommended for seasonal models.
interval-volume
Columns: date + 48 half-hour columns (00:00 … 23:30)
Intraday volume pattern. Needs at least 52 complete weeks in the design window.
interval-aht
Columns: date + 48 half-hour columns
Average handle time by interval. Minimum ~6 complete weeks.
forecast-daily
Columns: date, x1
Future dates to forecast. Must be continuous, unique, and sorted.
inputs
Columns: date, % auxilary time, % absence, % efficiency, % proficiency, sla-%, sla-wait time (s), effective chat concurrency, non-live channel?, hitl % auto, hitl % semi auto, closure
One row per forecast date. Percent columns as fractions 0–1; flag columns 0 or 1.
hoop
Columns: days_of_the_week, hoop_begin, hoop_end
Hours of operation per weekday (sun–sat). Times as Excel time values.
schedule change
Columns: schedule change (weeks)
Required. One cell: a positive whole number of weeks between schedule revisions (1, 2, 4, …). Blank, zero, negative, or decimal values fail validation.
Date columns must be real Excel dates (not text), unique, sorted, and gap-free within each tab. Interval tabs must use 48 half-hour headers from 00:00 through 23:30.
Bring-your-own-forecast (BYOF) file
Already have an interval-level forecast? Use a smaller BYOF workbook instead of full Build Data. Foresight skips forecasting and goes straight to staffing and schedule optimization. The upload validator checks these tabs the same way the engine does (validate_byof_data).
interval-forecast
Columns: date, day, forecasted_daily_volume + 48 half-hour columns (00:00 … 23:30)
Your interval-level volume forecast. Continuous dates spanning at least one full Sunday–Saturday week. Interval cells must be numeric. Do not include event or DST columns — if present (e.g. copied from a report appendix), they are ignored.
aht-pattern
Columns: day + 48 half-hour columns (same headers as interval-forecast)
Weekly AHT pattern in seconds. Exactly one row per weekday (sun…sat).
inputs
Columns: date, % auxilary time, % absence, % efficiency, % proficiency, sla-%, sla-wait time (s), effective chat concurrency, non-live channel?, hitl % auto, hitl % semi auto, closure
Identical to Build Data. One row per horizon date — dates must match interval-forecast exactly.
hoop
Columns: days_of_the_week, hoop_begin, hoop_end
Identical to Build Data. Required so scheduling can read hours of operation.
schedule change
Columns: schedule change (weeks)
Identical to Build Data — positive whole number of weeks.
Tip: download the BYOF template tile above (or from the new-run wizard), replace the example rows, and upload. After a full run you can also build a filled sample from that report's appendix tabs plus your Build Data inputs / hoop / schedule change using scripts/make_byof_sample.py.
Run settings explained (forecast methods, C2/P0/P1, locale)
Run settings
Forecast method
Used only for full Build Data runs. BYOF mode hides this choice — your uploaded forecast is used as-is.
- Auto (recommended): runs all models in both families; lowest MAPE wins.
- Contact rate: force the contact-rate family's best model.
- Volume: force the volume family's best model.
Guardrails (advanced)
- C2 (1.05–1.30 default): hard band on total staffed vs needed — the optimizer must stay inside.
- P0 (-15% / +50% default): signed coverage band — lower is usually negative (e.g. -15 means an interval may fall to 85% of need) before it counts as a violation.
- P1 (-10% / +10% default): tighter signed band the optimizer tries to keep at least 90% of intervals inside. Widen if schedules look over-constrained.
Locale — holidays & DST
Pick the country whose public holidays should shape the calendar. Holiday adjustments are learned from your historical volume — use history from the same country. DST transition weeks are derived automatically from a representative timezone for that country.
Understanding your results
Reading your results
Summary of Inputs
Date ranges, HOOP, and operating assumptions.
Model Selection
Every candidate model, MAPE, and the winner.
Forecasted Staffing
Weekly volume and FTE agents required.
Shifts & Schedules
Editable shift grid and optimized start counts.
Model Metrics
C2/P0/P1 pass badges and coverage ratios.
Appendix
Interval forecast, AHT, needs, and comparison grids.
The Fine-tune tab in the app lets you adjust shift-start counts and see coverage update live. Changes are what-if only — download the report for the official optimized schedule. BYOF runs show a slim Your forecast tab (no model tournament or volatility card) and the Excel report omits Summary of Inputs / Model Selection.
FAQ
- How long does a run take?
- Typically 20–40 minutes depending on data size. BYOF runs skip forecasting and are usually faster. You can close the run page and check back later; when email notifications are enabled, we also notify you when it finishes.
- What is bring-your-own-forecast (BYOF)?
- If you already have an interval-level volume forecast and AHT pattern, upload a BYOF workbook instead of full Build Data. Foresight staffs and schedules from your forecast without running the model tournament.
- What happens to my data?
- You can keep multiple completed runs and start up to a few at once. Uploaded files and outputs auto-delete after 30 days; signing out clears all of your runs.
- What file limits apply?
- Excel (.xlsx) only, 25 MB maximum.
Still stuck? Contact us.
Ready to right-size your staffing?
Currently onboarding a limited number of beta teams.