Newsletter Content analytics¶
See how your newsletters perform: site-wide totals, the best and worst performing newsletters, one newsletter's totals and day-by-day series, and the products its tiles earned their traffic on.
Every figure comes back three times. known covers recipients Hello Retail could identify, unknown covers the rest, and total covers both together. Nothing else in Hello Retail splits its analytics this way, and it exists to answer one question: did personalizing the content beat not personalizing it. Report the pair rather than the total alone.
Each side carries opens, clicks, orders and revenue, plus the derived click-through rate (clicks/opens), conversion rate (orders/opens) and average order size (revenue/orders). total sums the counts and recomputes the rates from those sums, so a handful of identified recipients can't outweigh thousands of unidentified ones.
An open is only counted once the recipient's mail client loads images, and plenty of clients never do. Clicks can therefore exceed opens and a rate can pass 100%. That's a measurement artifact, not a broken number.
Campaign types, and what a row is¶
The campaignType argument takes the same three values everywhere, and they decide what one row means:
campaignType | A row is |
|---|---|
AUTO | One newsletter an Auto campaign has sent. Ranking these compares sends of the same configuration against each other. |
AUTORESET | A Rolling campaign the customer configured. |
NORMAL | A Manual campaign the customer configured. |
There's no TEMPLATE. An Auto campaign configuration never serves a tile itself, so it has no figures of its own; each newsletter it sends is filed under AUTO. To judge an Auto campaign as a whole, rank its sends and read the trend. Newsletter Content campaigns explains the relationship.
Tips & tricks¶
Pick the card that matches what you're doing. Each prompt is ready to paste into your assistant.
Start wide, then rank
Start with the totals, then rank the newsletters behind the numbers.
Compare the two audiences
The known figures are what personalization achieved; the unknown figures are the same content with nothing to personalize on. A campaign whose known CTR beats its unknown CTR is one where the strategy is working.
Check the ceiling before blaming the campaign
identifiedVisitorPercentage is the share of visitors Hello Retail can identify at all, and it caps how much of any newsletter can be personalized. A weak known column under a low percentage is a tracking problem, not a campaign problem.
Follow one newsletter day by day
A newsletter's traffic is front-loaded: most recipients open within a day or two. A series that keeps climbing is usually a campaign still being sent, and a second spike is usually a re-send. Orders are attributed on the day of the order, so that line trails the clicks.
Find out what actually got clicked
The product table is what turns a weak campaign into something to act on. Views with no clicks is a tile or a product problem; the same handful of products filling every slot is an algorithm too narrow to personalize.
Take it to the campaign tools
Combine with the campaign tools: find a weak newsletter, read its algorithm, preview a change, then write it.
newsletterContent_getAnalyticsTotals¶
Get the site-wide Newsletter Content totals for a customer website: opens, clicks, orders and revenue with the derived rates, summed over every campaign of the chosen kind, for identified recipients, unidentified ones and both together.
identifiedVisitorPercentage is the share of the website's visitors Hello Retail can identify, read at the end of the window. It's a standing measurement of the tracking setup rather than something that accumulates over the period.
| Name | Type | Required | Description |
|---|---|---|---|
websiteUuid | string | Yes | The UUID of the customer's website in Hello Retail. Use website_getInfo to look up available websites, or find it in my.helloretail.com under Settings → Website Settings → Website Unique Id. |
campaignType | string | No | AUTO, AUTORESET or NORMAL. Omit it to count every kind together. |
startDate | string | No | Start of the window, inclusive, ISO YYYY-MM-DD. Defaults to 30 days before endDate. |
endDate | string | No | End of the window, inclusive, ISO YYYY-MM-DD. Defaults to today. |
Example request & response
{
"campaignType": null,
"known": {
"opens": 100,
"clicks": 30,
"conversions": 5,
"revenue": 300.0,
"clickThroughRate": 0.3,
"conversionRate": 0.05,
"averageOrderSize": 60.0
},
"unknown": {
"opens": 400,
"clicks": 20,
"conversions": 5,
"revenue": 200.0,
"clickThroughRate": 0.05,
"conversionRate": 0.0125,
"averageOrderSize": 40.0
},
"total": {
"opens": 500,
"clicks": 50,
"conversions": 10,
"revenue": 500.0,
"clickThroughRate": 0.1,
"conversionRate": 0.02,
"averageOrderSize": 50.0
},
"identifiedVisitorPercentage": 25.0
}
newsletterContent_getAnalyticsGrouped¶
Rank the newsletters of a customer website by a performance metric. Sort descending (default) for the best performers, ascending for the worst.
Ranking reads one side of the split at a time, because the two are stored as separate counters: audience picks which one sortBy orders on. Every row still carries both sides, so a campaign that ranks well on one and badly on the other is visible in the answer. A campaign deleted since is left out, since the per-campaign tools would refuse its id.
| Name | Type | Required | Description |
|---|---|---|---|
websiteUuid | string | Yes | The UUID of the customer's website in Hello Retail. Use website_getInfo to look up available websites, or find it in my.helloretail.com under Settings → Website Settings → Website Unique Id. |
campaignType | string | No | AUTO, AUTORESET or NORMAL. Omit it to rank every kind together. |
startDate | string | No | Start of the window, inclusive, ISO YYYY-MM-DD. Defaults to 30 days before endDate. |
endDate | string | No | End of the window, inclusive, ISO YYYY-MM-DD. Defaults to today. |
sortBy | string | No | OPENS (default), CLICKS, CONVERSIONS, REVENUE, CTR, CONVERSION_RATE or AVERAGE_ORDER_SIZE. |
audience | string | No | Which side of the split to rank on: KNOWN (default) or UNKNOWN. |
ascending | boolean | No | Sort ascending to get the worst performers first. Defaults to false. |
limit | integer | No | Maximum number of campaigns to return. Default 20, capped at 100. |
Example request & response
{
"campaignType": "AUTO",
"results": [
{
"campaignId": "<string>",
"name": "2026-02-17 - Weekly newsletter",
"campaignType": "AUTO",
"known": { "opens": 100, "clicks": 30, "conversions": 5, "revenue": 300.0, "clickThroughRate": 0.3, "conversionRate": 0.05, "averageOrderSize": 60.0 },
"unknown": { "opens": 400, "clicks": 20, "conversions": 5, "revenue": 200.0, "clickThroughRate": 0.05, "conversionRate": 0.0125, "averageOrderSize": 40.0 },
"total": { "opens": 500, "clicks": 50, "conversions": 10, "revenue": 500.0, "clickThroughRate": 0.1, "conversionRate": 0.02, "averageOrderSize": 50.0 }
}
]
}
newsletterContent_getAnalyticsForCampaign¶
Get one newsletter's totals over the window, for identified recipients, unidentified ones and both together.
The id may be any campaign that has served tiles, including one newsletter sent by an Auto campaign. An Auto campaign configuration itself never serves and has no figures of its own; add up its sends with newsletterContent_getAnalyticsGrouped, or list them with newsletterContent_listSentCampaignsForTemplate.
| Name | Type | Required | Description |
|---|---|---|---|
websiteUuid | string | Yes | The UUID of the customer's website in Hello Retail. Use website_getInfo to look up available websites, or find it in my.helloretail.com under Settings → Website Settings → Website Unique Id. |
campaignId | string | Yes | The id of the campaign, from newsletterContent_getAnalyticsGrouped, newsletterContent_listCampaigns or newsletterContent_listSentCampaignsForTemplate. |
startDate | string | No | Start of the window, inclusive, ISO YYYY-MM-DD. Defaults to 30 days before endDate. |
endDate | string | No | End of the window, inclusive, ISO YYYY-MM-DD. Defaults to today. |
Example request & response
{
"campaignId": "<string>",
"name": "2026-02-17 - Weekly newsletter",
"campaignType": "AUTO",
"state": "LIVE",
"known": { "opens": 100, "clicks": 30, "conversions": 5, "revenue": 300.0, "clickThroughRate": 0.3, "conversionRate": 0.05, "averageOrderSize": 60.0 },
"unknown": { "opens": 400, "clicks": 20, "conversions": 5, "revenue": 200.0, "clickThroughRate": 0.05, "conversionRate": 0.0125, "averageOrderSize": 40.0 },
"total": { "opens": 500, "clicks": 50, "conversions": 10, "revenue": 500.0, "clickThroughRate": 0.1, "conversionRate": 0.02, "averageOrderSize": 50.0 }
}
newsletterContent_getAnalyticsDailyForCampaign¶
Get one newsletter's day-by-day series, oldest first, with one row for every day in the window. Days without traffic read 0. The window can't exceed 366 days.
A newsletter's traffic is front-loaded: most recipients open within a day or two of the send, so a series that keeps climbing after that is usually a campaign still being sent, and one that spikes again later is usually a re-send. Orders are attributed on the day of the order, not the day of the click, so the orders line trails the clicks line.
| Name | Type | Required | Description |
|---|---|---|---|
websiteUuid | string | Yes | The UUID of the customer's website in Hello Retail. Use website_getInfo to look up available websites, or find it in my.helloretail.com under Settings → Website Settings → Website Unique Id. |
campaignId | string | Yes | The id of the campaign. See newsletterContent_getAnalyticsForCampaign. |
startDate | string | No | Start of the window, inclusive, ISO YYYY-MM-DD. Defaults to 30 days before endDate. Window must not exceed 366 days. |
endDate | string | No | End of the window, inclusive, ISO YYYY-MM-DD. Defaults to today. |
Example request & response
{
"campaignId": "<string>",
"name": "2026-02-17 - Weekly newsletter",
"days": [
{
"date": "2026-02-17",
"known": { "opens": 80, "clicks": 26, "conversions": 4, "revenue": 240.0, "clickThroughRate": 0.325, "conversionRate": 0.05, "averageOrderSize": 60.0 },
"unknown": { "opens": 320, "clicks": 17, "conversions": 4, "revenue": 160.0, "clickThroughRate": 0.053, "conversionRate": 0.0125, "averageOrderSize": 40.0 },
"total": { "opens": 400, "clicks": 43, "conversions": 8, "revenue": 400.0, "clickThroughRate": 0.1075, "conversionRate": 0.02, "averageOrderSize": 50.0 }
}
]
}
newsletterContent_getAnalyticsProductsForCampaign¶
Get the products one newsletter earned its traffic on: per product, how many times its tile was shown, how many times it was clicked, and the orders that followed. Same table as the Products tab of the campaign's analytics page.
Orders come back split. A direct order is one placed on the product that was clicked; an indirect order is a different product bought in the same session. Both belong to the campaign, only the first belongs to the product.
Identified and unidentified recipients are summed here, unlike the other tools on this page, because the campaign's own figures already answer that split.
| Name | Type | Required | Description |
|---|---|---|---|
websiteUuid | string | Yes | The UUID of the customer's website in Hello Retail. Use website_getInfo to look up available websites, or find it in my.helloretail.com under Settings → Website Settings → Website Unique Id. |
campaignId | string | Yes | The id of the campaign. See newsletterContent_getAnalyticsForCampaign. |
startDate | string | No | Start of the window, inclusive, ISO YYYY-MM-DD. Defaults to 30 days before endDate. |
endDate | string | No | End of the window, inclusive, ISO YYYY-MM-DD. Defaults to today. |
sortBy | string | No | VIEWS (default), CLICKS, DIRECT_CONVERSIONS or INDIRECT_CONVERSIONS. |
ascending | boolean | No | Sort ascending to get the worst performers first. Defaults to false. |
limit | integer | No | Maximum number of products to return. Default 20, capped at 100. |