For ROAS related metrics, it is important to use a combination of filters to specify exactly how to compute the ROAS metric. Important filters include attribution_window
, time_preset
(lookback window), and hours_since_creation
here. ROAS stands for Return On Advertisement Spending.
For example, if you want to compute 7D Click Mobile App Purchase ROAS, but only want 7 days of mature data:
attribution_window
of 7D_CLICK
time_preset
of LAST_ND_14_8
This attributes all mobile app purchase values within 7 days of users who clicked on the ad in the lookback window, excluding the most recent 7 days since they include immature data. If the user clicked on the ad yesterday, we do not include that user in the ROAS computation, since they still have 6 days of potential purchases.
By purchase values, this refers to the values of Mobile App Purchase events and Website Conversion Purchase (FB Pixel) events for the respective ROAS metrics. In the API, this would mean the purchase values of the app_custom_event.fb_mobile_purchase
and offsite_conversion.fb_pixel_purchase
count metrics, respectively.
If the attribution window includes both click and view windows, the computed ROAS is the sum of the values. For example, if our attribution_window
is 1D_VIEW_7D_CLICK
, we take the 1D_VIEW
ROAS value and 7D_CLICK
ROAS value and compute the sum. This is because the two attributions are disjoint and can correctly be added together without overlap.
An optimal use of this metric also includes some time-based filter, to make sure enough days have elapsed for there to be mature data. If the use case requires mature data, we recommend a filter such as hours_since_creation
to ensure that the ad set has been running long enough.
Here's an example rule that:
0.50
(50%) Since these rules are heavily specific, they usually apply to a specific list of ad sets, such as id
= 123
. We use 8*24
for hours since creation to get at least one full day of mature data.
curl \ -F 'name=Test Website ROAS Rule' \ -F 'schedule_spec={ "schedule_type": "DAILY" }' \ -F 'evaluation_spec={ "evaluation_type": "SCHEDULE", "filters": [ { "field": "id", "value": [123], "operator": "IN" }, { "field": "time_preset", "value": "LAST_ND_14_8", "operator": "EQUAL" }, { "field": "attribution_window", "value": "7D_CLICK", "operator": "EQUAL" }, { "field": "hours_since_creation", "value": 192, "operator": "GREATER_THAN" }, { "field": "website_purchase_roas", "value": 0.50, "operator": "GREATER_THAN" } ] }' \ -F 'execution_spec={ "execution_type": "CHANGE_BUDGET", "execution_options": [ { "field": "change_spec", "value": { "amount": 20, "unit": "PERCENTAGE" }, "operator": "EQUAL" }, ] }' \ -F "access_token=<ACCESS_TOKEN>" \ https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library
Here's an example rule that:
Again, to get only mature data, use time presets that do not include today's data, such as LAST_7D
and LAST_14D
.
curl \ -F 'name=Test Mobile App ROAS Rule' \ -F 'schedule_spec={ "schedule_type": "DAILY" }' \ -F 'evaluation_spec={ "evaluation_type": "SCHEDULE", "filters": [ { "field": "id", "value": [123], "operator": "IN" }, { "field": "time_preset", "value": "LAST_7D", "operator": "EQUAL" }, { "field": "attribution_window", "value": "1D_VIEW_1D_CLICK", "operator": "EQUAL" }, { "field": "hours_since_creation", "value": 48, "operator": "GREATER_THAN" }, { "field": "mobile_app_purchase_roas", "value": [0.76, 0.84], "operator": "NOT_IN_RANGE" } ] }' \ -F 'execution_spec={ "execution_type": "CHANGE_BID", "execution_options": [ { "field": "change_spec", "value": { "amount": 0.80, "target_field": "mobile_app_purchase_roas" }, "operator": "EQUAL" }, ] }' \ -F "access_token=<ACCESS_TOKEN>" \ https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library