Twitter Advertiser API Discrepancies


#1

Hi there,

We are having discrepancies between different views and a top client is looking for further clarity on what a solution may be. See below for an example:

We’re trying to make sure we’re grabbing the right metrics via the API access we now have. At the moment, we’ve been trying to validate the data we’re grabbing against tweet-level data we already get from the Twitter platform. However, the numbers appear all over the place.

For the sake of simplicity, I’m going to hone in on just 1 tweet’s spend-influenced impressions, which has the tweet ID, 664158241111191000.

Prasad’s team (who has been working on the automation) has found impressions to be 2,463,448 for that tweet.

Twitter Ads’ dashboard says it is 1,022,785.

Twitter analytics says “promoted impressions” is 2,642.

I assume these all to be lifetime impressions. What is the best way we can figure out which of these numbers are the most reliable for tweet-level data?

– Is there any way we can help clear up the confusion between each of the reported figures here?

Thank you,
-Brad


#2

Hi there,

Is there any response or help we can provide to the client on this matter? Please advise ASAP.

Thanks,
-Brad


#3

We’ll need some more information to be able to help you here, have you taken a look at our Guidelines for Reporting Issues? At a minimum, we’ll need the query you’re using to fetch these stats, and a screenshot of what you’re comparing it against in the UI

Thanks,
Helen


#4

I am facing similar issues. API is delivering numbers VERY different from the Twitter Plataform.

I am querying the stats for a given funding instrument.

While the plataform gives me
258,662 impressions
https://ads.twitter.com/accounts/18ce53z684q/campaigns_dashboard?campaigns_type_filter=brand_engages&endString=2015-09-09T23%3A59%3A59.000&fi=32907535&startString=2015-09-09T00%3A00%3A00.000&summary_metric=impressions&log_ec=false&show_bulk_export_button=true

The API gives me
220,534 impressions
twurl -t -H ads-api.twitter.com "/0/stats/accounts/18ce53z684q/funding_instruments/jlbm7?granularity=DAY&start_time=2015-09-09T03:00:00Z&end_time=2015-09-09T23:59:59Z" | python -m json.tool

This is just one day of campaign. So that difference is impossible to work with.
It is also impossible to match clicks and engagements, no matter how we sum the the matrics up following this guide:
https://dev.twitter.com/ads/analytics/metrics-derived

And more: in campaigns with Video, video metrics are simply not delivered, as I reported here:

It would be very important for us to have clear feedback about those issues.


Video Metrics not being delivered within stats
#5

Hello guys, is it possible to get any response here?


#6

In the future, please start your own forum thread instead of piggybacking on another user’s.

However, your issue has quite a straightforward answer. As the Derived Metrics page you linked states:

{Impressions} = promoted_tweet_search_impressions + promoted_tweet_timeline_impressions + promoted_tweet_profile_impressions

From the API call you’re making, you can see that:

promoted_tweet_profile_impressions = 38128
promoted_tweet_search_impressions = 0
promoted_tweet_timeline_impressions = 220534

Which would give you 258663 impressions total, same as the UI.


#7

I am sorry, hwz, but the topic is quite related. Didnt understand why to open a new topic.

Anyways. Something is wrong here.
"promoted_tweet_profile_impressions = 38128"
This data DOES NOT come on the answer when I call it.
This very metric, promoted_tweet_profile, does not appear on the data node.

Dunno if I am doing something wrong. I’ve tried this gazillion times.

But this call:

twurl -t -H ads-api.twitter.com "/0/stats/accounts/18ce53z684q/funding_instruments/jlbm7?granularity=DAY&start_time=2015-09-09T03:00:00Z&end_time=2015-09-09T23:59:59Z" | python -m json.tool

Gives me this:

