Skip to content

Help and guides

SourceSay documentation

How to install SourceSay, set up your "How did you hear about us?" question, place it on any thank-you page and read the revenue report. Developer hooks and REST routes are at the end.

Free WooCommerce pluginWordPress 6.5 or laterPHP 7.4 or laterWooCommerce 8.5 or later

Listed on WordPress.org. You can also install it from Plugins, Add New Plugin in your WordPress admin: search for SourceSay.

Getting started

How to Add a "How Did You Hear About Us" Survey to WooCommerce (Free Plugin)Watch on YouTubeWatch all tutorials

Read the transcript

Want to know how customers really found your WooCommerce store? Ask them. WooCommerce Order Attribution can only record the last click it sees. When someone hears about you on a podcast, from a friend, or in an AI chat, and then types your address, the order shows up as Direct. Missing tracking data shows up as Unknown. SourceSay fills that gap with one question on the order confirmation page: How did you hear about us?

It is free, responses are unlimited, and customers never see an extra field before they pay. Step one: install it. In your WordPress admin, go to Plugins, Add New Plugin, and search for SourceSay. Click Install Now, then Activate. WooCommerce needs to be active too. Step two: open WooCommerce, SourceSay. A short setup starts. Pick the kind of store you run, and it fills in answers that fit, like Google search, Instagram, or a friend.

Next, check your question and the answers customers can pick. You can reword the question, rename or reorder answers, change icons, or turn one off. The preview on the right updates as you type. For more detail, switch on a follow-up for any answer, like Which podcast? Then click Save and continue. Step three: see it live. Your survey is still off at this point. Click Place a test order.

The order confirmation page opens in a new tab. Test orders are marked as tests, send no emails, and never count in your reports. Answer the question there, just like a customer would. Back in setup, the page updates by itself: It works. Your answer arrived. Now click Turn on my survey. From the next order on, customers see the question right after checkout. Step four: read your report.

Under Reports, you see how many customers answered, your response rate, the revenue from answered orders, and the average order value. The Channels table ranks every answer by revenue. Compare each channel's share of answers with its share of revenue. A longer revenue bar means that channel brings bigger orders. In WooCommerce Orders, every order shows what the customer said, next to the source WooCommerce tracked.

Here, an order tracked as Direct actually came from a podcast. You can filter orders by answer, export everything to CSV, and change the question any time on the Survey tab. And on your WordPress dashboard, a SourceSay widget shows your response rate, the revenue from answered orders, and your top five channels from the last thirty days. Recap: install SourceSay, check your question, test it and turn it on, then read revenue by channel in Reports.

Subscribe for more SourceSay tutorials.

SourceSay asks WooCommerce customers one question right after checkout: How did you hear about us? Each answer is stored with the order total, so the report shows revenue per channel, not just a count of votes. It needs WordPress 6.5 or later, PHP 7.4 or later and WooCommerce 8.5 or later. Everything is free, with unlimited responses.

Install the plugin

  1. Install and activate WooCommerce.
  2. Upload the SourceSay plugin under Plugins > Add New Plugin > Upload Plugin, or install it from the Plugins screen once it is listed on WordPress.org, then activate it.
  3. Go to WooCommerce > SourceSay. The first-run setup opens and walks you through the rest.

Find your way around

SourceSay lives on one screen under WooCommerce > SourceSay, with three tabs:

  • Reports: the status of your survey, the answers, and revenue per channel.
  • Survey: the question, the answers customers can pick, follow-up questions and where the survey appears.
  • Settings: asking again in My Account, how long answers are kept, uninstall behaviour and the panel for developers.

Only users who can manage WooCommerce see SourceSay.

First-run setup

The survey is off when you install SourceSay. Customers see nothing until you turn it on, so you can set it up calmly. The setup has three steps:

  1. What kind of store is this? Pick the closest match: General store, Fashion and beauty, B2B and services, or Local business. It fills in a starter set of answers you can change later.
  2. Check your question. Reword the question and answers if you like and watch the live preview.
  3. See it live. Choose Place a test order. The thank-you page opens in a new tab, so you can answer the question just like a customer would. The setup screen notices when your test answer arrives.

Finish with Turn on my survey. If you skip the setup, the survey stays off and you can turn it on from Reports when you are ready.

Test ordersTest orders always show the survey, even when it is off. They are never counted in Reports or in the CSV export. Remove them with Delete test orders.

Edit the survey

Open WooCommerce > SourceSay > Survey. The live preview on the right updates as you type and can switch between desktop and mobile. Your theme sets the final font and colours.

The question

