Skip to content
Protocolzone Protocolzone

Operations module

Schedule management

One calendar the whole platform trades, prices and settles against.

Part of the Ashva module inventory — a multi-tenant tote and fixed-odds betting platform we built and operate. The engineering practice behind it is our platform build and integration service line.

A wagering platform is only ever as correct as its calendar. If a scratching lands late, a market prices a runner that is not in the race. If two providers disagree on a jump time, one module suspends and another keeps taking bets. If an abandonment is not propagated, markets stay open on a meeting that will not happen.

The schedule module is the single calendar every other module reads.

Stable identifiers first

Meetings, races and runners get platform identifiers that do not change when a provider re-issues a file or a second provider describes the same race differently. Provider keys are held as mappings against the platform key, with a precedence order for conflicts. Without this, every downstream consumer invents its own matching logic and they gradually disagree.

Changes as events

Scratchings, emergency runners promoted into the field, rider and driver changes, barrier changes and going updates arrive as timestamped events rather than overwrites. That matters at settlement: whether a bet was placed before or after a scratching decides how it settles, and the calendar has to be able to answer what the field looked like at the moment of placement.

Timing drives market state

Market open, suspend and close times are held as offsets from the scheduled start. When a start time moves, the offsets move with it and market state follows automatically. Delayed starts, re-scheduled races and abandoned meetings all flow through to the betting automation module rather than requiring an operator to remember which markets are affected.

Per tenant and per jurisdiction

Codes, meetings and publication windows are configured per tenant. A brand that does not offer greyhounds or cannot take a particular jurisdiction’s meetings simply does not receive them.

What this module does not do

It holds no prices and no bets. It answers what is running, when, with whom, and in what condition. Everything else is downstream of that answer.

Module facts

Module group
Operations
Tenancy
Tenant-aware
Bet types
Fixed odds, Tote, Pari-mutuel, Exotics
Codes and verticals
Thoroughbred, Harness, Greyhound, Sports

Integration surfaces

  • Racing data providers for meetings, fields, scratchings and changes
  • Official bodies' result and amendment feeds
  • Tote hosts for pool availability by meeting
  • Downstream publication to pricing, automation, front end and partner APIs

Capabilities

What schedule management actually does.

Meeting and event calendar

Meetings, races, jump times and venues across codes, held with stable identifiers so every module refers to the same race by the same key regardless of which provider supplied it.

Fields and runner changes

Field publication, barrier draws, scratchings, emergency runners promoted, rider and driver changes, and gear or equipment changes, each applied as a timestamped event rather than a silent overwrite.

Condition and delay handling

Track condition and going updates, weather-driven changes, delayed starts, re-scheduled races and abandoned meetings, propagated to market state and settlement.

Market timing

Open, suspend and close times per market type, set as offsets from the scheduled start and adjusted automatically when the start moves.

Provider reconciliation

Where two providers describe the same meeting differently, the module holds the mapping and a precedence order, so a disagreement is resolved consistently instead of per consumer.

Per-tenant publishing

Which meetings and codes a tenant sees, and how far ahead they are published, configured per tenant and per jurisdiction.

Working on this problem yourself?

We will go through how this module handles it, what it deliberately does not do, and where we would make a different call today.