Consider a Media Buyer who on a regular bases buys millions of placements (impressions) from different sellers (Big Publishers in Online and Mobile Media) and had to locate hundreds of different Campaigns in those placements. Each impression cost differently and the revenues from the advertisers can be varied, according to different revenues models (CPL, CPC, CPM) while the budget of each campaign might be varied.

The Challenge:

How does the Media Buyer knows how to arrange the campaigns such that his revenues will be maximized?

The Solution:

An Optimization server that in realtime evaluates the profit of each campaign for each potential impression and recommends automatically on the best arrangement.

If you are interested to hear more please contact us

Ontology:

Impression: An html page that appears in front of a user
Channel: A bunch of impression that come from the same page/site
Site: All Channels that share the same domain name
Publishers: The owner of the site/sites
Advertising Campaign: A series of advertisement messages that share a single idea and theme
Creatives: The graphical themes (banners, landing pages etc.) that are part of the advertising campaign
CPL Model: Cost Per Lead, A payment model between the media buyer and the advertiser, in which the advertiser is paying only upon receiving a lead (phone number, email etc.) that is interesting in the advertiser product.
CPC Model: Cost Per Click, A payment model between the media buyer and the advertiser, in which the advertiser is paying when a user clicks on an ad
CPM Model: Cost Per Impression, A payment model between the media buyer and the advertiser, in which the advertiser is paying for each impressions. Usually the cost unit is 1000 impressions
eCPM: The actual revenues from 1000 impressions
Share Revenues Model: A payment model between the media buyer and the publisher. The media buyer share a certain percent from his revenues with the publisher.
Fix Cost: A payment model between the media buyer and the publisher.  The media buyer pay a fix cost for an impression. A more risky model as if the revenues are going below the cost, the media buyer should pay out of his pocket to return the losses

Overview About the Optimization Process

To start and work with our API you need first to register to our OPT system (please contact us for that). Once you complete the short registration process you will get an OwnerName (a username that will be sent to you along with a secret string). Each Owner can have many different channels, channels are stream of impressions that come from the same source. For example a channel can be a banner that is located in a page of a news portal that is dedicated to a specific category. Or it can be a stream of Facebook impressions with specific properties (i.e. Gender, Age, Country etc.). The channel can refer to Mobile App channels or to traditional Display channels. We can also help and identify the most prominent channels using Data Mining techniques.

One the registration is complete you can start and register new channels that will be optimized. Each channel should be registered separately. Use the registerNewChannel function for that purpose (If historical data is not available for the channel just ignore this parameter). The OPT System arrange the different campaigns in the different channels according to the number of estimated impressions each channel has, the budget of each campaign and other constraints (for example the buyer can specify that a specific campaign cannot be assign to a specific channel). The optimization is a continuos process which is govern by two functions, the first function (optimizeMultipleChannels) determines in which channel each campaign should be assigned and the second function (optimizeSingleChannel) determines the number of time each campaign should appear in the channel (the occurrences is governed by a weight).

 

The Mathematical Framework: The problem above can be described as a 2D matrix in which the placements are arranged along the rows and the campaigns along the columns (see figure 1). An i,j element that is greater than 0 indicates that campaign j should be placed in placement i  where the value of the element r is the percentage ratio of the campaign in the channel. The challenge is to find the elements  and their value which provide maximum yield.

 

API Functions

registerNewChannel (string jsonInput)

The Input:

