Platform
Version 38.0.0 Latest
- chore(analytics): :mag: add a read-only audit of the cancelled-booking analytics double-count (#1294)
- chore(map): :fire: add guarded script to delete the two real hotel map winklinks entries (#1263)
- chore(scripts): split the ancillary enum rename out of the AddOn inversion migration
- chore(staging): :truck: point the staging apps at the new Flex cluster (#1238)
- chore(staging): disable L2 cache and rate limiter to retire wink-cache-staging (#1236)
- docs: :globe_with_meridians: updated i18n keys
- docs: :memo: updated html title
- docs(addon): :memo: correct the dead-index runbook (no _v2 index, guard each drop) (#1267) (#1286)
- docs(analytics): :memo: booking source slice 3 as built, plus the attribution spec (#1299)
- docs(analytics): :memo: booking source slice 4 plan (#1306)
- docs(analytics): :memo: design and plan the booking source read side (slice 5) (#1309)
- docs(analytics): :memo: record the partial index assumption and the share destination
- docs(analytics): :memo: spec and plan for the cancelled-booking rollup repair (#1297)
- docs(analytics): booking source attribution spec and the slice 2a audit plan (#1293)
- docs(analytics): spec and slice 1 plan for link booking attribution (#1292)
- docs(api-usage): correct Javadocs that call Partner API Lookup free (#1227)
- docs(content): :memo: correct the L2 rationale on ContentGreenIndexScores and pin it with a test (#1340)
- docs(map): add the inventory map retirement design and plan (#1253)
- docs(openapi): re-record the published contracts after the AddOn inversion
- docs(partner): :memo: describe mandatory add-on quantity by hotel child-age policy (#1273)
- docs(transactional-url): :memo: sync TransactionalUrl OpenAPI schema with the code (#1243)
- feat: :sparkles: enable production MPP with Stripe SPTs (#1153)
- feat: add the card size to the customization, syndication settings and syndicated item (#1246)
- feat: apply mandatory add-ons on every sales channel (#1271)
- feat: return compact MCP inventory search summaries (#1222)
- feat(#1010): :sparkles: switch production to the STRIPE_PASS_THROUGH fee model (#1560)
- feat(#1146): :sparkles: supplier gateway foundations (scopes, partner-app client, internal proto) (#1539)
- feat(#1214): :sparkles: classify rate plans by audience (public, member, CUG, promo, negotiated, wholesale, opaque) (#1502)
- feat(#1215): :sparkles: partner room-type rate calendar RPC (#1505)
- feat(#1344): :sparkles: read-only report comparing analytics rollups with real bookings (#1376)
- feat(#1385): :sparkles: split dashboard counts chart and expose currencyCode on LineChart (#1386)
- feat(#1449): :sparkles: per-section customization PATCH endpoints with If-Match locking (#1455)
- feat(#1489): public lookup search and show without an owner (#1491)
- feat(#1490): public paginated Wink Network grids of property search hits (#1497)
- feat(#1537): :sparkles: redirect a room short link to the room page (#1538)
- feat(#1544): :sparkles: expose the Stripe charge total on the cart response (#1548)
- feat(#1546): :sparkles: partner commission excludes the actual Payment Collection Fee (#1552)
- feat(#1561): :sparkles: terminal UNREADABLE acquiring-fee state for legacy charges on the retired Stripe account (#1562)
- feat(1131): consumer PublicMedia with delivery URLs on the booking-engine API (#1173)
- feat(1138): mongo script to backfill propertyAggregate.offeredToOwnerIds (#1188)
- feat(1138): phase 6 PR 1 — offeredToOwnerIds rollup on PropertyAggregate (#1172)
- feat(1138): phase 6 PR 2a — rate-offer resolver and per-channel pricing (#1174)
- feat(1138): phase 6 PR 2b — hotel search on PropertyAggregate (#1175)
- feat(1139): :sparkles: status reconcile as a db script, so the 7b rollout is db-script-only (#1191)
- feat(1139): phase 7a — add-on and venue selection off Inventory (#1184)
- feat(1139): phase 7b — stored references move from inventory rows to item references (#1190)
- feat(1176): :sparkles: studio search on PropertyAggregate; retire studio browse (#1217)
- feat(add-on): allow the commissionable flag to be patched from the add-on hub
- feat(add-on): drop extranet sections whose fields no longer exist on AddOn
- feat(add-on): make AddOn the single sellable unit, strip transactional list from base
- feat(add-on): move minPax/maxPax onto the restrictions PATCH endpoint (#1162)
- feat(add-on): split eligibility and restrictions out of the configuration PATCH (#1159)
- feat(addon): :sparkles: apply an add-on to one, several or all items of its inventory type (#1267) (#1276)
- feat(analytics): :sparkles: add per-link daily clicks sparkline endpoint (#1290)
- feat(analytics): :sparkles: read booking sources per link and account link (#1310)
- feat(analytics): :sparkles: record the booking source on bookingtimeseries rows and mcp bookings (#1308)
- feat(analytics): :sparkles: repair endpoint for the cancelled-booking rollup overstatement (#1298)
- feat(analytics): add studio hotel booking analytics endpoint in usd (#1245)
- feat(analytics): per-link analytics, a standard link map and the index behind them (#1248)
- feat(booking): :sparkles: bcc wink support on every settled refund and cancellation (#1341) (#1373)
- feat(checkout): :sparkles: credit a booking started from a WinkLinks page (#1313)
- feat(checkout): :sparkles: record a validated booking source on the booking (slice 3a, backend) (#1300)
- feat(computed): source venue offers from the add-ons categorized under them
- feat(content): :sparkles: add bathroomCount, securityFeatures and other guest room fields to ROOM_TYPE content (#1337) (#1351)
- feat(content): :sparkles: bring back the ADD_ON content scope and link priced offers by addOnId (#1336) (#1350)
- feat(content): :sparkles: optional recognitions and green index scores on public and Partner content (#1330) (#1339)
- feat(inventory): :sparkles: answer city, geo, filtered, latest and saved-list searches with the grid payload (#1356) (#1359)
- feat(inventory): :sparkles: answer the ranked place searches with the grid payload (#1356) (#1357)
- feat(inventory): :sparkles: opt-in caller-location pricing on public inventory/property (#1328) (#1335)
- feat(inventory): :sparkles: public property inventory offers endpoint, shared with Partner (#1320) (#1324)
- feat(inventory): :sparkles: record page visits and booking source on a dedicated public endpoint (#1329) (#1338)
- feat(inventory): :sparkles: serve venue, contact, metadata and announcement fields on inventory/content (#1352) (#1354)
- feat(inventory): :sparkles: sort search by a real price band instead of star rating (#1334) (#1349)
- feat(mcp): :sparkles: show a booking confirmation card after agentic payment (#1509)
- feat(mcp): show hotel cards with room photos and quote totals (#1242)
- feat(mpp): :sparkles: tag Stripe payments for MPP analytics (#1223)
- feat(partner): add SearchByFilters, SearchLatest and SearchBySavedList to the Partner Search API (#1356) (#1360)
- feat(partner): stop publishing add-ons in the venue-shaped content item
- feat(sales-channel): :sparkles: phase 5 — sales-channel membership on MasterRate and AddOn (#1163)
- feat(scripts): add AddOn inversion mongo migration with conservation checks
- feat(scripts): cascade-remove dangling master rates with their downstream data (#1178)
- feat(scripts): re-point master rates from a deleted rate plan to its recreated one (#1180)
- feat(shared): add InventoryType.isVenueScoped for add-on categorization
- feat(shortened-url): :sparkles: Book Now = hotel ManagingEntity link with ?r=ibe; stop auto-creating hotel links (#1194)
- feat(shortened-url): :sparkles: record a destination on link shares (#1312)
- feat(sso): rotate an animated backdrop behind the login card (#1498)
- feat(transactional-list): hotels-only grid, rooms as a hotel room focus (#1258) (#1260)
- feat(transactional-list): one list aggregate replaces static, dynamic, sellable and ranked lists (#1211)
- feat(transactional-url): add per-section PUT endpoints for the link hub (#1254)
- feat(transactional-url): check customization ownership on create and PUT (#1256)
- feat(transactional-url): mark social-post links with a source and refuse to remove them (#1244)
- feat(transactional-url): one hotel-level link replaces supplier url, inventory url and sellable item (#1203)
- feat(transactional-url): PATCH section endpoints and optional customizationIdentifier (#1255)
- feat(version): :sparkles: expose build number and Cloud Run revision on /version
- feat(version): :sparkles: expose the build identity on / as well as /version (#1239)
- fix: give AddOn its own path in the last four modules that assumed it was a venue
- fix(#1231): validate each ancillary line of a cart item and an agent booking (#1443)
- fix(#1283): :bug: store the request’s end timezone when updating a schedule item (#1462)
- fix(#1343): :bug: count only real bookings in hotel and creator sales totals (#1375)
- fix(#1346): stop 400 responses exposing Java class and method signatures (#1435)
- fix(#1348): :bug: show hotels only real bookings (#1381)
- fix(#1353): never remind or re-confirm a booking that was not paid (#1437)
- fix(#1377): :lock: stop sending the Link manager lock passcode to public visitors (#1395)
- fix(#1378): :bug: read a link’s OpenGraph tags with a guarded HTTP fetch, not a headless browser (#1407)
- fix(#1382): :bug: keep a room link as a WEB_LINK instead of converting it to a hotel card (#1405)
- fix(#1382): :bug: price a link’s room under its other rate plans when the named plan is closed (#1411)
- fix(#1383): :bug: reordering entries leaves the other status’s entries alone (#1412)
- fix(#1392): :bug: count third-party reviews as reviews, not as publications (#1465)
- fix(#1394): :clock3: reject an impossible check-in or check-out time, and add a script to normalise stored free text (#1427)
- fix(#1397): :lock: show a locked entry’s short link a generic preview, not its description and image (#1410)
- fix(#1398): :lock: title a locked entry’s gate with a generic label, not the internal portal name (#1418)
- fix(#1399): :white_check_mark: reject an impossible reputation score on write (#1425)
- fix(#1399): :wrench: add a dry-run script that corrects stored reputation scores the new write check rejects (#1426)
- fix(#1409): :loud_sound: stop logging Spring beans, AOP and AI at TRACE on staging inventory (#1424)
- fix(#1414): :bug: reject an impossible room occupancy range on write (#1428)
- fix(#1414): :lock: harden the occupancy repair script’s apply, revert and reconcile paths (#1430)
- fix(#1414): :wrench: add a reversible, tiered dry-run script that repairs stored room occupancy (#1429)
- fix(#1414): close the failure paths the second review found in the occupancy repair script (#1434)
- fix(#1419): :lock: allow-list the fields a visitor may filter and sort the public grid on (#1420)
- fix(#1436): answer a chart that is not the caller’s with 404, not 401 (#1438)
- fix(#1442): answer a constraint violation on a request parameter with a 400, not a 500 (#1448)
- fix(#1444): reject an ancillary whose endDate is before its startDate (#1445)
- fix(#1446): :bug: refuse a time-priced add-on whose range is shorter than one unit, at booking time (#1461)
- fix(#1450,#1447): :bug: framework 4xx keep their own status; reserved field names no longer corrupt the 400 body (#1459)
- fix(#1456): :lock: 404 for another managing entity’s customization on GET-by-id and DELETE (#1457)
- fix(#1460): :bug: log a 405 and a 413 at INFO, and send Allow on a 405 (#1466)
- fix(#1463): read a schedule item’s end in its own time zone for the calendar link and ICS (#1482)
- fix(#1464): validate scheduler request fields and time zone ids, answer 400 naming the field (#1471)
- fix(#1467): send Accept on a 415/406, expose Allow cross-origin, correct stale Sentry-threshold comments (#1484)
- fix(#1469): write only the sort position when reordering link-manager entries (#1470)
- fix(#1473): refuse a schedule request whose end is before its start (#1483)
- fix(#1526): :bug: supersede a booker’s earlier unpaid checkout on a new /api/checkout (#1528)
- fix(#1529): harden superseding of earlier unpaid checkouts (#1532)
- fix(#1533): replay a duplicate /api/checkout instead of creating a second session (#1534)
- fix(#1550): :lock: hide partner commission, hotel net, payouts and fees from the guest view (#1554)
- fix(#1558): :lock: scope the Stripe-session booking lookup to the booker (#1564)
- fix(#891): :bug: skip crawlers in the analytics facade so shares and page views are covered (#1404)
- fix(#891): :bug: stop counting link-preview crawlers as clicks (#1402)
- fix(1099): :bug: enable readiness/liveness probe groups on inventory-app (#1208)
- fix(1102): stop retrying idempotent duplicate-key rate replays (#1209)
- fix(1104): :white_check_mark: property-consumer test compiles again after #1210 (#1221)
- fix(1127): :bug: memoize webhook subscription lookups per dispatch pass (#1200)
- fix(1160): :lock: scope master-rate extranet lookups to the hotel in the path (#1167)
- fix(1186): add-ons carry their own sales channels; an inactive venue blocks its add-ons (#1189)
- fix(add-on): :bug: keep venue and room add-ons out of generic room add-on offers (#1170)
- fix(add-on): :bug: require requiresTimeSlot so a save cannot silently withhold an invite
- fix(add-on): :bug: resolve a booked add-on’s venue, contact and address
- fix(add-on): :bug: validate add-on references at the write boundary
- fix(add-on): default a draft add-on to commissionable
- fix(addon): :bug: apply room type and rate plan restrictions to venue add-ons and at checkout (#1266) (#1274)
- fix(addon): :bug: bill mandatory add-ons for every night and count guests by hotel policy (#1265) (#1272)
- fix(addon): :bug: don’t apply a per-child mandatory add-on to a room with no children (#1302) (#1370)
- fix(addon): :bug: enforce add-on group size on offers, mandatory add-ons and checkout (#1303) (#1372)
- fix(addon): :bug: stop declaring the compound index over the removed categoryItemId (#1267) (#1280)
- fix(addon): :lock: scope every add-on load in the add-on module by hotel (#1275) (#1277)
- fix(ai): let callers supply ancillaries the venue no longer owns
- fix(analytics): :bug: skip the cancellation row of a booking that was never confirmed (#1296)
- fix(analytics): record cancelled bookings as cancellations and skip test bookings (#1291)
- fix(apps): add partner-app startApp.sh, switch all four to mvnd + java -jar (#1206)
- fix(booking): :bug: name the hotel in the guest refund email (#1342) (#1374)
- fix(booking): :bug: stop a deleted add-on aborting group add-on processing
- fix(booking): :shield: skip a metadata key a reader does not know instead of failing the booking (#1315)
- fix(checkout): snapshot the parent venue’s contact and address onto an add-on booking
- fix(computed-rate): derive a single rate plan from ratePlanIds
- fix(computed): :bug: enforce the add-on rate-plan and room-type filters
- fix(content): :bug: list every perk on a master rate and deprecate the unpopulated Partner perks dictionary (#1325) (#1327)
- fix(inventory,webhook): last two modules that treated AddOn as a venue
- fix(inventory): :bug: publish the lower of an add-on’s two prices
- fix(inventory): degrade a property whose currency has no platform quote instead of failing the page (#1358) (#1362)
- fix(managed-social): geo-tag add-on posts from the property, not the add-on
- fix(managing-entity): :bug: hard-delete the entity in the purge task, not just its cascade (#1154)
- fix(mpp): :bug: include hotel names on card statements (#1251)
- fix(open-api): :bug: make the inventory goldens describe the code on this branch
- fix(open-api): :bug: re-record the inventory goldens for BookingAncillary.venueIdentifier
- fix(open-api): re-record inventory goldens after merging develop
- fix(open-api): re-record inventory goldens after rebasing onto develop
- fix(partner): :bug: raise startup-probe initialDelaySeconds 10->55
- fix(partner): :lock: widen before adding in the deep-paging cap (#1356) (#1361)
- fix(payment): :bug: read the acquiring fee from the charge’s expanded balance transaction (#1506)
- fix(property-aggregate): make hotel stars and review rating list filters inclusive (#1241)
- fix(rate): widen rate date-range reads to cover a property-ahead-of-UTC ttl (#1156)
- fix(scheduler): :bug: stop the category deciding an invite that requiresTimeSlot already decided
- fix(scheduler): :lock: scope extranet schedule create, list, update and remove by hotel (#1279) (#1282)
- fix(scheduler): title the calendar invite by the add-on, locate it at the parent venue
- fix(scripts): :bug: make the AddOn inversion migration re-runnable and delete superseded parents
- fix(scripts): :bug: make the phase 1/phase 5 migrations run on production data (#1169)
- fix(scripts): :bug: point the enum rename at the paths the data is actually stored under
- fix(scripts): :bug: re-point ADD_ON inventory rows before deleting legacy add-on parents (#1165)
- fix(scripts): :bug: unset stale fixedAmount on PERCENTAGE single-occupancy modifiers (#1182)
- fix(scripts): reconcile the AddOn migration against the shipped entity
- fix(shortened-url): :bug: look up short links by entity id and type, never by id alone (#1314)
- fix(transactional-list): :bug: accept a room type when adding a room to a list (#1269)
- fix(transactional-list): :bug: migration de-duplicates list items; parity FAVORITE rule is skip-aware (#1212)
- fix(transactional-list): :bug: parity reports references that were dangling before the migration (#1213)
- fix(transactional-list): :bug: return a list item’s sales channel as a lightweight, not the stored ref (#1270)
- fix(transactional-url): :bug: default a blank name to “Book now” instead of skipping the row (#1205)
- fix(usage): :lock: scope the inventory usage reports by hotel (#1278) (#1284)
- perf(1104): serve findCity/findCurrencyCodeAndRateProviderForHotel from the cached property read (#1210)
- perf(1118): :zap: batch page-visit analytics into one bulk insert per results page (#1204)
- perf(booking): :zap: add the two Atlas-suggested booking indexes (#1237)
- refactor(1120): :recycle: split BookingRepositoryImpl into aggregation/query support classes (#1201)
- refactor(1139): :fire: 7c-1 delete standalone venue pricing (#1218)
- refactor(1139): :recycle: 7c-2 pricing consumes item offers, not Inventory rows (#1219)
- refactor(add-on): :recycle: remove the unreachable detachRatePlanId fragment
- refactor(checkout): :recycle: move #1136’s ancillary tests onto the collapsed enum
- refactor(checkout): collapse the eight-way ancillary switch onto one AddOn path
- refactor(computed,inventory): give AddOn its own path now that it left the venue hierarchy
- refactor(map): delete the stored inventory map and add the guarded drop scripts (release 2) (#1252)
- refactor(map): retire map authoring and convert the hotel map entries (release 1) (#1250)
- refactor(meeting-room,activity): make MeetingRoom and Activity purely static content
- refactor(place,attraction): make Place and Attraction purely static content
- refactor(restaurant,spa): make Restaurant and Spa purely static content
- refactor(room-type): make RoomType purely static content
- refactor(scheduler): drive calendar invites from the add-on’s requiresTimeSlot flag
- refactor(sentry): :recycle: scope the daily issue filer to this repo’s Sentry projects (#1196)
- refactor(shared): collapse BookingAncillaryType into InventoryType
- refactor(shared): delete TransactionalTravelInventory
- refactor(shortened-url): :fire: remove the untyped findByEntityId lookup (#1316)
- refactor(sso): :fire: remove the aurora login backdrop (#1507)
- refactor(transactional): remove unused displayType and sort fields (#1257) (#1259)
- test(#1413): :white_check_mark: pin that a stale sort cannot undo a concurrent archive (#1468)
- test(agentic-booking): :white_check_mark: cover the confirmation and quote-summary records
- test(architecture): :white_check_mark: publish InventoryFxQuotes as part of the InventoryDeclarations contract
- test(checkout): :white_check_mark: mock the CheckoutAttemptStore in the service integration slice
- test(customization): :white_check_mark: cover the per-section PATCH request payloads
- test(exely): :white_check_mark: keep sibling TestConfig out of ExelyServiceConfig’s component scan
- test(exely): :white_check_mark: prove closed-on-arrival/departure end to end
- test(partner): :white_check_mark: derive the expected Search RPC count instead of hardcoding six
- test(scheduler): :white_check_mark: expect one removal email per schedule item in testBookingCancelled