The default is “How did you hear about us?”. You can write your own, up to 160 characters.

Answers

  • Add, remove and rename answers. Up to 20 answers are allowed.
  • Reorder them with the drag handle or the arrow buttons.
  • Choose an icon for each answer from the searchable icon library, including brand logos such as Google, Instagram, Facebook, TikTok and YouTube.
  • Shown: turn an answer off to hide it without deleting it.
  • Shuffle the answers for each order so the first answer is not picked more often just because it is first. “Other” always stays last.

Follow-up questions

Turn on Follow-up question for any answer to ask one more thing when a customer picks it, for example “Which podcast?” or “Who should we thank?”. You can set the follow-up question and the placeholder text. The Reports tab groups follow-up answers, so you see which podcast or creator was named most.

The “Other” answer

Offer an “Other” answer with a text box so customers can name a channel you did not list. Change its label and placeholder, or turn it off. The latest “Other” answers appear in Reports.

Skip button

A “Prefer not to say” button is on by default. A skip is saved so the survey is not shown again. Skips are counted separately and never mixed into your answers or revenue. You can change the button text or turn it off.

Who to ask

  • Everyone: every order gets the question until it is answered or skipped, including orders from repeat customers.
  • Only first-time customers: customers who already paid for an earlier order are not asked again. Customers are recognised by their account, or by billing email for guest orders.

Look and messages

Choose a Layout (buttons or list), an Accent colour (or keep your theme’s colour), the Position on the confirmation page (before or after the order details) and the Thank-you message customers see after they answer.

Changes are saved with Save changes at the bottom of the screen. The button stays disabled until you change something.

Where the survey appears

Set this on the Survey tab under Where the survey appears.

  • Automatically on the thank-you page (default): shown on the standard WooCommerce order confirmation page, with classic checkout or the Checkout block. Nothing to set up.
  • Only where I add the SourceSay block or shortcode: for custom thank-you pages built with a page builder or funnel plugin. The survey shows up only where you place it.

Block and shortcode

In the block editor, click + and search for the SourceSay survey block. In Elementor or Bricks, paste [sourcesay] into a Shortcode element. In FunnelKit or CartFlows, add the shortcode to your thank-you step. The shortcode also accepts an order ID: [sourcesay order_id="123"].

SourceSay finds the order from the page address by itself. It reads order-received, order_id, order, wcf-order or order-id for the order, and key, order_key or wcf-key for the order key. The order key must match, so nobody can answer for someone else’s order. The survey is shown only once per page, even when the automatic option is on too.

Ask again in My Account

With Ask again in My Account turned on (Settings tab, on by default), customers who did not answer on the thank-you page see the question on My Account > Orders > View for 30 days after ordering.

When the survey is not shown

The survey is hidden when it is turned off, when no answer is shown, when the order failed or was cancelled, when the order already has an answer or a skip, and when “Only first-time customers” is on and the customer ordered before. Test orders always show it.

SpeedThe survey appears after the order is placed, so it never slows down checkout. Its small script and stylesheet load only on the order confirmation and view-order pages.

Reports and CSV export

Open WooCommerce > SourceSay > Reports. Pick 7 days, 30 days, 90 days or Custom. Every number is compared with the previous period of the same length.

Status card

At the top, a green “Your survey is live” card confirms everything works, with your last answer, your response rate, your checkout type (block or classic) and your theme. If something is wrong, it explains the problem in plain words with the exact fix, for example a caching plugin that needs the thank-you page excluded, or a funnel plugin that needs the block or shortcode.

The numbers

  • Answers: how many customers picked an answer. Skips and test orders are not counted.
  • Response rate: answers divided by paid orders in the period. Skips are shown as a separate number and rate.
  • Revenue from answered orders: what these customers spent on the orders where they answered, after refunds.
  • Average order value: what a customer spends per order, on average.

Only paid orders count (Processing and Completed by default). Revenue stays live: refunds and status changes update the stored order total.

Channels

The channel table is ranked by revenue. For each channel it shows answers, revenue, average order and two bars: its share of answers and its share of revenue. A revenue bar longer than the answers bar means that channel brings bigger orders. Once you have at least 20 answers, What stands out sums up the most useful findings in plain sentences.

More detail

  • Daily trend of answers and revenue.
  • New vs returning customers. Returning means the customer had paid for an earlier order.
  • Follow-up answers: the podcasts, creators or friends customers named, grouped when the wording matches.
  • Latest “Other” answers.
  • What customers said, side by side with what WooCommerce Order Attribution tracked.

Not sure what a number means? Every label has an info tip, and How to read this report at the bottom explains the whole screen.

