Connect Klaviyo to Power BI: API Guide & Example

17 Oct 2026 · 8 min read

To connect Klaviyo to Power BI, extract campaign or flow results through the Reporting API or a suitable third-party connector, then import the staged data. Start by matching one Klaviyo report. The downloadable example below shows the model, measures and expected totals.

Bring Klaviyo campaign and flow performance alongside store orders, marketing spend and margins in Power BI. You can compare attributed email results with the wider business, using a written definition for each figure.

This guide covers the reporting connection, a bounded API request, a downloadable campaign example and refresh checks. Technical references were checked on 17 October 2026. The worked data is synthetic teaching data, with independently checked arithmetic. It is not a client result or a live Klaviyo extraction. Power BI Desktop and Service execution have not been verified for this example.

Choose a connection route for your report

RouteUseful whenCheck before choosing
Third-party Klaviyo connectorYou want managed extraction into a supported destinationCampaign and flow coverage, history, attribution definitions, subscription costs and Service refresh
Klaviyo API into staged tablesYou need control of the reporting grain, history or multiple accountsScopes, extraction limits, complete coverage, secret storage and maintenance
File-based reporting exampleYou want to check a model before arranging live accessSource definitions, data types and reconciliation; the download here is illustrative

A warehouse is a storage and modelling choice. An API pipeline or connector can supply it. For a data integration build, agree the source reports and the tables Power BI will read before selecting the tools.

Microsoft's Power Query connector directory did not list a dedicated Klaviyo connector at this review. Check the vendor and host support for any third-party route.

Match Klaviyo's report before joining other sources

For campaign and flow performance, start with the Klaviyo Reporting API. It is designed to reproduce the corresponding interface figures. Campaign and flow performance uses message send date; Metric Aggregates groups events by when they occurred. Those date bases answer different questions.

Choose one report and record:

  • The account, campaign and message IDs, channel and reporting period.
  • The conversion metric ID and source integration. For orders, confirm the intended Placed Order metric using Get Metrics.
  • The account timezone, attribution settings and extraction timestamp.
  • The monetary definition and source currency, including what incoming order values include.

Klaviyo's account currency setting changes the displayed symbol without converting the numbers. A GBP label alone does not establish that source values are pounds.

Extract one campaign message through the API

Keep the private key in your controlled server-side extraction environment. Use campaigns:read for the request below; metric discovery additionally needs metrics:read. Follow Klaviyo's authentication guidance and keep keys out of shared PBIX files and downloads.

Send a POST to https://a.klaviyo.com/api/campaign-values-reports with these headers:

Authorization: Klaviyo-API-Key <your server-side private key>
Accept: application/vnd.api+json
Content-Type: application/vnd.api+json
revision: 2026-10-15

This template selects one email campaign message for September 2026. Replace the three ID placeholders with your account's IDs. The request has been checked against the current schema; it has not been executed against a private account here.

{
  "data": {
    "type": "campaign-values-report",
    "attributes": {
      "statistics": ["delivered", "clicks_unique", "conversions", "conversion_value"],
      "timeframe": {
        "start": "2026-09-01T00:00:00+00:00",
        "end": "2026-09-30T23:59:59+00:00"
      },
      "conversion_metric_id": "REPLACE_PLACED_ORDER_METRIC_ID",
      "filter": "and(equals(campaign_id,\"REPLACE_CAMPAIGN_ID\"),equals(campaign_message_id,\"REPLACE_MESSAGE_ID\"),equals(send_channel,\"email\"))",
      "group_by": ["campaign_id", "campaign_message_id", "send_channel"]
    }
  }
}

The campaign schema specifies that custom timeframe offsets are ignored and the account timezone is used. The end above includes the final reporting day. Record the account-local window alongside the results.

Read groupings and statistics from each object in data.attributes.results. Retain the IDs and add the window and extraction metadata. Check returned message groups against the selection. An empty result needs an ID, date and filter check before it can mean zero performance.

The campaign endpoint currently limits requests to one per second, two per minute and 225 per day. Respect the steady and daily limits when repeating requests. Wider extraction needs validated page_cursor pagination before it can be treated as complete. On HTTP 429, respect Retry-After; distinguish failures from checked empty responses. See the rate-limit guidance.

For flows, use the separate Flow Values endpoint, with flows:read and flow/message identifiers. Keep campaign and flow rows distinguishable in the model.

Work through a campaign example in Power BI

Download the worked example ZIP, or inspect the campaign CSV, DAX measures, expected results and README separately. Access is ungated.

The CSV is a normalised teaching extract, not an API response. It represents two fictional email campaign messages in one account, September 2026 account-local dates, Europe/London time and assumed GBP order values. The account, metric, campaign and message IDs are synthetic. The retrieval timestamp is illustrative too.

MessageDelivered emailsUnique clicks within that messageAttributed Placed Order eventsAttributed order value
A1,0004015£900
B5004010£800
Combined1,50080 summed message counts25£1,700

Import the CSV and create the measures

  1. In Power BI Desktop, choose Get data → Text/CSV and select campaign-values.csv.
  2. Open Transform Data. Name the query KlaviyoCampaigns. Set identifiers, channel, currency and timezone to Text; delivered, clicks_unique and conversions to Whole Number; and conversion_value to Fixed Decimal Number. Keep the account-local window strings and retrieval timestamp as Text for this small example.
  3. Choose Close & Apply. Create the measures below, then add cards for the totals and a table by campaign_message_id.
