Retrieve a campaign's metrics
GET/v1/campaigns/{id}/metrics
Requires an API key with the campaigns:read scope. About keys and scopes
Works with integration, agent and partner keys.
Returns how a campaign did over its whole life. People-level numbers sit at the top: recipientCount, and the conversions and credited revenue its messages drove (gross, before refunds; zeros without conversion goals). Message counters sit under email and push, never added together, null for a channel the campaign does not send; push device outcomes are under push.devices. Email's opened includes machine opens (openedByMachine); a machine's click counts in neither clicked nor opened. Counters keep moving after a send completes, as opens, clicks and bounces arrive.
Path parameters
idstringrequiredThe campaign's id.
uuid
Header parameters
Kirora-WorkspacestringoptionalPartner keys only: the child workspace to act in, by the external id the partner gave it. Without it, a partner key acts in its own workspace. Any other key that sends it is refused with 403, and an unknown workspace is 404.
pattern
^[A-Za-z0-9._:-]{1,128}$
Returns
Returns 200 OK with a CampaignMetrics in data. Otherwise returns an error; Errors lists every code and which to retry.
campaignIdstringrequireduuid
recipientCountintegerrequiredPeople the campaign went to, each counted once across channels.
min 0
conversionsintegerrequiredConversions of the campaign's goals that its messages drove; 0 without goals.
min 0
revenueMoney[]requiredCredited revenue per goal currency, never converted: what conversions a message drove were worth, gross, before refunds and cancellations.
2 child attributes
currencystring | nullrequiredThe currency, an ISO 4217 code; null when none was named.
valuenumberrequiredThe amount in that currency.
revenueWithheldbooleanrequiredTrue when
revenueleaves out the value of a goal whose value property is a masked attribute this viewer may not see; its conversions are still counted.emailobject | nullrequiredEmail message counters;
nullwhen the campaign sends no email.16 child attributes
queuedintegerrequiredMessages waiting to be sent.
min 0
sendingintegerrequiredMessages being handed to the provider.
min 0
skippedintegerrequiredMessages not sent; see
skippedByReason.min 0
sentintegerrequiredMessages the provider accepted, whatever happened next: a delivered, bounced or failed message still counts here.
min 0
failedintegerrequiredMessages that could not be sent or failed after sending.
min 0
deliveredintegerrequiredMessages confirmed delivered, including any later marked as spam.
min 0
bouncedintegerrequiredMessages in status
bounced, test sends to[email protected]included (seesimulated);deliverabilityHealthcounts recorded bounces of real sends only.min 0
complainedintegerrequiredMessages in status
complained, test sends to[email protected]included (seesimulated).min 0
openedintegerrequiredMessages opened at least once.
min 0
openedByMachineintegerrequiredOf
opened, those only a machine opened: a mail app fetched its images with no reader (Apple Mail Privacy Protection, Gmail's prefetch on delivery) or a mail security scanner checked it. Clicks are unaffected.min 0
clickedintegerrequiredMessages with a link clicked at least once, by a person.
min 0
clickedByMachineintegerrequiredMessages whose links a machine followed: a mail security scanner checking them on delivery, a link preview. The machine's click counts in neither
clickednoropened(a person's click on the same message still does), and no webhook or journey sees it.min 0
unsubscribedintegerrequiredRecipients who opted out through this campaign's link.
min 0
simulatedintegerrequiredTest sends whose outcome was acted out: those to
delivered@,bounce@or[email protected](the transactional guide's "Test addresses"). These counts go by message status, so they include them;deliverabilityHealthleaves them out.min 0
totalintegerrequiredAll messages created.
sentanddeliveredoverlap the other counts, so they do not add up to it;byStatusdoes.min 0
byStatusmap<string, integer>requiredEach message once, by where it is now, summing to
total: the delivery breakdown. A delivered message later marked as spam iscomplainedhere, whiledeliveredabove still counts it.keys: one of
queued,sending,skipped,sent,failed,delivered,bounced,complained· values: min 0
deliverabilityHealthobject | nullrequiredAdvisory bounce and complaint health of the campaign's email, judged on the same lines and minimums as
deliverabilityHealthongetOverviewReport;nullwhen the campaign sends no email. It reads real sends only: test sends (email.simulated) are left out, thoughemail.bouncedandemail.complained, counted by status, include them.8 child attributes
bandstringrequiredinsufficient_datauntil the sample and feedback coverage minimums are met; then the highest line the bounce or complaint ratio reaches.one of
insufficient_data,healthy,watch,criticallimitsDeliverabilityLimitsrequiredWhere the bands start, the workspace's own lines:
watchwhere its admins are warned,criticalwhere its marketing email pauses. The pause is judged on all of the workspace's marketing email over the last 24 hours (or week, for a small sender), not on one report.2 child attributes
watchobjectrequired2 child attributes
bounceRationumberrequiredA ratio from 0 to 1: 0.05 is 5%.
min 0 · max 1
complaintRationumberrequiredA ratio from 0 to 1: 0.05 is 5%.
min 0 · max 1
criticalobjectrequired2 child attributes
bounceRationumberrequiredA ratio from 0 to 1: 0.05 is 5%.
min 0 · max 1
complaintRationumberrequiredA ratio from 0 to 1: 0.05 is 5%.
min 0 · max 1
bounceRationumber | nullrequiredRecorded bounces per sent email, the figure the band compares with
limits;nullwhilesampleSizeis 0.min 0 · max 1
complaintRationumber | nullrequiredRecorded complaints per sent email, the figure the band compares with
limits;nullwhilesampleSizeis 0.min 0 · max 1
sampleSizeintegerrequiredSent emails the band is judged on: real sends only, with test sends that act an outcome out (
delivered@,bounce@,[email protected]) left out.min 0
minimumSampleSizeintegerrequiredThe fewest emails (
sampleSize) the band is judged on, currently 100: below it the band isinsufficient_data.min 1
feedbackCoveragenumber | nullrequiredShare of the sample whose outcome (delivered, bounced or complained) is known;
nullbefore any email is sent.min 0 · max 1
minimumFeedbackCoveragenumberrequiredThe least
feedbackCoveragethe band is judged on, currently 0.95: below it the band isinsufficient_data, as bounce and complaint reports are still arriving.min 0 · max 1
pushobject | nullrequiredPush message counters;
nullwhen the campaign sends no push.10 child attributes
queuedintegerrequiredMessages waiting to be sent.
min 0
sendingintegerrequiredMessages being handed to the provider.
min 0
skippedintegerrequiredMessages not sent; see
skippedByReason.min 0
sentintegerrequiredMessages the provider accepted, whatever happened next: a delivered, bounced or failed message still counts here.
min 0
failedintegerrequiredMessages that could not be sent or failed after sending.
min 0
byStatusobjectrequiredEach message once, by where it is now, summing to
total.5 child attributes
queuedintegerrequiredmin 0
sendingintegerrequiredmin 0
skippedintegerrequiredmin 0
sentintegerrequiredmin 0
failedintegerrequiredmin 0
openedintegerrequiredMessages the app reported opened at least once.
min 0
clickedintegerrequiredMessages the app reported tapped through to a link at least once.
min 0
totalintegerrequiredAll messages created.
min 0
devicesobjectrequiredDevice outcomes: one push message goes to every device its contact has, so these count devices, not messages, and never add to the counters beside them.
10 child attributes
pendingintegerrequiredDevices not yet attempted.
min 0
startedintegerrequiredDevices being sent to now.
min 0
acceptedintegerrequiredDevices the push service accepted.
min 0
invalidintegerrequiredDevices whose registration is no longer valid.
min 0
rejectedintegerrequiredDevices the push service permanently refused.
min 0
retryableintegerrequiredDevices that failed temporarily and will be retried.
min 0
unknownintegerrequiredDevices whose outcome could not be determined.
min 0
skippedintegerrequiredDevices not sent to.
min 0
totalintegerrequiredAll devices targeted.
min 0
byPlatformobjectrequired3 child attributes
iosobjectoptional9 child attributes
pendingintegerrequiredDevices not yet attempted.
min 0
startedintegerrequiredDevices being sent to now.
min 0
acceptedintegerrequiredDevices the push service accepted.
min 0
invalidintegerrequiredDevices whose registration is no longer valid.
min 0
rejectedintegerrequiredDevices the push service permanently refused.
min 0
retryableintegerrequiredDevices that failed temporarily and will be retried.
min 0
unknownintegerrequiredDevices whose outcome could not be determined.
min 0
skippedintegerrequiredDevices not sent to.
min 0
totalintegerrequiredAll devices targeted.
min 0
androidobjectoptional9 child attributes
pendingintegerrequiredDevices not yet attempted.
min 0
startedintegerrequiredDevices being sent to now.
min 0
acceptedintegerrequiredDevices the push service accepted.
min 0
invalidintegerrequiredDevices whose registration is no longer valid.
min 0
rejectedintegerrequiredDevices the push service permanently refused.
min 0
retryableintegerrequiredDevices that failed temporarily and will be retried.
min 0
unknownintegerrequiredDevices whose outcome could not be determined.
min 0
skippedintegerrequiredDevices not sent to.
min 0
totalintegerrequiredAll devices targeted.
min 0
webobjectoptional9 child attributes
pendingintegerrequiredDevices not yet attempted.
min 0
startedintegerrequiredDevices being sent to now.
min 0
acceptedintegerrequiredDevices the push service accepted.
min 0
invalidintegerrequiredDevices whose registration is no longer valid.
min 0
rejectedintegerrequiredDevices the push service permanently refused.
min 0
retryableintegerrequiredDevices that failed temporarily and will be retried.
min 0
unknownintegerrequiredDevices whose outcome could not be determined.
min 0
skippedintegerrequiredDevices not sent to.
min 0
totalintegerrequiredAll devices targeted.
min 0
skippedByReasonmap<string, integer>requiredSkipped messages by reason, such as
message_limitorexpired, across channels; each channel'sskippedis its part.values: min 0
abTestobject | nullrequiredThe test group's results by version; the rest of the audience is in the totals only.
nullwithout an A/B test.2 child attributes
winnerinteger | nullrequiredThe winning version, once picked.
min 1
versionsAbTestVersionResult[]requiredEach version in the test group, version 1 first. The winner is picked on open and click rates over
delivered(oversentuntil any version has a delivery) and conversions oversent.6 child attributes
versionintegerrequiredmin 1
sentintegerrequiredTest messages handed to the provider.
min 0
deliveredintegerrequiredmin 0
openedintegerrequiredTest messages a person opened; machine opens are left out.
min 0
clickedintegerrequiredmin 0
conversionsintegerrequiredRecipients who reached the test's conversion goal; 0 without one.
min 0