Detailed walkthrough of calculations

Entity Definitions

Channels

ChannelDescription
webWebsite that is not primarily social or CTV
appMobile app that is not primarily social or CTV
socialA social platform (Snapchat, Facebook, etc)
ctv-bvodA TV-like streaming platform
streaming-videoWebsite or app with online video content
digital-audioAudio content (podcasts, streaming music)
doohDigital out of home - billboards, transit, etc
searchA Search engine (Google, Bing, etc)
linear-tvScheduled broadcast or cable television
traditional-radioScheduled audio broadcast

Device Types

Device typeDescription
phoneA phone
tabletA tablet
pcA pc with a monitor or a laptop
tvA TV
smart-speakerA smart speaker - Amazon Echo or equivalent

Network Types

Network typeDescription
mobileA mobile network (3G/4G/5G)
fixedA fixed network (broadband)

Video Player

FieldDescription
size_bytesSize of the javascript/html for a video player if present
buffering_secondsVideo player buffering - if player preloads content, leave blank
download_triggerWhat starts the content download - impression, view (ie lazy load), play

Ad Format

FieldDescription
rendered_width_pixelsWidth of the creative when rendered. Leave blank for responsive (will assume screen width)
rendered_height_pixelsHeight of the creative when rendered. Leave blank for responsive (will assume screen height)
image_sizesArray of image dimensions (eg ["300x250", "70x70"])
audio_duration_secondsAudio duration (if applicable)
video_duration_secondsVideo duration (if applicable)
video_playerVideo player used to render video (if applicable)
other_assets_bytesMetadata, text, html, etc
ad_platformsAd serving, verification, and measurement ad platforms wrapping or embedded in the ad format

Sample Ad Formats:

300x250 programmatic banner
image_sizes = ['300x250']
rendered_width_pixels = 300,
rendered_height_pixels = 250
30 second audio inserted into a podcast
audio_duration_seconds = 30
15 second outstream video
video_duration_seconds = 15;
video_player = 'default',
rendered_width_pixels = 500,
rendered_height_pixels = 400
Native product carousel
  image_sizes = ['400x400','400x400','400x400'],
  other_assets_bytes = 7321,
  rendered_height_pixels = 600,
  rendered_width_pixels = 450

Property

FieldDescription
channelsThe channel(s) of this property
average_seconds_per_session_excluding_adsThe average length of a session on this property excluding ads (eg 44 min of a 60 min TV show)
average_imps_per_sessionThe average number of impressions per session
average_data_kb_per_session_excluding_adsThe average number of KB transferred during a session excluding ads
video_bitrate_kbpsThe average bitrate for a CTV-BVOD property (e.g. 4200 kbps)
ad_funded_percentage0-100 The percentage of content funded by advertising (eg 50)
allocated_adjusted_corporate_emissions_kgco2eThis property’s share of corporate emissions
total_sessionsNumber of sessions in the same time period as corporate emissions
organization_model_qualityParent organization model quality (1-5)
model_qualityModel quality (1-5)

Ad Platform

FieldDescription
emissions_per_creative_request_per_geo_gco2_per_impAdjusted, allocated emissions per creative request by continent (NAMER, LATAM, EMEA, JAPAC)
usage_emissions_per_bid_request_per_geo_gco2_per_impAdjusted, allocated emissions per bid request by continent (NAMER, LATAM, EMEA, JAPAC)
usage_emissions_per_rtdp_request_per_geo_gco2_per_impAdjusted, allocated emissions per rtdp request by continent (NAMER, LATAM, EMEA, JAPAC)
biddersArray of ad platforms that are sent bid requests
real_time_data_providersArray of ad platforms that are sent real-time data requests (not propagated)
distribution_rate_by_bidder_by_countryTraffic shaping data for each bidder by country (eg 'xandr.com', 'US', 0.58)
average_bid_request_sizeAverage size of a client-side bid request
sends_client_side_requestsDoes this platform send client-side bid requests (eg prebid client)
model_qualityModel quality (1-5)

Placement

FieldDescription
ad_platformsThe ad platforms called by this placement

Delivery Row