opening connection to ads-api.twitter.com:443...
opened
starting SSL for ads-api.twitter.com:443...
SSL established
<- "GET /0/stats/accounts/18ce53z684q/funding_instruments/jlbm7?granularity=DAY&start_time=2015-09-09T03%3A00%3A00Z&end_time=2015-09-09T23%3A59%3A59Z HTTP/1.1\r\nAccept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3\r\nAccept: */*\r\nUser-Agent: OAuth gem v0.4.7\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: OAuth oauth_consumer_key=\"25qy0DuddspY0rAYbG2Hog4xj\", oauth_nonce=\"hdrdejcCUt7ekDdDEIkyW7igjayanjCJXnBc3VvD2q4\", oauth_signature=\"HSIWvYWd%2FYv5uE0fhNHZaRtLCoE%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1454534882\", oauth_token=\"3389833444-S2lF4iN83DMzeYEndPhcSrRsTBw8TQkDXtH1Ijs\", oauth_version=\"1.0\"\r\nConnection: close\r\nHost: ads-api.twitter.com\r\nContent-Length: 0\r\n\r\n"
<- ""
-> "HTTP/1.1 200 OK\r\n"
-> "connection: close\r\n"
-> "content-disposition: attachment; filename=json.json\r\n"
-> "content-encoding: gzip\r\n"
-> "content-length: 523\r\n"
-> "content-type: application/json;charset=utf-8\r\n"
-> "date: Wed, 03 Feb 2016 21:28:03 GMT\r\n"
-> "server: tsa_b\r\n"
-> "set-cookie: guest_id=v1%3A145453488333412541; Domain=.twitter.com; Path=/; Expires=Fri, 02-Feb-2018 21:28:03 UTC\r\n"
-> "strict-transport-security: max-age=631138519\r\n"
-> "x-access-level: read-write-directmessages\r\n"
-> "x-connection-hash: decc5d468e7bb24e05b467d5e32cb118\r\n"
-> "x-content-type-options: nosniff\r\n"
-> "x-cost-rate-limit-limit: 5000\r\n"
-> "x-cost-rate-limit-remaining: 4982\r\n"
-> "x-cost-rate-limit-reset: 1454534943\r\n"
-> "x-frame-options: SAMEORIGIN\r\n"
-> "x-rate-limit-limit: 2000\r\n"
-> "x-rate-limit-remaining: 1998\r\n"
-> "x-rate-limit-reset: 1454535600\r\n"
-> "x-request-cost: 18\r\n"
-> "x-response-time: 95\r\n"
-> "x-runtime: 0.078461\r\n"
-> "x-transaction: 3411e22b38894ba4\r\n"
-> "x-xss-protection: 1; mode=block\r\n"
-> "\r\n"
reading 523 bytes...
-> ""
-> "\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x00\x8CT\xDB\x8E\x9B0\x14\xFC\x17\x9E\xDB\xCA\xDC\x12\x96\xB7J\xFD\x84\xBE\xB4Ue\x9D\x98\x13\xD6]\xDFb\x9BD\xDBU\xFE\xBD\x86\x14\x12\x12  \xBF\xF8x8\x1E\x8Fg\xFC\x11U\xE0\x81\xFAw\x83Q\x199\x0F\xDEE\x9F\xBAZT~\xB4s\xEB\xA9\xE7\xB2]LH\x9C\x7F&/a|'iIH\x18?\x03\xD6X-\xB5\xC7\x8A\xFA\x13\xE2\x05,\xB8B\xCA\xC0V\x14U\r5JT\xA1m\xF9\x8B\xFC\xBE\x81\x03c\xBAQ\x9E\xEE\xB5\x10\xFAD-xl!_F\xA0KO\x87`\xD9+m\xAC\xA0Lp\xF6\xF6\xD0k\x04[\x01\xB9\xD2Z\xB3\xEF\x1E\x8E\xDAr\x8F}\xCF\x1D\x17\"`\xD8+\xD8\x1A\xA9\xD0\f\x04\x95\x9CY\x1D\xD63\xD2\x7F\xB3\xED,v\xD3\xBE\e\xD3\xEA\x88\xD6q\xAD\xA8\xE3\xB5\xA2\x8D\x99\xE1>({\xCB'\x8E\xF3G$\x18C\xB5AE\xC1{\x94f\xD8J\xEA@=\xDC\xCC\xE3\x8Etg\x11\xDE*}R\xED\xB5{\xEDA\xF4$\xB4\xF3\xF4\xC8\xF1t;\xBF\xEA\xF7\xBF\n\xCEq\x17\bt\xD3\xF3\xEC\xCD\xAC\xB4\x04\x97\xC6\xA2k\t\xF6\x10T\xD5\x84\r\x93\xB4\xCC_\xC2\x98\xB0\xE1\xA0\xB5\x11\x1C\x97\xCDp1\xE0,\x99P\xD8\xB7\xAA\x1D\xB9\xE3\x8F\x94\xEFM\xDF{/+6\x01\xC6\x83 \xD1\x1F\xB1\x93\xDB\x85\xA0\x8CO\x9B$$O\xB3\xF9\xA0<c0\nI\x9E. \xA7B\x10'\xDB4\f\x92\xE7\x19\x89\x8B\xA2\xB8\xBA\xFD\xBA{\xD2\xB2\xAB-\xA8F@\xB0\xE1{8\xE2\xB7\xAF?\xA2%{=\xE1|\x93\x88t\x19\xD7\xDF\xE6f\xDA\xF4\\\x85\x17K\x88{\xDF\xDF2\x82\xC0\x10d+\xE88\xCDc[&\xDB8\xCD\xC7\x7Fj[\xA1\xA5\x87\x06\x94\xEF\x0E\xBD\x1C\xD1A\xADt\xBB\xE2\x15z&\xD0\x1D\xB9\x82\x14\xF3v\xBE\x0FOH\xA3\xC5C\x83\xCE\xB7\xD16`A\xBA\xB5o\xFB\xF3\xD8\xED\eUqUw\xCA\xDB\xA63\xD3\xC8\xF4C\xA4\xDBb\\0\xCC\xD3\xBF\x9B\";DS\x16:\x9F\xCF\xFF\x00\x00\x00\xFF\xFF\x03\x00\xF6\x1Dd\xE4\x90\x06\x00\x00"
read 523 bytes
Conn close
{
    "data": {
        "billed_charge_local_micro": [
            4000000000
        ],
        "billed_engagements": [
            27135
        ],
        "billed_follows": [
            24
        ],
        "conversion_order_quantity": [
            0
        ],
        "conversion_sale_amount": [
            0
        ],
        "conversion_sign_ups": [
            0
        ],
        "end_time": "2015-09-09T23:59:59Z",
        "granularity": "DAY",
        "id": "jlbm7",
        "mobile_conversion_sign_ups": [
            0
        ],
        "mobile_conversion_sign_ups_breakdown": {
            "assisted": [
                0
            ],
            "post_engagement": [
                0
            ],
            "post_view": [
                0
            ],
            "total": [
                0
            ]
        },
        "promoted_account_follow_rate": [
            0.0
        ],
        "promoted_account_follows": [
            0
        ],
        "promoted_account_impressions": [
            0
        ],
        "promoted_account_profile_visits": [
            0
        ],
        "promoted_tweet_app_install_attempts": [
            0
        ],
        "promoted_tweet_app_open_attempts": [
            0
        ],
        "promoted_tweet_search_card_engagements": [
            0
        ],
        "promoted_tweet_search_clicks": [
            0
        ],
        "promoted_tweet_search_engagement_rate": [
            0.0
        ],
        "promoted_tweet_search_engagements": [
            0
        ],
        "promoted_tweet_search_favorites": [
            0
        ],
        "promoted_tweet_search_follows": [
            0
        ],
        "promoted_tweet_search_impressions": [
            0
        ],
        "promoted_tweet_search_replies": [
            0
        ],
        "promoted_tweet_search_retweets": [
            0
        ],
        "promoted_tweet_search_url_clicks": [
            0
        ],
        "promoted_tweet_timeline_card_engagements": [
            0
        ],
        "promoted_tweet_timeline_clicks": [
            486
        ],
        "promoted_tweet_timeline_engagement_rate": [
            0.1273273055401888
        ],
        "promoted_tweet_timeline_engagements": [
            28080
        ],
        "promoted_tweet_timeline_favorites": [
            115
        ],
        "promoted_tweet_timeline_follows": [
            37
        ],
        "promoted_tweet_timeline_impressions": [
            220534
        ],
        "promoted_tweet_timeline_replies": [
            6
        ],
        "promoted_tweet_timeline_retweets": [
            30
        ],
        "promoted_tweet_timeline_url_clicks": [
            53
        ],
        "start_time": "2015-09-09T03:00:00Z"
    },
    "data_type": "stats",
    "request": {
        "params": {
            "account_id": "18ce53z684q",
            "end_time": "2015-09-09T23:59:59Z",
            "funding_instrument_id": "jlbm7",
            "granularity": "DAY",
            "start_time": "2015-09-09T03:00:00Z"
        }
    }
}

#8

Not all metrics are returned by default. From the docs:

Specify the metrics you care about. If the metrics parameter is not set in your request, the default set of metrics will be returned.

You can refer to the Metrics and Segmentation page for a full list of metrics.


#9

Ok, so probably the docs from stats is misleading:

https://dev.twitter.com/ads/reference/get/stats/accounts/%3Aaccount_id/campaigns/%3Aid

metrics: A comma-separated list of the specific metrics to return in this
request. Defaults to all possible metrics associated with the data type.

If promoted_tweet_profile_impressions is associated with this data type, it should be presented by default.
Dont you agree?


Video Metrics not being delivered within stats
#10

Besides that, is there any place where I can find the list of default metrics?
Does it follow any logics or is it just arbitrary?


#11

Thanks for pointing that out – I would say the docs are definitely outdated in this case then. While the API now returns the most relevant metrics, it does not return all. That statement is likely left over from the early days of the API, when significantly fewer metrics were available. We’ll update the docs, and also consider adding promoted_tweet_profile_impressions to the default metrics.

We do not provide a list of default metrics. That decision because we want to encourage developers to fetch the metrics that are useful to them, not just a generic long list of metrics.


#12