Export to CSV

Choose Export CSV at the top of Reports. The file covers the selected period and has these columns: date, order_id, order_number, answer, follow_up, other, order_total, currency, status, returning, woocommerce_source_type, woocommerce_source. Skips appear with the answer “Skipped”. Cells that start with =, +, – or @ are escaped, so the file is safe to open in a spreadsheet.

Orders, emails and customers

Orders list

  • A Heard about us column shows each customer’s answer, with the brand logo when there is one.
  • The Origin column (the source WooCommerce tracked) also gets brand logos. Developers can keep the WooCommerce column with the sourcesay_replace_origin_column filter.
  • A filter dropdown shows only orders with a given answer.
  • Search by answer: on stores with high-performance order storage, choose “How they found you” in the search dropdown. On the classic orders screen, just search. The search matches the answer, the follow-up and the “Other” text.

Order screen

Each order has a SourceSay box with the answer, the follow-up, the “Other” text and what WooCommerce tracked. When a customer answers, SourceSay also adds a private order note, for example “Customer said: Instagram”.

Order emails

Admin emails sent after the customer answered, such as order status changes, include “How they found you”. The “New order” email is sent before the customer reaches the thank-you page, so it cannot contain the answer. Open the order or the note to see it.

Customer profiles

On a customer’s user profile, the How they found you section lists each answered order with its date, a link to the order, the answer and the follow-up.

Dashboard widget

The SourceSay: How customers found you widget sits on the WordPress Dashboard for users who can manage WooCommerce. It shows the last 30 days: your response rate and revenue from answered orders with the change from the 30 days before, where answers come from, and your top five channels by revenue. See the full report opens Reports.

When the survey is off or there are no answers yet, the widget says so in plain words and tells you what to do next. Hide it like any other widget under Screen Options.

Settings and data retention

  • Ask again in My Account: customers who did not answer can answer on My Account > Orders > View for 30 days after ordering. On by default.
  • Keep answers for: Keep forever (default), 90 days, 180 days or 365 days. Older answers are deleted once a day. Your WooCommerce orders are never touched.
  • Delete all SourceSay data when the plugin is deleted: off by default. Deactivating the plugin always keeps your data. When this is on, deleting SourceSay from the Plugins screen permanently removes every answer and setting.
  • What is stored for each answer: the Settings tab lists every field SourceSay saves, so you can point to it in your privacy policy.
  • For developers: a collapsible panel with hooks, REST routes, CSV columns and copyable code examples. See For developers.

Privacy and GDPR

SourceSay stores the customer’s answer, the optional follow-up and “Other” text, the order total, currency and status, whether the customer ordered before, and the source WooCommerce tracked. All data stays in your own WordPress database.

  • No data is sent to external servers.
  • No external scripts, fonts or images are loaded.
  • There is no tracking.

Export and erase personal data

SourceSay works with the WordPress tools under Tools > Export Personal Data and Tools > Erase Personal Data, listed as “SourceSay”. Orders are found by the customer’s billing email. Erasing blanks the follow-up and “Other” text and unlinks the customer account, so the answer stays in your totals without being tied to a person.

Retention

Set Keep answers for in Settings to delete answers automatically after 90, 180 or 365 days.

This is general information, not legal advice. Your privacy policy should still mention that customers can answer an optional question after checkout.

Translations and currencies

WPML and Polylang

Every text customers see can be translated: the question, answer labels, follow-up questions and placeholders, the “Other” label and placeholder, the thank-you message and the skip button. SourceSay registers them each time you save the survey.

  • WPML: go to WPML > String Translation and pick the “SourceSay” context.
  • Polylang: go to Languages > Translations and pick the “SourceSay” group.

When one of these plugins is active, the Survey tab shows a reminder of where to translate.

Multi-currency stores

Reports always use your main store currency. Orders paid in another currency are converted with the rate saved by Aelia Currency Switcher, WooPayments Multi-Currency, CURCY or WPML/WooCommerce Multilingual when it exists. If your currency plugin is not detected, the order total is used as it is, and a note in Reports tells you that currencies are mixed. Developers can add their own conversion with the sourcesay_order_total_base filter.

For developers

The same reference is inside the plugin under Settings > For developers. Function, option and hook names start with sourcesay_. Answers live in the {prefix}sourcesay_responses table, one row per order. SourceSay is compatible with high-performance order storage.

PHP hooks