FieldDescription
impressionsThe number of impressions counted (required for all channels other than DOOH)
viewsThe number of views counted
playsThe number of plays (required for DOOH)
utc_datetimeDate and time, in UTC, when impressions were delivered
countryThe country where the impression was delivered
regionThe region of the country where the impression was delivered
channelSee channels
device_typeSee device types
network_typeSee network types
propertySee property
creative_ad_formatEither a basic or vendor-provided ad format
creative_ad_platformsAd serving, verification, and measurement ad platforms wrapping or embedded in the creative
creative_total_image_data_transfer_bytesTotal bytes for the data transfer for the image itself for all impressions, ideally measured by the CDN
creative_image_sizesArray of image sizes included in the creative
creative_total_audio_data_transfer_bytesTotal bytes for the data transfer for the core audio asset for all impressions, ideally measured by the CDN
creative_audio_duration_secondsAverage audio duration in seconds for a single impression
creative_total_video_data_transfer_bytesTotal bytes for the data transfer for the core video asset for all loads, ideally measured by the CDN
creative_video_vast_bytesAverage size of VAST/VPAID wrapper for the video in bytes for a single load
creative_video_bitrate_kbpsVideo bitrate as delivered in kilobits per second
creative_video_size_bytesAverage video size as delivered in bytes for a single load
creative_video_duration_secondsVideo duration in seconds
creative_video_view_time_secondsAverage time, in seconds, that a video is viewed
creative_video_view_rateAverage percentage of a video that is viewed
creative_time_in_view_secondsTime that the creative was visible on the device
creative_is_3p_servedIs the ad format served by a third party ad server

Defaults

Conventional model data transfer by network type

The Scope3 values below are from GMSF 1.2. SRI values from SRIxAD database 2.1, original source ADEME_220830_v1.4 (now considered outdated).
default_usage_kwh_per_gb:
  scope3:
    fixed:  0.0165
    mobile: 0.117
  sri:
    fixed:  0.0687
    mobile: 0.236
default_network_embodied_emissions_gco2e_per_kb:
  scope3:
    fixed:  0.00000214
    mobile: 0.00000870
  sri:
    fixed:  0.00000443
    mobile: 0.00000797

Power model data transfer by network type

From Carbon impact of video streaming (Carbon Trust), Table 5; and calculated here
default_baseload_watts:
  fixed:     9.55
  mobile:    1.2
default_dynamic_watts_per_mbps:
  fixed:    0.030
  mobile:    1.53

Mobile to fixed ratios by country

From ITU Data Hub (2024 data), these ratios do not apply to TV and Smart Speakers for which a specific default_percent_mobile_by_device_type is set.
default_percent_mobile:
  scope3: 23.6
  sri:    10.0
default_percent_mobile_by_country:
  scope3:
    AD: 2.982
    AE: 12.538
    AL: 11.136
    AM: 12.329
    AO: 81.256
    AT: 42.451
    AU: 10.022
    AZ: 3.017
    BD: 47.386
    BE: 6.379
    BG: 14.554
    BH: 37.964
    BJ: 80.867
    BR: 14.080
    BS: 6.093
    BT: 99.203
    BW: 50.891
    BY: 18.362
    CA: 3.853
    CH: 17.137
    CI: 45.733
    CL: 16.351
    CM: 23.455
    CN: 13.541
    CO: 39.500
    CR: 7.691
    CU: 83.348
    CV: 23.001
    CY: 14.170
    CZ: 8.683
    DE: 6.048
    DJ: 72.578
    DK: 15.555
    DZ: 31.775
    EC: 13.019
    EG: 18.791
    ES: 9.643
    ET: 46.640
    FI: 40.870
    FR: 48.973
    GB: 5.660
    GE: 10.658
    GH: 85.514
    GQ: 99.999
    GR: 13.514
    HK: 16.645
    HN: 43.333
    HR: 23.090
    HU: 13.856
    ID: 66.646
    IE: 14.068
    IN: 68.162
    IQ: 9.969
    IR: 75.197
    IS: 18.209
    IT: 17.130
    JM: 13.521
    JO: 32.758
    JP: 16.092
    KE: 40.356
    KG: 51.686
    KM: 99.934
    KR: 8.777
    KW: 88.149
    KZ: 46.552
    LI: 5.123
    LK: 69.934
    LS: 70.932
    LV: 30.723
    MA: 30.585
    MC: 7.871
    ME: 18.232
    MG: 50.644
    MK: 13.946
    MN: 36.233
    MU: 21.725
    MV: 5.177
    MW: 98.758
    MX: 11.922
    MY: 52.676
    NG: 99.451
    NI: 51.951
    NZ: 4.667
    OM: 10.984
    PF: 21.958
    PK: 50.498
    PL: 13.454
    PT: 8.261
    QA: 15.876
    RO: 12.554
    RS: 22.423
    RU: 23.846
    RW: 39.736
    SA: 22.528
    SC: 27.379
    SI: 14.154
    SK: 15.316
    SM: 7.767
    SN: 45.455
    ST: 16.373
    TG: 10.455
    TH: 36.910
    TN: 15.826
    TR: 19.035
    TT: 6.732
    TW: 26.130
    TZ: 98.330
    UG: 92.443
    US: 5.723
    UY: 14.077
    UZ: 59.382
    VE: 4.700
    VN: 8.577
    VU: 97.689
    YE: 16.667
    ZA: 35.193
    ZW: 22.887
