{"_id":"56fd7b7f3eaf300e00f7408d","project":"56c35c56c0c4630d004e864c","githubsync":"","category":{"_id":"56c7b9e5379b311700ed8fe3","pages":["56c7ba3853cafe0d00a53daa"],"project":"56c35c56c0c4630d004e864c","version":"56c35c56c0c4630d004e864f","__v":1,"sync":{"url":"","isSync":false},"reference":false,"createdAt":"2016-02-20T00:57:09.551Z","from_sync":false,"order":2,"slug":"stinger","title":"Stinger"},"parentDoc":null,"user":"56c39c05bc41330d009f25d7","__v":3,"version":{"_id":"56c35c56c0c4630d004e864f","project":"56c35c56c0c4630d004e864c","__v":8,"createdAt":"2016-02-16T17:28:54.864Z","releaseDate":"2016-02-16T17:28:54.864Z","categories":["56c35c57c0c4630d004e8650","56c7b9e5379b311700ed8fe3","56c7bab4606ee717003c4766","56c7bb3613e5400d001e8cbd","56cf3f5a5267d70b00494c4b","56cf3f866c5d7a13005ee894","56fd3956caad892200847bce","599da256e7742b002588bb02"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":true,"codename":"","version_clean":"0.5.0","version":"0.5"},"updates":[],"next":{"pages":[],"description":""},"createdAt":"2016-03-31T19:33:19.101Z","link_external":false,"link_url":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":3,"body":"The following is the high level Beeswax architecture, with those components that are customizable and those that Beeswax maintains clearly indicated. Also indicated are parts of the system that are available for custom deployment.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/8dafdab-life_of_a_bid.png\",\n        \"life_of_a_bid.png\",\n        1254,\n        701,\n        \"#f0ca74\"\n      ]\n    }\n  ]\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Life of a Bid\"\n}\n[/block]\nReading the diagram from left to right we can construct the “life of a bid” to give a quick explanation of the role of each component.\n\n1. Auctions come in to the Beeswax “front end” which are normalized into a common OpenRTB 2.3 format. Beeswax augments the auction with common third-party data sources and can also lookup the customer’s unique user ID (cookie or synthetic ID) at this stage.\n2. The normalized auctions can then be further augmented using a customer owned \"[Data Augmentor](doc:data-augmentation)\". This is typically a simple key-value lookup with a very short latency window (10ms). Use cases for first party data augmentation include custom geo databases, mapping of users to rich profiles, and scoring of inventory data.\n3. The augmented auction is then passed to the Stinger bidder. The Stinger bidder has all active “ad groups” in memory, where each ad group represents a unique [Line Item](doc:line-items) and [Creative](doc:creatives) combination from the [Buzz](doc:getting-started) campaign management system. \n4. Stinger filters the available ad groups on five criteria:\n -Does line item targeting match the incoming request?\n -Is the user over the desired frequency cap?\n -Does the line item have budget available?\n -Does the creative associated with the ad group match any creative attributes (filtering criteria) in the incoming request (e.g. creative size, VPAID enabled etc.)?\n -Should the line item be paced? This step is optional since pacing can be turned on or off at the line item level.\n5. After filtering, Stinger passes the list of candidate ad groups to the customer’s owned [Bidding Agent](doc:bidding-agent), which determines the bid prices and can also further select creatives and inject custom data into the creative markup via [Dynamic Macros (Real-Time Custom Values)](doc:dynamic-creatives-using-a-bidding-agent). The bidding agent can have any number of ways of determining the bids, including pacing considerations, optimization, etc.\n6. The bids are then returned to the front end server, sorted and de-duplicated, and the top bids are sent back to the exchange.\n\n[block:api-header]\n{\n  \"title\": \"Data Flow\"\n}\n[/block]\n“Life of a Bid”, above, describes how bids are handled. But that’s just the start of our amazing RTB adventure! The next steps are what happens when we win an impression.\n1. The rendered creative code passed back to the exchange include impression urls, click urls, and “event” urls for tracking things like video plays and completes. When these URLs are called, they are recorded by the Beeswax Event Server, which also sets cookies. The data from the Event Server is then streamed into multiple systems.\n2. Any user data collected on the request is written to the cookie store. For example, the user may be placed in a segment based on their activity.\n3. The budget server which is part of Stinger is updated with the win price.\n4. Finally, the data is streamed into several data systems:\n -Data is fed into the Beeswax reporting system and aggregated hourly. The aggregated reports are made available through Buzz's [Report Queue](doc:report-queue) endpoint.\n -Raw data logs (auctions, bids, wins and conversions) can be delivered to a customer’s data store as described in [Data Feeds](doc:data-feeds).\n -Data is streamed into a customer specific [Metamarkets](https://metamarkets.com) dashboard for advanced analytics. This includes customer’s auctions, bids, and win data.","excerpt":"","slug":"beeswax-architecture-life-of-a-bid","type":"basic","title":"Beeswax Architecture / Life of a Bid"}

Beeswax Architecture / Life of a Bid


The following is the high level Beeswax architecture, with those components that are customizable and those that Beeswax maintains clearly indicated. Also indicated are parts of the system that are available for custom deployment. [block:image] { "images": [ { "image": [ "https://files.readme.io/8dafdab-life_of_a_bid.png", "life_of_a_bid.png", 1254, 701, "#f0ca74" ] } ] } [/block] [block:api-header] { "type": "basic", "title": "Life of a Bid" } [/block] Reading the diagram from left to right we can construct the “life of a bid” to give a quick explanation of the role of each component. 1. Auctions come in to the Beeswax “front end” which are normalized into a common OpenRTB 2.3 format. Beeswax augments the auction with common third-party data sources and can also lookup the customer’s unique user ID (cookie or synthetic ID) at this stage. 2. The normalized auctions can then be further augmented using a customer owned "[Data Augmentor](doc:data-augmentation)". This is typically a simple key-value lookup with a very short latency window (10ms). Use cases for first party data augmentation include custom geo databases, mapping of users to rich profiles, and scoring of inventory data. 3. The augmented auction is then passed to the Stinger bidder. The Stinger bidder has all active “ad groups” in memory, where each ad group represents a unique [Line Item](doc:line-items) and [Creative](doc:creatives) combination from the [Buzz](doc:getting-started) campaign management system. 4. Stinger filters the available ad groups on five criteria: -Does line item targeting match the incoming request? -Is the user over the desired frequency cap? -Does the line item have budget available? -Does the creative associated with the ad group match any creative attributes (filtering criteria) in the incoming request (e.g. creative size, VPAID enabled etc.)? -Should the line item be paced? This step is optional since pacing can be turned on or off at the line item level. 5. After filtering, Stinger passes the list of candidate ad groups to the customer’s owned [Bidding Agent](doc:bidding-agent), which determines the bid prices and can also further select creatives and inject custom data into the creative markup via [Dynamic Macros (Real-Time Custom Values)](doc:dynamic-creatives-using-a-bidding-agent). The bidding agent can have any number of ways of determining the bids, including pacing considerations, optimization, etc. 6. The bids are then returned to the front end server, sorted and de-duplicated, and the top bids are sent back to the exchange. [block:api-header] { "title": "Data Flow" } [/block] “Life of a Bid”, above, describes how bids are handled. But that’s just the start of our amazing RTB adventure! The next steps are what happens when we win an impression. 1. The rendered creative code passed back to the exchange include impression urls, click urls, and “event” urls for tracking things like video plays and completes. When these URLs are called, they are recorded by the Beeswax Event Server, which also sets cookies. The data from the Event Server is then streamed into multiple systems. 2. Any user data collected on the request is written to the cookie store. For example, the user may be placed in a segment based on their activity. 3. The budget server which is part of Stinger is updated with the win price. 4. Finally, the data is streamed into several data systems: -Data is fed into the Beeswax reporting system and aggregated hourly. The aggregated reports are made available through Buzz's [Report Queue](doc:report-queue) endpoint. -Raw data logs (auctions, bids, wins and conversions) can be delivered to a customer’s data store as described in [Data Feeds](doc:data-feeds). -Data is streamed into a customer specific [Metamarkets](https://metamarkets.com) dashboard for advanced analytics. This includes customer’s auctions, bids, and win data.