Zenith has no native integrations. Besides the CSV export, your responses have two ways out, and both run on tools you control. A Shopify Flow trigger starts a workflow for every response, which Flow can turn into a Google Sheets row, a Slack message or an email. A browser event carries each answer to a custom pixel you paste, which sends it to your own GA4 property. Neither does anything until you set it up.
If Flow is not in your admin yet, install Shopify Flow from the Shopify App Store. It is free.
In your Shopify admin, go to Apps > Flow and click Create workflow.
Click Select a trigger, choose Zenith: Post Purchase Survey, then Survey response received.
Click + and choose Action. For a spreadsheet, choose Add row to spreadsheet; if Flow asks you to install its Google Sheets connector or to connect a Google account, do that first. For Slack, choose Send Slack message. For email, choose Send internal email. Anything else in Flow's catalogue works the same way, including Send HTTP request.
Insert Zenith's fields into the action with Add a variable. All eleven are listed below. For a spreadsheet, fill in Spreadsheet URL, Tab name and Row contents, and read the note on commas first.
Click New Workflow to give it a name, then click Turn on workflow.
Every response carries all eleven, in the same order as the columns of your CSV export. Typed answers and comments are included as the customer wrote them.
| Field | Variable | What it holds |
|---|---|---|
| Question ID | questionId | A stable ID for the question. It stays the same when you reword the question. |
| Question | question | The question text exactly as the customer saw it. |
| Question Type | questionType | multiple_choice, multi-select, scale or free-text. |
| Scale Preset | scalePreset | nps, csat or ces on a rating question that uses a preset. Arrives as n/a otherwise. |
| Scale Range | scaleRange | The rating scale the answer was given on, such as 0-10. Arrives as n/a for other question types. |
| Status | status | answered, or skipped when the customer moved past the question. |
| Answer | answer | The answer. A rating as a number, several choices as one comma separated list, typed text up to 500 characters. Arrives as n/a when skipped. |
| Comment | comment | The comment the customer added, or what they typed after choosing Other, up to 1000 characters. Arrives as n/a when there is none. |
| Submitted At | submittedAt | When the answer was submitted, as an ISO 8601 time in UTC. |
| Order ID | orderId | The order's internal Shopify ID, as plain digits. This is not the order name your customers see. |
| Session ID | sessionId | Shared by every answer from one survey sitting, so you can group them back together. |
Every field is always sent, so a field with nothing in it arrives as n/a rather than as an empty value. Write your conditions against that: to act only on answers that carry a comment, use Comment is not equal to n/a.
Row contents is split on commas, so a value with a comma in it spreads across extra columns. That includes every answer with several choices, which arrives as a list such as Instagram, A friend. Swap the commas out of any field that can hold one. Shopify also notes that an empty value can shift the cells after it. Zenith never sends an empty field, so that cannot happen to your rows: a field with nothing in it arrives as n/a. The order below still reads best:
{{submittedAt}}, {{orderId}}, {{question | replace: ",", ";"}}, {{answer | replace: ",", ";"}}, {{status}}, {{comment | replace: ",", ";"}}Zenith can send each survey answer to your GA4 property as an event. You set it up once by pasting a custom pixel into your Shopify admin. Zenith never connects to Google and never asks for access to your Google account: your pixel receives the answer on your Thank you page and sends it with your own GA4 tag.
Each answered question sends one zenith_survey_response event with these parameters:
| Parameter | Example |
|---|---|
zenith_question_id | cmtrlorb50002unq4lfgc9tat |
zenith_question | How did you hear about us? |
zenith_answer | |
zenith_order_id | 7677568713013 |
Values longer than 100 characters are shortened to 100. An answer with several choices is sent as one comma separated value, for example Instagram, A friend.
Free-text answers and comments are never sent to GA4, by design. Google Analytics does not allow anything it could use to identify a person, and a text box is where a customer is most likely to type an email address or a phone number. Leaving all typed text out means no survey answer can put your property in breach of that policy. That covers open-ended questions and whatever a customer types after choosing Other, which reaches GA4 as the answer Other. Every typed answer is still in Zenith and in your CSV export. Skipped questions are not sent either.
G-. Find it in Google Analytics under Admin > Data streams.In your Shopify admin, go to Settings > Customer events.
Click Add custom pixel, name it Zenith to GA4, and click Add pixel.
Under Customer privacy, set Permission to Required and select Analytics. Set Data sale the way you set it for your other Google Analytics tags; that choice is yours to make for your store.
Replace everything in the code box with the snippet below, and change G-XXXXXXXXXX to your own Measurement ID.
Click Save, then Connect pixel.
// Zenith survey answers to Google Analytics 4
const MEASUREMENT_ID = "G-XXXXXXXXXX"; // your GA4 Measurement ID
const script = document.createElement("script");
script.src = "https://www.googletagmanager.com/gtag/js?id=" + MEASUREMENT_ID;
script.async = true;
document.head.appendChild(script);
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag("js", new Date());
// Your existing Google setup records page views. This pixel only sends survey answers.
gtag("config", MEASUREMENT_ID, { send_page_view: false });
analytics.subscribe("zenith:survey_response", (event) => {
gtag("event", "zenith_survey_response", {
...event.customData,
// Records your Thank you page as the page, instead of the pixel's own sandbox address.
page_location: event.context.document.location.href,
});
});GA4 only lets you filter and break down reports by a parameter after you register it as a custom dimension. Do this once for each parameter you want to report on; most stores want zenith_question and zenith_answer.
zenith_answer, as the Event parameter, and click Save.Google says a new custom dimension can be added to reports 24 to 48 hours after it is created and data has been sent.
zenith_survey_response.zenith_survey_response event.If nothing arrives, check that the pixel shows as connected under Settings > Customer events and that the Measurement ID is correct.