default_percent_mobile_by_device_type:
  scope3:
    tv: 0.001
    smart-speaker: 0.001

Video player characteristics

Default video player size from GMSF 1.2
default_video_player_size_bytes: 350000
default_video_player_download_trigger:
  web:      'impression'
  app:      'impression'
  ctv-bvod: 'impression'
  streaming-video: 'impression'
  dooh:     'play'
  social:   'impression'

Media size

Based on YouTube recommendations, Wikipedia
default_image_compression_ratio:   10
default_non_primary_video_bitrate_kbps: 1200
default_video_bitrate_kbps:
  phone:           800
  tablet:          1000
  pc:              1200
  tv:              3690
default_audio_bitrate_kbps:
  phone:            160
  tablet:           160
  pc:               160
  tv:               160
  smart-speaker:    160
  radio:            160

Device size

From common devices (Quad HD 27” monitor, iPhone 13, Nexus 5X, iPad Air 1/2, iPad 2/3, Nexus 9, 1080P TV). Note: We use the software resolution, not the hardware resolution, to avoid underestimating the actual visual coverage of the ad displayed on screen.
default_rendered_device_height:
  pc: 1080
  phone: 844
  tablet: 820
  tv: 1080
default_rendered_device_width:
  pc: 1920
  phone: 390
  tablet: 1180
  tv: 1920

Device energy use and embodied emissions

See Consumer Devices
default_device_watts:
  scope3:
    pc: 55.44
    phone: 4.68
    radio: 6.55
    smart-speaker: 2.5
    tablet: 5.04
    tv: 136.8
  sri:
    phone:          2.856
    pc:            29.4
    tablet:        29.4
    tv:            81.6
default_device_embodied_emissions_per_second:
  scope3:
    phone:          0.00655
    pc:             0.00545
    tablet:         0.0257
    tv:             0.00865
    smart-speaker:  0.0061
    radio:          0.002514375
  sri:
    phone:          0.00946
    pc:             0.0132
    tablet:         0.0128
    tv:             0.00889
default_audio_power_utilization:
  pc: 0.84
  phone: 0.36
  tablet: 0.36
  tv: 0.92
  smart-speaker: 1.0
  radio: 1.0
default_device_usage_emissions_from_fuel_consumption_per_second:
  phone:          0
  pc:             0
  tablet:         0
  tv:             0
  smart-speaker:  0
  radio:          0.005

Time in view for non-video ads

Default in view time from GMSF 1.2
default_time_in_view_seconds: 3

Ad platform defaults

Observations from various channels and CDN / Edge Node emission factors from GMSF 1.2
default_consumer_device_request_size_bytes:
  web:             3000
  app:             3000
  ctv-bvod:        3000
  dooh:            3000
  audio:           3000
  social:          3000
  streaming-video: 3000
  search: 300

default_emissions_per_creative_request_gco2_per_imp: 0.0003
default_emissions_per_bid_request_gco2_per_imp:      0.11442
default_emissions_per_rtdp_request_gco2_per_imp:     0.01
default_emissions_generic_ad_server_gco2_per_imp: 0.000016
default_emissions_generic_ad_server_gco2_per_imp_by_channel:
  social: 0.0043
default_emissions_ad_selection_gco2_per_imp_by_channel:
  search: 0.0012293
  dooh: 0.00384
default_count_ad_platform:
  search: 1
  dooh: 6