jsonInput: {

{

  1. OwnerName”: “mds”,
  2. ChannelId”: 248,
  3. ChannelName”: “M133349u,
  4. SectionId”: 43,
  5. PublisherId”: 453,
  6. ChannelType”: “DISPLAY,”
  7. “VerticalId”: 4,
  8. “HistoricalData”:[{
  9. Date”: “2014-02-18“,
  10. ToolId”: 485,
  11. CampaignId”: 743,
  12. SubjectId”: 28,
  13. Impressions”: 48625,
  14. ImpressionsCost”: 0,
  15. ImpressionsValue”: 0,
  16. Clicks”: 0,
  17. ClickCost”: 0,
  18. ClickValue”: 0,
  19. Conversions”: 28,
  20. ConversionCost”: 44.28,
  21. ConversionValue”: 77

 }]

  1. The account name
  2. The unique channel ID
  3. The unique channel Name
  4. Future Versions
  5. Publisher ID
  6. Channel Type [POP,FACEBOOK,LDP,DISPLAY]
  7. The Channel Vertical Category
  8. Historical Daily Data (if available)
  9. Date
  10. A uniqueID
  11. Campaign ID
  12. The campaign’s Category ID
  13. Number of impressions
  14. CPM Cost
  15. CPM Model, Revenue
  16. Number of clicks
  17. CPC Cost
  18. CPC Model, Revenue
  19. Number of conversions
  20. CPA cost
  21. CPA Model, Revenue

Once the function is initiated the new project is registered and the benchmark eCPM (only of the previous month) is calculated.  The results are returned by the function:

The project will be stay in its LEARNING state until the system completes the statistical characteristics of the data and prepares the model.  During the learning state any request for weights will be answered by equally distributed weights for each campaign. At the end of this stage the model will be ACTIVATED.

In case the project name is already exist for the specified owner the function returns the last state of the project under the Last_Model object (campaign_ids and weights). The structure of the returned model is identical to the structure of the optimizeSinglePublishereCPM function.

Example:

{

                   “OwnerName”: “my_account”,

                   “ChannelId”: 1043,

                   “ChannelName”: “my_channel_2003″,

                   “ChannelType”: “BANNER”,

                   “SectionId”: 1,

                   “PublsiherId”: 42,

                   “VerticalId”: 4,

                   “HistoricalData”: []

              }

 

optimizeSinglePublishereCPM(string jsonInput)

The optimizeSinglePublishereCPM web service provides the weights that aim to optimize the publisher revenues. The weights control the number of times a specific campaign will be viewed.  We recommend to send two different calls, one for an aggregation of 1-4 weeks and the second a daily performance (setting the TimeFrame parameters to 1)

Input:

jsonInput: {

  1. 1. “OwnerName”: “mds”,
  2. 2.  “ChannelName”: my_channel,
  3. 3.  “ChannelId”: 1002
  4. 4.  “OptimizationType”: “eCPM”,
  5. 5.  “PerformanceData”: [  {
  6. 6.      “Date”: “2014-02-18″,
  7. 7.      “UniqueId”: 485,
  8. 8.      “CampaignId”: 743,
  9. 9.      “CategoryId”: 28,
  10. 10.      “EndDate”: “2014-02-28″,
  11. 11.      “BudgetLeft”: 4545.45,
  12. 12.      “Impressions”: 48625,
  13. 13.      “ImpressionsCost”: 0,
  14. 14.      “ImpressionsValue”: 0,
  15. 15.      “Clicks”: 0,
  16. 16.      “ClicksCost”: 0,
  17. 17.      “ClicksValue”: 0,
  18. 18.      “Conversions”: 28,
  19. 19.      “ConversionsCost”: 44.28,
  20. 20.      “ConversionsValue”: 77,
  21. 21.      “MinImpressions”: 4000    }, …
  1. 1.The owner name
  2. 2.Channel Name according to registry
  3. 3.Channel Id (for future usage)
  4. 4.eCPM/CONV
  5. 5.Performance Data of campaigns
  6. 6.Date
  7. 7.Unique ID
  8. 8.Campaign ID
  9. 9.Campaign’s Category ID
  10. 10.Campaign’s end date
  11. 11.The budget which is left
  12. 12.Number of impressions
  13. 13.CPM Cost
  14. 14.CPM Model, revenue
  15. 15.Number of Clicks
  16. 16.CPC Cost
  17. 17.CPC Model, Revenue
  18. 18.Number of Conversions
  19. 19.CPA Cost
  20. 20.CPA Model, Revenue
  21. 21.Min Impressions per Channel

Example:

{

        “OwnerName”: “the_owner”,

        “ChannelName”: “my_channel”,

        “PerformenceData”: [{

            “Date”: “2014-05-04″,

            “UniqueId”: 500,

            “CampaignId”: 544,

            “CategoryId”: 11,

            “Impressions”: 2596,

            “Clicks”: 0,

            “Conversions”: 0,

            “ClickCost”: 0,

            “ClickValue”: 0,

            “ImpressionsCost”: 0,

            “ImpressionsValue”: 0,

            “ConversionCost”: 0,

            “ConversionValue”: 60,

            “LeftBudget”: 2300,

            “EndDate”: “2014-05-23″,

            “MinImpressions”: 4000,

            },

            {

            “Date”: “2014-05-04″,

            “UniqueId”: 520,

            “CampaignId”: 564,

            “CategoryId”: 13,

            “Impressions”: 2546,

            “Clicks”: 0,

            “Conversions”: 2,

            “ClickCost”: 0,

            “ClickValue”: 0,

            “ImpressionsCost”: 0,

            “ImpressionsValue”: 0,

            “ConversionCost”: 0,

            “ConversionValue”: 80,

            “LeftBudget”: 4300,

            “EndDate”: “2014-05-23″,

            “MinImpressions”: 6000,

      }]

     }

The Output

In case the campaign is still under learning mode, the system returns equal weights to all campaigns. The statistical model returns an xml file with  a list of campaigns identified by their campaign id the returned fields are:

storeDailyPerformence (string jsonInput)

The storeDailyPerformence web service stores the daily performance of each channel. The input structure is identical to the optimizeSinglePublishereCPM, the function does not return any parameters, only indication that the process complete (status == 1)

Input:

jsonInput: {

  1. 1. “OwnerName”: “mds”,
  2. 2.  “ChannelName”: my_channel,
  3. 3.  “ChannelId”: 1002
  4. 4.  “OptimizationType”: “eCPM”,
  5. 5.  “PerformanceData”: [  {
  6. 6.      “Date”: “2014-02-18″,
  7. 7.      “UniqueId”: 485,
  8. 8.      “CampaignId”: 743,
  9. 9.      “CategoryId”: 28,
  10. 10.      “EndDate”: “2014-02-28″,
  11. 11.      “BudgetLeft”: 4545.45,
  12. 12.      “Impressions”: 48625,
  13. 13.      “ImpressionsCost”: 0,
  14. 14.      “ImpressionsValue”: 0,
  15. 15.      “Clicks”: 0,
  16. 16.      “ClicksCost”: 0,
  17. 17.      “ClicksValue”: 0,
  18. 18.      “Conversions”: 28,
  19. 19.      “ConversionsCost”: 44.28,
  20. 20.      “ConversionsValue”: 77,
  21. 21.      “MinImpressions”: 4000    }, …
  1. 1.The owner name
  2. 2.Channel Name according to registry
  3. 3.Channel Id (for future usage)
  4. 4.eCPM/CONV
  5. 5.Performance Data of campaigns
  6. 6.Date
  7. 7.Unique ID
  8. 8.Campaign ID
  9. 9.Campaign’s Category ID
  10. 10.Campaign’s end date
  11. 11.The budget which is left
  12. 12.Number of impressions
  13. 13.CPM Cost
  14. 14.CPM Model, revenue
  15. 15.Number of Clicks
  16. 16.CPC Cost
  17. 17.CPC Model, Revenue
  18. 18.Number of Conversions
  19. 19.CPA Cost
  20. 20.CPA Model, Revenue
  21. 21.Min Impressions per Channel

optimizeMultiplePublishereCPM

The optimizeMultiplePublishereCPM web service provides one of the most sophisticated algorithm for campaign distribution according to their performance estimation. The functions returns the weights that optimize the publishers revenues given list of campaigns. The weights control the number of times a specific campaign will be viewed in each publisher.

Input: {

  1. 1. “OwnerName”: “mds”,
  2. 2.  “ChannelNames”: [
  3. 3.  “my_channel1″,
  4. 4.  “my_channel2″,
  5. 5.  “my_channel3″,
  6. 6.],
  7. 7.ChannelIds”: [
  8. 8.  102,
  9. 9.  104,
  10. 10.  105,
  11. 11.],
  12. 12.  “Campaigns”: [{
  13. 13.”CampaignId”: 743,
  14. 14.      “CategoryId”: 28,
  15. 15.      “ConversionsValue”: 55,
  16. 16.”BudgetLeft”: 4545.45,
  17. 17.      “EndDate”: “2014-03-04″,
  18. 18.      “MinImpression”: 5000

    }, …

]}

  1. 1.The owner name
  2. 2.List of Channels
  3. 3.ChannelId1
  4. 4.ChannelId2
  5. 5.ChannelId3

Or List Of Channel Ids (for future usage, not implemented)

  1. 6.List of Campaigns
  2. 7.Campaign ID
  3. 8.Campaign’s Category ID
  4. 9.Lead Value
  5. 10.The budget which is left
  6. 11.Campaign’s end date
  7. 12.Min number of impressions in the channel

Example:

{

           “OwnerName”: “the_owner”,

           “ChannelNames”: [“my_channel1″, “my_channel2″],

           “Campaigns”: [{

                        “CampaignId”: 115,

                        “CategoryId”: 10,

                        “LeftBudget”: 540,

                        “ConversionsValue”: 80,

                        “EndDate”: 2014-07-04,

                        “MinImpressions”: 5000

                        },

                        {

                        “CampaignId”: 192,

                        “CategoryId”: 14,

                        “LeftBudget”: 21000,

                        “ConversionsValue”: 80,

                        “EndDate”: 2014-07-04,

                        “MinImpressions”: 5000

                        },

                        {

                        “CampaignId”: 395,

                        “CategoryId”: 3,

                        “ConversionsValue”: 80,

                        “LeftBudget”: 79000,

                        “EndDate”: 2014-07-04,

                        “MinImpressions”: 5000

                        },

                        {

                        “CampaignId”: 544,

                        “CategoryId”: 11,

                        “ConversionsValue”: 80,

                        “LeftBudget”: 79000,

                        “EndDate”: 2014-07-04,

                        “MinImpressions”: 5000

                        }]

                       }

The Output

The statistical model returns a matrix of publishers and campaigns (identified by their campaign id) in which the elements are the normalized weight: A zero weight means that the campaign should be removed

insertNewFilter

The function adds a new filter that sets a constraint between a campaign/category and a specific publisher. Each of the filter can either EXCLUDE campaign/category from being appear in a specific publisher or the opposite, requires that only specific campaign/category will appear in a specific publisher (INCLUDE). There is no limitation regarding the number of filters apply to each publisher as long as all the filters share the same operation (INCLUDE or EXCLUDE).

The Input (Json)

Input: {

  1. 1. “OwnerName”: “mds”,
  2. 2. “ChannelNames”: [“my_channel”,…
  3. 3.  “ChannelIds”: [1300,…
  4. 4. “CampaignIds”: 1322
  5. 5.  “SubjectId”: 0,
  6. 6.  “Operation”: INCLUDE

}

  1. 1.registered owner name
  2. 2.ChannelNames: array of channel registration names
  3. 3.ChannelIds: array of channel registration numbers
  4. 4.CampaignId: the campaign id to be INCLUDE or EXCLUDE
  5. 5.SubjectId: the category id to be INCLUDE or EXCLUDE

** remark: the insert function cannot insert both campaign_id and category_id in a single command. Once the campaign_id is specified the category_id should be equal zero and vice versa

  1. 6.operation: only two operations allow (INCLUDE/EXCLUDE)

The Output

If the operation is successful the status field returns 1 and a list with all the filters of the specified publisher is returned (including the new filter).

removeFIlter

The function removes a specific filter or all the filters of a specific publisher

The Input (Json)

Input: {

  1. 1. “OwnerName”: “mds”,
  2. 2. “ChannelNames”: [“my_channel”,
  3. 3.  “ChannelIds”: [1300, …
  4. 4.  “CampaignId”: 1322,
  5. 5.  “SubjectId”: 0,
  6. 6.  “Operation”: INCLUDE

}

  1. 1.registered owner name
  2. 2.ChannelNames: the array of channel  registration names
  3. 3.ChannelId: the array of channel  registration ids
  4. 4.CampaignId : the campaign_id to be removed
  5. 5.SubjectId: the category_id to be removed

** remark: the remove function cannot remove both campaign_id and category_id in a single command. Once the campaign_id is specified the category_id should be equal zero and  vice versa

** remark: if both category_id and campaign_id are zero the function removes ALL the filters of the specified publisher

The Output

If the operation is successful the status field returns 1 and a list with all the filters of the specified publisher is returned (without the filter that was removed).

getFilterList

The function returns the list of filters given a specific publisher

The Input (Json)

Input: {

  1. 1. “OwnerName”: “mds”,
  2. 2.  “ChannelName”: “my_channel”,
  3. 3.  “ChannelIds”: 1300
  1. 1.registered owner name
  2. 2.ChannelName: the channel  registration name
  3. 3.ChannelId: the channel  registration id

The Output

If the operation is successful the status field returns 1 and a list with all the filters of the specified publisher is returned.

Leave a Reply

Your email address will not be published. Required fields are marked *