I run a small DTC brand on Shopify. For most of last year, cold paid traffic sat at a 1.6% conversion rate and refused to move. I had already pulled every obvious lever: rewritten product copy, swapped the hero, tightened the checkout, run image compression on the LCP element, added reviews, added an FAQ block, run two pricing tests. Each one moved the needle a tenth of a percent at best. Some moved nothing.
The question I could not get out of my head: what actually moves CR on cold traffic for an indie DTC store, when most of the standard CRO playbook has already been run?
What ended up working was so simple it embarrassed me. I added a row of five logos under the hero. Six weeks later, cold-traffic CR was sitting at 1.9%. That is roughly an 18% lift, on the segment of traffic that had been the most stubborn.
This is the writeup of that experiment: what failed, what changed, the numbers, the caveats, and the technical implementation that ate more time than it should have.
Why logos hit a different channel than reviews
Reviews and testimonials are processed as language. A visitor has to read them, decide whether the source is credible, then integrate the claim into their model of the brand. That takes seconds, and on cold traffic you frequently do not get seconds.
Logos are processed as pattern recognition. A visitor sees a familiar mark, the brain assigns a category ("I know that publication") and a status ("real brand, has been vetted somewhere"), and the inference happens before any conscious reading takes place. It is the same shortcut your eye uses to recognize a stop sign. You do not parse it, you respond to it.
This is the part of the funnel where most cold visitors decide whether to keep scrolling at all. They are not yet evaluating the product. They are deciding whether to trust the storefront enough to evaluate the product. Logos answer that question in the half-second before they have asked it.
What I shipped
Five logos. Greyed out (one desaturation filter, not five different brand-coloured logos competing for attention). Caption above the row: "Featured in". Placement above the fold, directly under the hero, before the first product block.
Real coverage only. I had a feature in a regional newspaper, a mention in a niche industry blog, two podcast appearances, and a partner brand we ship with. That was it. No "as seen on Forbes" when nobody at Forbes has ever heard of me.
The above-the-fold placement matters more than the logos themselves. A trust row buried in the footer reaches the visitors who already trust you enough to scroll three screens. The whole point is to catch the ones who would have bounced at screen one.
The numbers (with honest caveats)
Six weeks, clean data, GA4 plus Shopify Analytics cross-checked.
Cold paid traffic: CR moved from 1.6% to 1.9%. Homepage bounce rate dropped about 6 percentage points. Time-to-first-PDP-view dropped noticeably, though the funnel is noisy enough that I do not trust a single number for that one.
Returning traffic: no change. This makes sense. Returning visitors already have a category and a status assigned to the brand. The logos do not tell them anything new.
The caveat I want to be honest about: this lift came on top of a product page that already worked. I had spent months getting the basics into shape (copy, images, reviews, page speed, checkout friction). The trust row was the unlock for a storefront that was otherwise converting, just not converting cold visitors. If your PDP is leaking elsewhere, a logo bar is not going to plug that leak. It is the last 18%, not the first.
If your funnel is broken further down, a trust row will not fix it. It fixes the front door, not the back rooms.
What did not work
Three things I tried on the way there.
Fake "as seen on" badges scraped from a stock kit. A visitor who has actually heard of any of those publications can smell this in a fraction of a second, and the visitors who have not heard of them get no signal at all. Net zero or net negative, hard to say which.
Bottom-of-page placement. I started here because it felt less aggressive. It is less aggressive, because nobody sees it. The visitors I was trying to convince had already left.
Manually rebuilding the row every time we picked up new coverage. Editing the theme, finding the logo URLs, redoing the responsive breakpoints. Each refresh took 30 to 40 minutes and I started avoiding the work. A trust row you do not maintain decays fast, because the logos on it slowly stop being the most credible ones you actually have.
The technical implementation
The first version was a Liquid section. Hardcoded image URLs, a flex container, some basic CSS. It looked fine on desktop. It broke on mobile, because the logos either wrapped weirdly or got compressed into illegibility, and the spacing was wrong on every screen between 360 and 768 pixels. The starting point looked roughly like this:
{% comment %} trust-row.liquid (v1) {% endcomment %}
<div class="trust-row">
{% for block in section.blocks %}
<img src="{{ block.settings.logo | img_url: '200x' }}"
alt="{{ block.settings.alt }}"
loading="lazy">
{% endfor %}
</div>
<style>
.trust-row { display: flex; gap: 48px; justify-content: center; }
.trust-row img { filter: grayscale(1); opacity: 0.6; height: 40px; }
</style>
That snippet works on desktop. On mobile it does not, because fixed-pixel gaps and a fixed image height stop fitting the viewport as soon as you cross five logos. Adding media queries got it usable, but every theme update threatened to undo the changes, and the next merchant who wanted to swap a logo had to open the code editor.
I rewrote it as a Shopify Theme App Extension (App Block). Two main wins: it lives outside the theme, so it survives theme updates, and a non-dev can drop it in via the theme editor, drag to reorder, and swap a logo without touching code. The responsive scaling is baked in (logos stretch and compress as a group, never wrap unless the viewport is genuinely too narrow, at which point the layout switches to an auto-scrolling carousel).
I ended up shipping this as a small Shopify app called Eye Catching (https://apps.shopify.com/beautiful-brands), because once the logic was solid enough to use on one store there was no reason to keep rebuilding it for every store. The free tier covers three logos, which is enough to test the hypothesis on your own storefront before you decide whether the experiment is worth running for you.
The App Block schema is roughly this shape:
{
"name": "Trust Row",
"target": "section",
"settings": [
{ "type": "text", "id": "caption", "default": "Featured in" },
{ "type": "select", "id": "layout", "options": ["grid", "carousel"] },
{ "type": "range", "id": "logo_height", "min": 24, "max": 80 }
],
"blocks": [
{ "type": "logo", "settings": [
{ "type": "image_picker", "id": "image" },
{ "type": "url", "id": "link" }
]}
]
}
Nothing exotic. The discipline is in keeping it boring: no script tags, no external CDN calls, no JS for the static grid variant. The carousel variant ships a small vanilla loop, no library.
The bigger lesson
Most DTC stores I have looked at have press mentions, payment-method badges, stockist relationships, or partner brands sitting on a sub-page that no cold visitor ever reaches. That is unused equity. You did the work to earn the coverage. Putting it where 100% of arriving traffic sees it costs nothing.
Where to look in your own store: any sub-page titled "Press", "As Seen In", "Stockists", "Partners", or "Wholesale". If you have logos on those pages, you already have a trust row. If you do not, your "About" page often has the raw material (publication names, partner names) and the logos are usually one search away.
Open question
I tested this on a single store, in a single category, with cold paid traffic from a single source. The 18% number is a real number from a real funnel, not a marketing figure, but it is one funnel.
What I genuinely do not know yet: how this behaves on low-AOV impulse buys. My hypothesis is that the cognitive math is different (a $14 impulse purchase needs less reassurance than a $90 considered purchase, so the marginal value of a trust signal is probably smaller), but I have not tested it.
If you have run something similar on a low-AOV catalog, drop the result in the comments. I would like to know whether the pattern holds.
Top comments (0)