generic_creative_ad_server:
  emissions_per_creative_request_per_geo_gco2_per_imp:
    NAMER: 0.0001
    EMEA: 0.0001
    JAPAC: 0.0003
    LATAM: 0.0001
generic_measurement_platform:
  emissions_per_creative_request_per_geo_gco2_per_imp:
    NAMER: 0.0001
    EMEA: 0.0001
    JAPAC: 0.0003
    LATAM: 0.0001
default_platform_embodied_emissions_per_bid_request_gco2e_per_imp: 0.000015
edge_node_embodied_gco2e_per_kb: 0.000000588
edge_node_use_watts_per_kb: 0.00000043

Channel and device type mappings

The default ad formats for the Web and App channels are based on the GMSF 1.2 defaults for creative payload.
default_channel_by_device:
  phone:
    - social
    - ctv-bvod
    - digital-audio
    - app
    - web
    - search
    - streaming-video
    - linear-tv
    - traditional-radio
  tablet:
    - social
    - ctv-bvod
    - digital-audio
    - app
    - web
    - search
    - streaming-video
    - linear-tv
    - traditional-radio
  pc:
    - ctv-bvod
    - social
    - digital-audio
    - web
    - search
    - streaming-video
    - linear-tv
    - traditional-radio
  tv:
    - linear-tv
    - ctv-bvod
    - digital-audio
    - traditional-radio
  smart-speaker:
    - digital-audio
  radio:
    - traditional-radio
default_device_by_channel:
  social:          phone
  ctv-bvod:        tv
  streaming-video: pc
  digital-audio:   phone
  app:             phone
  web:             pc
  dooh:            tv
  linear-tv:       tv
  search:          phone
  traditional-radio: radio
default_platform_ad_format_identifier_by_channel:
  dooh:               landscape-dooh
  social:             1080-1920-sponsored-post-social-phone
  ctv-bvod:           15s-video-ctv-bvod-tv
  streaming-video:    15s-video-streaming-video-pc
  digital-audio:      30s-audio-digital-audio-phone
  app:                generic-gmsf-1-2-display-ad-app-phone
  web:                generic-gmsf-1-2-display-ad-web-pc
  linear-tv:          30s-video-ctv-bvod-tv
  search:             generic-search-ad-search-phone
  traditional-radio:  30s-radio-traditional-radio-radio
default_platform_ad_format_by_channel:
  dooh:     Landscape - 1920x1080 Image
  social:   Sponsored Post - 1080x1920 Image
  ctv-bvod: 15s Video
  streaming-video: 15s Video
  digital-audio:    30s Audio
  app:      Generic GMSF 1.2 Display Ad
  web:      Generic GMSF 1.2 Display Ad
  linear-tv: 30s Video
  search:    Generic Search Ad
  traditional-radio: 30s Radio
default_property_average_imps_per_session_by_channel:
  social:   24
  ctv-bvod: 18
  streaming-video: 1
  digital-audio:    4.8
  app:      14
  web:      32
  linear-tv: 30
  search: 12
  traditional-radio: 21.5
default_property_ad_funded_percentage_by_channel:
  dooh:     100
  social:   100
  ctv-bvod: 100
  streaming-video: 100
  digital-audio:    100
  app:      100
  web:      100
  linear-tv: 100
  search:    100
  traditional-radio: 100
default_average_seconds_per_session_excluding_ads_by_channel:
  social:   240
  ctv-bvod: 2580
  streaming-video: 300
  digital-audio:    1500
  app:      140
  web:      320
  linear-tv: 2580
  search:    120
  traditional-radio: 2580
default_average_data_kb_per_session_seconds_excluding_ads_by_channel:
  social:   38
  app:      29.5
  web:      1.011
  search:   1.011
default_property_g_per_imp_by_channel:
  dooh:     0.049
  social:   0.15
  streaming-video: 0.049
  ctv-bvod: 0.280
  digital-audio:    0.049
  app:      0.049
  web:      0.049
  search: 0.049

Broadcasting defaults

default_percent_tv_distribution_method:
  cable: 28.6
  iptv: 25.2
  ota: 26.2
  satellite: 20