Delivered Emails = SUM ( KlaviyoCampaigns[delivered] )

Message Unique Clicks = SUM ( KlaviyoCampaigns[clicks_unique] )

Attributed Orders = SUM ( KlaviyoCampaigns[conversions] )

Attributed Order Value = SUM ( KlaviyoCampaigns[conversion_value] )

Email Click Rate = DIVIDE ( [Message Unique Clicks], [Delivered Emails] )

Attributed Value per Delivery = DIVIDE ( [Attributed Order Value], [Delivered Emails] )

Attributed Value per Order = DIVIDE ( [Attributed Order Value], [Attributed Orders] )

Create each measure separately. Format Email Click Rate as a percentage with two decimal places, counts as whole numbers, and monetary measures as GBP with two decimals. The download contains the same definitions.

Check the expected result

Your cards should show 1,500 deliveries, 80 message-level unique clicks, 25 attributed order events and £1,700 attributed order value. The ratios are:

  • Email click rate: 80 ÷ 1,500 = 5.33%. Averaging the individual rates of 4% and 8% would give 6%, applying the wrong weighting.
  • Attributed value per delivery: £1,700 ÷ 1,500 = £1.13 after rounding.
  • Attributed value per order event: £1,700 ÷ 25 = £68.00.

The 80 clicks are summed unique counts within messages, not 80 distinct people across messages. The 25 conversions count events for the assumed Placed Order metric, not unique customers. Klaviyo's conversion rate uses unique conversions; this example does not calculate that rate. See the statistic definitions.

Keep one current snapshot per account, campaign message, channel, metric and window. A second extraction of the same window replaces that snapshot; appending and summing both would double the totals. Do not sum overlapping reporting windows either. Store audit history separately.

Connect staged data and verify scheduled refresh

For live reporting, Power BI should read a supported staged source, such as a SQL table or appropriately configured cloud file. The extraction handles the Klaviyo key; Power BI uses credentials for the staged source. Complete extraction before refreshing the semantic model and retain a visible source timestamp.

Direct Power Query API calls need extra care. Microsoft's Web.Contents documentation states that Content creates a POST request and that POST uses Anonymous connector credentials. A Klaviyo Authorization header is still required. A key stored in M or a parameter is not a secret store.

Before relying on Power BI Service refresh, check published credentials, privacy settings, dynamic-source restrictions and gateway requirements. Run a Service refresh and compare its history, row counts and source timestamp with extraction. Desktop success alone does not establish scheduled refresh. Our refresh and gateway guide covers the Power BI side.

Compare Klaviyo revenue with Shopify orders

Keep attributed performance and store sales as separate facts. Klaviyo's conversion_value sums values for the selected metric; it is not automatically net sales, profit or incremental revenue. Here, £1,700 is attributed Placed Order value under a fictional definition.

Use the Shopify connection guide for order, discount and refund controls. Compare sources through agreed account/store and date dimensions. Their date bases may differ; explain that beside the measures. Adding attributed value to total order revenue would count underlying sales again.

Repeat-purchase rate, cohorts and lifetime value need order/customer modelling beyond campaign aggregates. Our ecommerce dashboard guide covers the wider report; data modelling guidance covers relationships.

Reconcile before using the report

Match one message against Klaviyo using the same metric, dates, timezone and attribution settings. Compare delivered emails, message-level unique clicks, conversion events and value separately. Record extraction time: historical attribution can change as information arrives or settings change. See Klaviyo's message-attribution guidance.

Once that message agrees, check the complete agreed selection and the published refresh. Keep account and currency boundaries explicit when extending to more brands.

For a reporting build, tell us about your Klaviyo setup: your accounts and store platforms, the figures you want to compare and the update frequency. The enquiry opens an editable integration brief.

Frequently asked questions

Is there a native Klaviyo connector in Power BI?

Microsoft's Power Query connector directory does not list a dedicated Klaviyo connector as checked on 17 October 2026. Routes include a third-party connector or a custom API extraction into a supported data source. Check the connector's reports, authentication and scheduled-refresh requirements.

Can I connect to the Klaviyo API directly from Power Query?

Power Query can make web requests, including POST requests. Klaviyo uses a private API key in an Authorization header. Keep that key in a controlled extraction service rather than distributing it inside a shared workbook or PBIX. Published refresh also needs its own credential, privacy and gateway checks.

Why does Power BI show different revenue from Klaviyo?

Check the conversion metric and integration, message selection, dates, account timezone, attribution settings and extraction time. Campaign and flow reporting uses send-date performance; raw event-time aggregates answer a different question. Attributed conversion value also differs from total store revenue, refunds and profit.

Can Klaviyo data refresh automatically in Power BI?

Yes, with a supported connection and a tested extraction and refresh schedule. Extract before refreshing Power BI, configure the published source credentials and any required gateway, then check refresh history and the source timestamp. Desktop success alone does not verify Service refresh.

Can I combine Klaviyo and Shopify in Power BI?

Yes. Keep attributed campaign or flow results separate from Shopify order totals and join them through agreed account, store and date dimensions. Compare the measures using their documented date and currency definitions. Adding attributed revenue to store revenue would count the same underlying sales again.

Bring Klaviyo into your Power BI reporting

Compare campaign and flow performance with your store orders. Share the Klaviyo accounts and report you want, including the revenue checks and refresh schedule you need.