Hook Type Arguments Use it to
sourcesay_should_display Filter $show, $order, $context Hide or force the survey for some orders. $context is “thankyou” or “account”.
sourcesay_response_data Filter $data, $order Change the row before it is saved.
sourcesay_response_saved Action $id, $data, $order Send each new answer to a CRM, Slack or analytics. Also fires for skips: check that $data['answer_id'] is not “__skip”.
sourcesay_order_total_base Filter $base, $order Convert an order total to your main store currency when your currency plugin is not detected.
sourcesay_loaded Action None Start your add-on. Runs early on plugins_loaded, once every SourceSay function exists.
sourcesay_settings_schema Filter $schema Add your own settings: key => array( ‘default’ => value, ‘sanitize’ => callback ). They are saved with the survey settings.
sourcesay_survey_steps Filter $steps, $order, $settings, $context Add more questions after the first one. Show them with the sourcesay.survey.next JavaScript hook.
sourcesay_report_data Filter $report, $range Add your own sections to the report data. Cached for 5 minutes with the report.
sourcesay_status Filter $status Add your own checks to the status card: append { code, message } to $status['problems'].
sourcesay_csv_columns Filter $columns Add, remove or reorder CSV columns. The list is also the header row.
sourcesay_csv_row Filter $row, $response, $order Fill your own columns. $order is false when the order was deleted.
sourcesay_client_ip Filter $ip Return the visitor IP used for rate limiting when your site is behind a proxy.
sourcesay_replace_origin_column Filter $replace Return false to keep the WooCommerce Origin column as it is.

JavaScript hooks (wp.hooks)

Hook Where Use it to
sourcesay.tabs SourceSay screen Add a tab: { id, label, icon, render( wrap, { ui } ) }.
sourcesay.reports.cards Reports Add cards below the channel table. Only shown when there are answers.
sourcesay.survey.cards Survey Add cards to the survey builder. Change your keys in draft, then call changed() so the Save bar turns on.
sourcesay.settings.cards Settings Add cards to Settings, with the same draft rules.
sourcesay.developer.items For developers panel Add your own developer notes at the end of the panel.
sourcesay.survey.next Thank-you page Return an element to show the next question in the same card instead of the thank-you. Call done( message ) after the last one.

Example: skip the survey for bank transfers

add_filter( 'sourcesay_should_display', function ( $show, $order, $context ) { if ( 'bacs' === $order->get_payment_method() ) { return false; } return $show; }, 10, 3 );

Example: add a card to Reports

// Load your script on WooCommerce > SourceSay with the 'wp-hooks' dependency. wp.hooks.addFilter( 'sourcesay.reports.cards', 'my-plugin', function ( cards, ctx ) { cards.push( ctx.ui.card( { title: 'My numbers' }, ctx.ui.el( 'p', { text: 'Hello' } ) ) ); return cards; } );

REST API

Namespace sourcesay/v1. The public route saves an answer:

  • POST /wp-json/sourcesay/v1/response with order_id, order_key, answer_id and optional followup_text, other_text, context. The order key must match. Send "__skip" as the answer to save a skip. Limited to 10 requests per 10 minutes per IP. Errors: 400 invalid answer, 403 wrong order key, 409 already answered, 429 rate limited.

Admin routes need the manage_woocommerce capability and a REST nonce:

  • GET and POST /admin/settings: read or save the survey settings.
  • GET /admin/report?from=YYYY-MM-DD&to=YYYY-MM-DD: the full report as JSON (store timezone, last 30 days by default).
  • GET /admin/status: whether the survey is live, plain-English problems, checkout type, caching and translation plugins.
  • POST /admin/test-order and DELETE /admin/test-orders: create and remove test orders.

Troubleshooting

The survey does not show

  1. Open Reports and read the status card. It names the problem and the fix.
  2. Check that the survey is turned on and at least one answer is shown.
  3. If you use FunnelKit, CartFlows or a page builder thank-you page, add the SourceSay survey block or [sourcesay] shortcode to it.
  4. If you use a caching plugin, exclude the order confirmation page from the cache. The status card names the plugin.
  5. Remember that each order is asked once. Place a new test order to see the survey again.

Can customers answer twice?

No. Each order has at most one answer.

The “New order” email has no answer

That email is sent before the customer reaches the thank-you page. Later admin emails include the answer, and it is always on the order as a private note.

Does it work without JavaScript?

Yes. The survey is a normal form that also works with JavaScript turned off. It includes a honeypot field and rate limiting against spam.

What happens when I uninstall?

Nothing is deleted unless you turn on “Delete all SourceSay data when the plugin is deleted” in Settings.

Still have a question?

Ask Rasel Hakkani, the WordPress developer who built SourceSay. Replies usually come within an hour, depending on availability.

Start a discussion