default_percent_tv_distribution_method_by_country:
  AU:
    cable: 9.2
    iptv: 40.8
    ota: 45.4
    satellite: 4.6
  DE:
    cable: 41.5
    iptv: 9.6
    ota: 3.4
    satellite: 45.5
  FR:
    cable: 0
    iptv: 46
    ota: 46
    satellite: 8
  GB:
    cable: 8.9
    iptv: 27.5
    ota: 40.6
    satellite: 23
  US:
    cable: 43.3
    iptv: 20.7
    ota: 19.3
    satellite: 16.7
default_tv_signal_preparation_power_watt: 16700
default_tv_signal_transmission_power_by_tv_distribution_method_watt:
  cable: 16000
  ota: 165000
  satellite: 3150
default_tv_signal_transmission_embodied_gco2e_per_second: 27
default_tv_home_equipment_power_by_tv_distribution_method_watt:
  cable: 16
  iptv: 21
  ota: 1
  satellite: 22
default_tv_home_equipment_embodied_gco2e_per_second_by_tv_distribution_method:
  cable: 0.005346759
  iptv: 0.005492307
  ota: 0.001354252
  satellite: 0.011423331
default_device_per_impression:
  app: 1
  digital-audio: 1
  ctv-bvod: 1
  linear-tv: 0.667
  streaming-video: 1
  web: 1
  traditional-radio: 0.667
default_property_g_per_play_by_channel:
  linear-tv: 790
  traditional-radio: 790
default_iptv_network_distribution:
  fixed: 0.999
  mobile: 0.001
default_percent_radio_distribution_method:
  fm: 60
  am: 15
  ota: 20
  satellite: 5
default_radio_signal_transmission_power_by_radio_distribution_method_watt:
  fm: 245000
  am: 273000
  ota: 106000
  satellite: 3150
default_radio_signal_transmission_embodied_by_radio_distribution_method_gco2e_per_second:
  fm: 7
  am: 10
  ota: 5
  satellite: 6

Creative storage defaults

Emission factors from GMSF 1.2, along with assumptions on average distribution per storage type, default multipliers to estimate the required storage space based on the delivered creative size and default impressions per creative.
default_impressions_per_creative: 1000000
default_storage_kgco2e_per_gb:
  cloud_storage: 0.0253
  hard_disk_drive: 0.16
  linear_tape_open: 0.00114
  solid_state_drive: 0.02
default_storage_usage_pct:
  cloud_storage: 45
  hard_disk_drive: 25
  linear_tape_open: 10
  solid_state_drive: 20
creative_raw_asset_size_factor_by_channel:
  app: 20
  ctv-bvod: 50
  digital-audio: 5
  dooh: 5
  linear-tv: 50
  search: 0
  social: 20
  streaming-video: 20
  traditional-radio: 5
  web: 20
creative_work_iterations_factor_by_channel:
  app: 1
  ctv-bvod: 1
  digital-audio: 1
  dooh: 1
  linear-tv: 1
  search: 1
  social: 1
  streaming-video: 1
  traditional-radio: 1
  web: 1

Lookups from external sources

Carbon intensity by country, region, and UTC Date/Time

Providers should clearly and publicly document:
  • Which data provider is used for carbon intensity data (for instance, WattTime or ElectricityMaps)
  • What carbon intensity metric is used (marginal vs average)
lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime) should look up the carbon intensity in gCO2e based on 100-year global warming potential (GWP100) from a database at no less than hourly granularity. lookup_carbon_intensity_quality(country, region) should return the quality of the underlying grid mix data on a scale of 1-5 per Model Quality.

Fallbacks

