Personalize Bet Settled
ootb_sports_bet_settled is an optional Sports event for Optimove Personalize. Send it when an identified customer’s accepted bet has been settled and its outcome is known.
Bet Placement is the minimum event required for standard Sports recommendations. Bet Settled adds outcome and value signals used by settlement-dependent methods, including Prior Win.
Send this event using the Server-Side Events API.
Before you begin
- Implement the required Bet Placement event first.
- Reuse the same customer, bet slip identifier, bet identifier and Inventory hierarchy keys reported at placement.
- Send one settlement event for each selection or leg.
- The referenced Sports Inventory hierarchy must still identify the same Category, Class, Type, Event, Market and Selection.
Example
{
"tenant": "your_tenant_id",
"timestamp": "2026-07-10T21:02:03Z",
"event": "ootb_sports_bet_settled",
"customer": "customer_12345",
"context": {
"ootb_betslip_key": "ticket_9001",
"ootb_bet_date_time": "2026-07-09T14:22:00Z",
"ootb_settled_date_time": "2026-07-10T21:02:00Z",
"ootb_betslip_status": "win",
"ootb_bet_key": "bet_10001",
"ootb_bet_stake": 20,
"ootb_bet_payout": 42,
"ootb_bet_sel_stake": 20,
"ootb_bet_sel_payout": 42,
"ootb_odds_decimal_price": 2.1,
"ootb_selection_key": "selection_man_utd",
"ootb_selection_name": "Manchester United",
"ootb_market_key": "market_match_result_7842",
"ootb_market_name": "Match Result",
"ootb_event_date_time": "2026-07-10T19:00:00Z",
"ootb_event_key": "event_7842",
"ootb_event_name": "Manchester United vs Liverpool",
"ootb_meeting_key": "type_premier_league",
"ootb_meeting_name": "Premier League",
"ootb_class_key": "class_england",
"ootb_class_name": "England",
"ootb_discipline_key": "category_football",
"ootb_discipline_name": "Football",
"ootb_leg_num": 1,
"ootb_leg_status": "Won",
"ootb_bet_type": "Single",
"ootb_num_selections": 1,
"ootb_channel": "Desktop"
}
}Context fields
| Field | Required | Type | Personalize use | Notes |
|---|---|---|---|---|
ootb_betslip_key | Yes | String | Links the settled leg to the ticket originally reported at placement | Reuse the exact placement value. |
ootb_bet_date_time | Yes | String (date-time) | Preserves the original interaction time for customer history and recency | Reuse the accepted placement time as an ISO 8601 UTC timestamp. Do not replace it with settlement time. |
ootb_settled_date_time | Yes | String (date-time) | Establishes when the outcome became known and anchors Prior Win history | Send the settlement time as an ISO 8601 UTC timestamp. |
ootb_betslip_status | Yes | String | Supplies the final ticket state for outcome-aware methods | Use a stable final-status vocabulary such as win or loss. Keep it consistent with leg outcomes. |
ootb_bet_key | Yes | String | Links the settlement to the bet originally reported at placement | Reuse the exact placement value. |
ootb_bet_stake | Yes | Number | Supplies overall bet value for outcome- and value-aware analysis | Must be zero or greater. Use a JSON number without a currency symbol. |
ootb_bet_sel_stake | Yes | Number | Supplies the amount attributable to this Selection for Prior Win scoring | Must be zero or greater. |
ootb_odds_decimal_price | Yes | Number | Supplies normalized odds used with stake and outcome data | Must be zero or greater. Keep the definition consistent with Bet Placement. |
ootb_selection_key | Yes | String | Joins the outcome to the Sports Inventory Selection | Must exactly match Inventory selectionKey and the placement event. |
ootb_selection_name | Yes | String | Supplies the winning or losing outcome name and supports name-based Prior Win logic | Keep participant and team naming consistent with Inventory and placement data. |
ootb_market_key | Yes | String | Joins the outcome to its Sports Inventory Market | Must exactly match Inventory marketKey. |
ootb_market_name | Yes | String | Supplies readable market context for outcome-aware methods | Use the same name as Inventory where possible. |
ootb_event_date_time | Yes | String (date-time) | Preserves the fixture’s scheduled time for outcome history | Reuse the event start time reported at placement. |
ootb_event_key | Yes | String | Joins the result to its Sports Inventory Event or fixture | Must exactly match Inventory eventKey. |
ootb_event_name | Yes | String | Supplies participant or team context used by Prior Win methods | Keep naming and delimiters consistent across placement, settlement and Inventory. |
ootb_meeting_key | Yes | String | Joins the result to the Sports Inventory Type level | Despite the event field name, this maps to Inventory typeKey. |
ootb_meeting_name | Yes | String | Supplies readable league, competition or meeting context | Use the Inventory Type name. |
ootb_class_key | Yes | String | Joins the result to the Sports Inventory Class level | Must exactly match Inventory classKey. |
ootb_class_name | Yes | String | Supplies readable Class context | Use the same name as Inventory where possible. |
ootb_discipline_key | Yes | String | Joins the result to the Sports Inventory Category level | Despite the event field name, this maps to Inventory categoryKey. |
ootb_discipline_name | Yes | String | Supplies the readable sport or discipline | Use the Inventory Category name. |
ootb_leg_num | Yes | Number | Identifies which leg of the original ticket was settled | Must be zero or greater. Reuse the placement leg number. |
ootb_leg_status | Yes | String | Identifies the outcome of this leg for Prior Win logic | Examples include Won, Lost and Cashout. Use one stable vocabulary. |
ootb_bet_type | Yes | String | Preserves the original bet structure | Reuse the placement value, such as Single, Multiple, System or Bet Builder. |
ootb_num_selections | Yes | Number | Describes the complete ticket and expected number of leg settlements | Must be zero or greater. Send a whole number and reuse the placement value. |
ootb_platform | No | String | Accepted by the event schema but not currently retained by the Personalize Bet Settled mapper | Prefer the platform originally reported at placement if you send it. |
ootb_channel | No | String | Supplies access-channel context | Prefer the channel originally reported at placement. |
ootb_license | No | String | Supplies regulatory or jurisdiction context where configured | Use the same license identifier as placement. |
ootb_betslip_stake | No | Number | Accepted by the event schema but not currently retained by the Personalize Bet Settled mapper | Must be zero or greater. |
ootb_bet_payout | No | Number | Supplies total payout for the bet | Must be zero or greater. Use a JSON number. |
ootb_betslip_payout | No | Number | Accepted by the event schema but not currently retained by the Personalize Bet Settled mapper | Must be zero or greater. Do not confuse it with the payout for one leg. |
ootb_bet_bonus | No | Number | Supplies the bonus-funded portion of the bet | Must be zero or greater. |
ootb_bet_sel_payout | No | Number | Supplies payout attributable to this Selection | Must be zero or greater. |
ootb_bet_sel_bonus | No | Number | Supplies bonus value attributable to this Selection | Must be zero or greater. |
ootb_is_live | No | Boolean or integer | Accepted by the event schema but not currently retained by the Personalize Bet Settled mapper | Prefer JSON true or false. If integers are used, use 1 for live and 0 otherwise. |
ootb_odds_number | No | Number | Supplies the numerator when fractional odds are also required | Send it together with ootb_odds_denominator. Decimal odds remain required. |
ootb_odds_denominator | No | Number | Supplies the denominator when fractional odds are also required | Send it together with ootb_odds_number. |
ootb_odds_american_price | No | Number | Accepted by the event schema but not currently retained by the Personalize Bet Settled mapper | Decimal odds remain the required normalized representation. |
ootb_leg_type | No | String | Preserves semantic detail for the leg | Reuse the placement value where supplied. |
ootb_each_way | No | Boolean or string | Preserves an each-way flag where applicable | Prefer a Boolean and use the same representation as placement. |
ootb_brand | No | String | Supplies downstream brand or skin context | The top-level tenant still determines event routing. Use a stable configured value when this context is needed. |
Sports Inventory joins
| Event context | Inventory | Meaning |
|---|---|---|
ootb_discipline_key | categoryKey | Sport or discipline |
ootb_class_key | classKey | Class |
ootb_meeting_key | typeKey | Competition, league, meeting or Type |
ootb_event_key | eventKey | Event or fixture |
ootb_market_key | marketKey | Market |
ootb_selection_key | selectionKey | Selection or outcome |
All settlement keys should match both the original placement event and one valid path through Sports Inventory.
When this event is needed
Implement Bet Settled when your selected Personalize methods use known outcomes. The standard example is Prior Win, which uses settled winning history, Selection stake, decimal odds and Sports hierarchy data to identify relevant current Inventory selections.
Bet Placement remains sufficient for placement-based methods such as Popular, Trending, Similarity and Personalised Popular.
Multi-selection bets
Send one ootb_sports_bet_settled event for every settled selection or leg. Each event should:
- reuse the original
ootb_betslip_key; - reuse the correct
ootb_bet_keyandootb_leg_num; - identify its own Selection and parent Inventory hierarchy;
- report its own
ootb_leg_status, stake and optional payout; and - set
ootb_num_selectionsto the total number of selections on the ticket.
Validation checklist
- The wrapper contains
tenant,timestamp,event,customerandcontext. eventis exactlyootb_sports_bet_settled.- Customer, ticket, bet, leg and hierarchy identifiers agree with Bet Placement.
- All required fields are present for every settled selection or leg.
- Placement, event and settlement timestamps are valid ISO 8601 UTC values.
- Settlement time is not used in place of the original bet time.
ootb_leg_statusandootb_betslip_statusdescribe compatible outcomes.- Decimal odds and numeric values are JSON numbers, not formatted strings.
Updated about 2 hours ago