We use all data we have available on every single request but in many situations we may lack some information, for this we have a series of fallbacks to be able to provide reasonable estimates in most situations. To determine network when it’s not submitted we calculate costs associated to network type as a weighted average of the fixed and mobile usage in the country (if available) or worldwide. We can also generally determine the channel from the property or when that is ambiguous but we have device information we fall back to a default channel by device.
  pct_mobile =
      country ?
      default_percent_mobile_by_country[country] / 100 :
      default_percent_mobile / 100

  average_embodied_emissions_gco2e_per_kb =
      default_network_embodied_emissions_gco2e_per_kb['mobile'] x pct_mobile +
      default_network_embodied_emissions_gco2e_per_kb['fixed'] x (1 - pct_mobile)

  embodied_emissions_gco2e_per_kb =
      network_type ?
      default_network_embodied_emissions_gco2e_per_kb[network_type] :
      average_embodied_emissions_gco2e_per_kb

  average_usage_kwh_per_gb =
      default_usage_kwh_per_gb['mobile'] x pct_mobile +
      default_usage_kwh_per_gb['fixed'] x (1 - pct_mobile)

  usage_kwh_per_gb =
      network_type ?
      default_usage_kwh_per_gb['network_type'] :
      average_usage_kwh_per_gb

  average_baseload_watts =
      default_baseload_watts['mobile'] x pct_mobile +
      default_baseload_watts['fixed'] x (1 - pct_mobile)

  average_dynamic_watts_per_mbps =
      default_dynamic_watts_per_mbps['mobile'] x pct_mobile +
      default_dynamic_watts_per_mbps['fixed'] x (1 - pct_mobile)

  baseload_watts =
      network_type ?
      default_baseload_watts[network_type] :
      average_baseload_watts

  dynamic_watts_per_mbps =
      network_type ?
      default_dynamic_watts_per_mbps[network_type] :
      average_dynamic_watts_per_mbps

  lookup_channel:
      if property.channels.length == 1:
            return property.channels[0]
      if channel && channel in property.channels:
            return channel
      is_audio_creative =
            creative_audio_data_transfer_bytes ||
            creative_audio_duration_seconds ||
            ad_format.audio_duration_seconds
      if is_audio_creative && 'audio' in property.channels:
            return 'audio'
      if device_type && default_channel_by_device[device_type] in property.channels:
            return default_channel_by_device[device_type]
      return property.channels[0]

      channel = lookup_channel()
      device_type = device_type ? default_device_by_channel[channel]

Calculating Emissions

Tech Manipulation - Creative Storage

creative_storage_gco2_per_imp =
(default_linear_tape_open_storage_kgco2e_per_gb * default_linear_tape_open_storage_usage_pct
+ default_hard_disk_drive_storage_kgco2e_per_gb * default_hard_disk_drive_storage_usage_pct
+ default_solid_state_drive_storage_kgco2e_per_gb * default_solid_state_drive_storage_kgco2e_per_gb
+ default_cloud_storage_kgco2e_per_gb * default_cloud_storage_usage_pct)
* 1000
* ((creative_data_transfer_bytes * creative_raw_asset_size_factor[Channel] + creative_data_transfer_bytes * creative_work_iterations_factor[Channel]) / 1000000000)
/ default_impressions_per_creative

Creative Delivery - Data Transfer

creative_data_transfer_emissions_gco2_per_imp =
      creative_data_transfer_usage_emissions_gco2_per_imp +
      creative_data_transfer_embodied_emissions_gco2_per_imp
For all channels other than CTV/BVOD, use the conventional model:
creative_data_transfer_bytes =
      video_bytes +
      audio_bytes +
      image_bytes +
      ad_format.video_player.size_bytes +
      ad_format.other_asset_bytes

creative_data_transfer_usage_emissions_gco2 =
      creative_data_transfer_bytes / 1000 x
      usage_kwh_per_gb / 1000000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)

creative_data_transfer_embodied_emissions_gco2 =
      creative_data_transfer_bytes / 1000 x
      embodied_emissions_gco2e_per_kb
If data transfer is provided in the delivery row, use it:
image_bytes = creative_total_image_data_transfer_bytes
video_bytes = creative_total_video_data_transfer_bytes + (creative_video_vast_bytes x loads)
audio_bytes = creative_total_audio_data_transfer_bytes
Otherwise, calculate data transfer:
image_sizes = creative_image_sizes ? ad_format.image_sizes
image_bytes = SUM(image_sizes[n].width x image_sizes[n].height) x 3 / default_image_compression_ratio x impressions

audio_duration = creative_audio_duration_seconds ?? ad_format.audio_duration_seconds
audio_bytes = audio_duration_seconds x default_audio_bitrate_kbps[device_type] / 8 x 1000 x impressions

is_primary_experience = !ad_format.rendered_width_pixels && !ad_format.rendered_height_pixels
default_bitrate_kbps =
      is_primary_experience ?
      default_video_bitrate_kbps[device_type] :
      default_non_primary_video_bitrate_kbps
video_bitrate_kbps =
      creative_video_bitrate_kbps ??
      creative_video_size_bytes x 8 / 1000 / creative_video_duration  ??
      property.video_bitrate_kbps[device_type] ??
      default_bitrate_kbps
video_duration = creative_video_duration_seconds ?? ad_format.video_duration_seconds
seconds_watched = creative_video_view_time_seconds ??
                  creative_video_view_rate x video_duration_seconds ??
                  video_duration_seconds
buffer = ad_format.video_player.buffering_seconds ?? infinity
seconds_streamed = MIN(seconds_watched + buffer, video_duration_seconds)
loads = switch(ad_format.video_player.download_trigger):
            'view': views
            'play': plays
            'impression': impressions


video_bytes = (video_bitrate_kbps / 8 x 1000 x seconds_streamed + creative_video_vast_bytes) x loads
For CTV/BVOD, use the power model:
video_bitrate_kbps =
      creative_video_bitrate_kbps ??
      property.video_bitrate_kbps[device_type] ??
      default_video_bitrate_kbps[device_type]

power_watts =
      baseload_watts +
      dynamic_watts_per_mbps x video_bitrate_kbps / 1000

creative_data_transfer_usage_emissions_gco2_per_imp =
      creative_video_duration_seconds / 3600 x
      power_watts / 1000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)

creative_data_transfer_embodied_emissions_gco2_per_imp =
      creative_video_duration_seconds x
      video_bitrate_kbps / 128 x
      embodied_emissions_gco2e_per_kb

Creative Delivery - Platform

default_creative_platforms =
      creative_is_3p_served ?
      [generic_creative_ad_server, generic_measurement_platform] :
      []
creative_platforms = creative_ad_platforms ?? default_creative_platforms

creative_platform_emissions_gco2_per_imp = 0
for platform in [creative_platforms, ad_format.ad_platforms]:
			emissions_per_creative_request_per_geo_gco2_per_imp =
				platform.emissions_per_creative_request_per_geo_gco2_per_imp ??
				((creative_data_transfer_bytes / 1000) x
				(edge_node_use_watts_per_kb / 1000) x
				lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime))
				+
				(creative_data_transfer_bytes / 1000 x
				edge_node_embodied_gco2e_per_kb)

      creative_platform_emissions_gco2_per_imp += emissions_per_creative_request_per_geo_gco2_per_imp

Creative Delivery - Consumer Device

device_pixels = default_rendered_device_width[device_type] x default_rendered_device_height[device_type]
rendered_width = ad_format.rendered_width_pixels ?? default_rendered_device_width[device_type]
rendered_height = ad_format.rendered_height_pixels ?? default_rendered_device_height[device_type]
visual_device_coverage =
      is_primary_experience ?
      1 :
      MIN(1, rendered_width x rendered_height / device_pixels)
time_in_view =
      video_duration ??
      creative_time_in_view_seconds ??
      default_time_in_view_seconds

if channel == digital-audio :
	device_power_utilization == 'smart-speaker' ? 1 : default_audio_power_utilization[device_type]
	energy_adjusted_active_seconds = device_power_utilization * audio_duration
else:
	energy_adjusted_active_seconds = visual_device_coverage x time_in_view

creative_consumer_device_usage_emissions_gco2_per_imp =
      device_coverage_seconds / 3600 x
      default_device_watts[device_type] / 1000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)
      + default_device_usage_emissions_from_fuel_consumption_per_second[device_type]

creative_consumer_device_embodied_emissions_gco2_per_imp =
      device_coverage_seconds x
      default_device_embodied_emissions_per_second[device_type]

Media Delivery - Data Transfer

media_data_transfer_emissions_gco2_per_imp =
      media_data_transfer_usage_emissions_gco2_per_imp +
      media_data_transfer_embodied_emissions_gco2_per_imp
Determing the session seconds for a single impressions
session_seconds_per_imp =
      property.average_seconds_per_session_excluding_ads x
      property.ad_funded_percentage/100 /
      property.average_imps_per_session
For all channels other than CTV/BVOD, use the conventional model:
media_data_transfer_kb_per_imp =
      property.average_data_kb_per_session_excluding_ads x
      property.ad_funded_percentage/100  /
      property.average_imps_per_session

media_data_transfer_usage_emissions_gco2_per_imp =
      media_data_transfer_kb_per_imp x
      usage_kwh_per_gb / 1000000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)

media_data_transfer_embodied_emissions_gco2_per_imp =
      media_data_transfer_kb_per_imp x
      embodied_emissions_gco2e_per_kb
For CTV/BVOD, use the power model:
video_bitrate_kbps = property.video_bitrate_kbps[device_type] ?? default_video_bitrate_kbps[device_type]

power_watts =
      baseload_watts +
      dynamic_watts_per_mbps x video_bitrate_kbps / 1000

media_data_transfer_usage_emissions_gco2_per_imp =
      session_seconds_per_imp / 3600 x
      power_watts / 1000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)

media_data_transfer_embodied_emissions_gco2_per_imp =
      session_seconds_per_imp x
      video_bitrate_kbps / 128 x
      embodied_emissions_gco2e_per_kb

Media Delivery - Consumer Device

media_consumer_device_usage_emissions_gco2_per_imp =
      session_seconds_per_imp / 3600 x
      default_device_watts[device_type] / 1000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)
      + default_device_usage_emissions_from_fuel_consumption_per_second[device_type]

media_consumer_device_embodied_emissions_gco2_per_imp =
      session_seconds_per_imp x
      default_device_embodied_emissions_per_second[device_type]

Media Delivery - Corporate

media_corporate_emissions_gco2_per_imp =
      property.allocated_adjusted_corporate_emissions_kg x 1000 /
      property.total_sessions /
      property.average_imps_per_session

Ad Selection - Platform

get_platform_emissions(ad_platform):
      direct_emissions = usage_emissions_per_bid_request_per_geo_gco2_per_imp + default_platform_embodied_emissions_per_bid_request_gco2e_per_imp
      rtdp_emissions = 0
      for rtdp in ad_platform.real_time_data_providers:
            rtdp_emissions += usage_emissions_per_rtdp_request_per_geo_gco2_per_imp + default_platform_embodied_emissions_per_bid_request_gco2e_per_imp
      bidder_emissions = 0
      for bidder in ad_platform.bidders:
            bidder_emissions += get_platform_emissions(bidder) x
                  ad_platform.distribution_rate_by_bidder_by_country[country, bidder] ?? 1
      return direct_emissions + rtdp_emissions + bidder_emissions

ad_selection_platform_emissions_gco2_per_imp = 0
data_transfer_bytes = 0

if channel in ['search', 'dooh']:
      data_transfer_bytes = default_count_ad_platform[channel] * default_consumer_device_request_size_bytes[channel]
      ad_selection_platform_emissions_gco2_per_imp = default_emissions_ad_selection_gco2_per_imp_by_channel[channel]
else:
      for platform in placement.ad_platforms:
            ad_selection_platform_emissions_gco2_per_imp += get_platform_emissions(platform)
            platform_bytes =
                  platform.average_bid_request_size ??
                  default_consumer_device_request_size_bytes[channel]
            data_transfer_bytes += default_consumer_device_request_size_bytes[channel]
            if platform.sends_client_side_requests:
                  for bidder in platform.bidders:
                        bidder_bytes =
                              bidder.average_bid_request_size ??
                              default_consumer_device_request_size_bytes[channel]
                        data_transfer_bytes +=
                              bidder_bytes x
                              platform.distribution_rate_by_bidder_by_country[country, bidder] ?? 1

Ad Selection - Data Transfer

ad_selection_data_transfer_usage_emissions_gco2_per_imp =
      data_transfer_bytes / 1000 x
      usage_kwh_per_gb / 1000000 x
      lookup_carbon_intensity_gco2e_per_kwh(country, region, utc_datetime)

ad_selection_data_transfer_embodied_emissions_gco2_per_imp =
      data_transfer_bytes / 1000 x
      embodied_emissions_gco2e_per_kb

ad_selection_data_transfer_emissions_gco2_per_imp =
      ad_selection_data_transfer_usage_emissions_gco2_per_imp +
      ad_selection_data_transfer_embodied_emissions_gco2_per_imp

Model Quality

grid_mix_model_quality = lookup_carbon_intensity_quality(country, region)
organization_model_quality = property.organization_model_quality
property_model_quality = property.model_quality

total_platforms = 0
modeled_platforms = 0
for platform in placement.ad_platforms:
  total_platforms++
  if platform.model_quality > 1
    modeled_platforms++
  # Model one level of downstream platforms
  for bidder in ad_platform.bidders:
    total_platforms++
    if bidder.model_quality > 1
      modeled_platforms++
ad_platform_modeled_ratio = modeled_platforms / total_platforms