# PinFlow — Full Documentation > Complete content from all pages on getpinflow.com --- title: How to Add an Image to a Shopify Accordion description: Shopify's collapsible (accordion) block only accepts text, so the dynamic source picker never offers an image. Here is the no-code-file way to show a per-product image inside an accordion row, like a size guide. --- ## The problem A merchant asked about this on the Shopify Community. They run the Trade theme and wanted to show an image inside one of the collapsible rows on a product page. An accordion, or collapsible, is one of those rows on the product page that opens when you click it. "Product features", "Materials and care", "Shipping". You click the heading and it drops open to show text. They wanted to drop an image in there instead of text. A size chart, a certificate, a care diagram. And they wanted it to be different for each product, pulled from a dynamic source. They got stuck fast. The collapsible block only lets you type text. They tried pasting code into the theme's Custom CSS box, and nothing happened. They tried switching a setting from text to liquid, and the image came out blank. I reproduced the whole thing on a test store running Trade. Every part of what they hit is expected, and the fix is small. ## Why you cannot pick an image in an accordion This is worth understanding, because it tells you why the fix has to be code. The collapsible block on the product page has one content field, and that field only accepts text or rich text. That is the whole design of it. When you click the dynamic source icon on that field, Shopify only offers you text-based metafields. There is no image option in that list, so there is nothing to pick. A rich text field will not hold an image either. So the accordion itself gives you no way in. The image has to be printed by a small piece of Liquid, the theme's template language. That is the only way to get an actual image tag inside the collapsible content. Two things the merchant tried, and why neither worked: - The Custom CSS box cannot run Liquid. It only styles what is already on the page. Pasting Liquid there does nothing. - Changing a setting from text to liquid does not, on its own, render an image. It just changes what kind of value the field expects. ## Two ways to put an image in a Shopify accordion There are two clean routes, and you almost always want the first one. **Its own collapsible row, no theme files.** You add a Custom Liquid block to the product page. Inside it you build one accordion row that holds the image. It looks exactly like the theme's other rows, and you never touch a theme code file. This is the one I recommend, and the steps below use it. **Inside an existing row.** If you want the image to sit inside one of your current rows, next to its text, that needs a small edit in the theme's code. It is doable, but it means editing a core theme file, so keep it for when you specifically need the image beside existing text. ## Step by step: add an image to a Shopify accordion This works with a File metafield and a Custom Liquid block. No theme code files are edited. I tested every step on Trade. ### 1. Create an image field Go to Settings, then Custom data, then Products, then Add definition. Name it Detail image. Set the Type to File, then choose Image. Save. ![The Detail image product metafield in Shopify, set to type File then Image](/images/blog/add-image-shopify-accordion/02-detail-image-metafield.png) That File type is the piece the accordion's dynamic source picker never offers you. Creating it as its own field is what gives you an image to work with. ### 2. Put an image on the product Open a product. Scroll to its Metafields section and find Detail image. If you do not see it, click View all metafields. Upload the image you want for that product. Each product gets its own, so a shirt can show its size chart and a candle can show its burn guide. ### 3. Add a Custom Liquid block Go to Online Store, then Themes, then the three dots, then Customize. Open a product. In the product information area, click Add block, then Custom Liquid. Paste this and Save: ```liquid {%- assign detail_img = product.metafields.custom.detail_image.value -%} {%- if detail_img != blank -%}

Size guide

{{- 'icon-caret.svg' | inline_asset_content -}}
{{ detail_img | image_url: width: 1200 | image_tag: loading: 'lazy' }}
{%- endif -%} ``` That is it. You get a new collapsible row, styled like the theme's own rows, with that product's image inside it. ![A per-product image showing inside its own collapsible accordion row on a Shopify product page](/images/blog/add-image-shopify-accordion/01-image-inside-shopify-accordion.png) Change the word Size guide to whatever heading you want. The row only appears on products that have an image, so any product without one stays clean. ## The one line that fixes the "blank image" The merchant's earlier attempt showed a blank image. This is the most common mistake, and it is one word. Look at the top of the snippet: `detail_image.value`. That `.value` matters. A File metafield does not hand you the image directly. It hands you a reference. Adding `.value` is what turns that reference into the actual image, which the `image_url` and `image_tag` filters then need to build the tag. Leave off `.value` and Shopify has nothing real to draw, so the image comes out empty. That is the blank image. Put `.value` back and it renders. If yours is still blank after adding `.value`, the metafield on that product is probably empty. Go back to step 2 and upload the image. ## Shopify accordion, collapsible content, and product tabs People use these words for the same thing, which causes confusion when searching for help. - **Accordion** is the general name for rows that expand when clicked. - **Collapsible row** or **collapsible content** is Shopify's own name for the block, in Dawn and its family. - **Product tabs** usually means the same rows, sometimes styled as side-by-side tabs by an app or a paid theme. Underneath, they are the same idea. The block takes text, not images, so the image fix above is the same whichever name your theme uses. ## Add a size guide image to a Shopify product page The size guide is the classic reason to want this, so it is worth calling out. The steps are exactly the ones above. Name the metafield Size guide, upload a size chart image per product, and set the heading in the snippet to Size guide. Because the image is per product, each product shows its own chart. A dress shows dress measurements, a jacket shows jacket measurements, and you never mix them up. If you would rather have one shared size chart for the whole store, see the next section. ## Can I show the same image on every product? Yes. If the image never changes, you do not need a metafield at all. Upload the image under Content, then Files, and copy its URL. Then replace the metafield line in the snippet with that image, so every product shows the same one. The metafield route is only there so each product can differ. Drop it when you want one shared image, like a store-wide shipping graphic. ## What to check if it did not work A few things trip people up. Run through these. - **Blank image.** You are missing `.value`, or the product has no image uploaded yet. - **The row never appears.** The product has no image, so the guard hides the row on purpose. Upload one. Or the Custom Liquid block was not actually added to the product page. - **The image is huge.** Lower the `width: 1200` number, or the image is fine and just looks big because the row is narrow. You can also cap it with a little CSS. - **Nothing renders at all.** Make sure you pasted into a Custom Liquid block on the product page, not into the Custom CSS box. CSS cannot run Liquid. ## Would an app be easier? If the image you want is a size chart, an app can be simpler than any code, and most have a free tier. Size chart apps like Kiwi Sizing, Avada Size Chart, or Clean Size Chart let you build a chart, assign it by product or collection, and drop it on the product page with a button. No metafields and no Liquid. The trade-off is that the app owns the look and adds its own script to your store. The code route above keeps everything native to your theme and adds nothing extra to load. For a plain per-product image, the code route is lighter. For a full interactive size table, an app is usually worth it. ## Which themes this works on I tested this on Trade. The same snippet works on Dawn and the free Dawn-family themes, because they share the same collapsible markup and class names. If your theme is a paid one with a very different structure, the class names in the snippet may differ. The idea still holds: a Custom Liquid block, a File metafield, and `.value`. Only the wrapper classes change to match your theme. That is the whole fix. A merchant went from a blank image and a dead end to a real, per-product image sitting inside a collapsible row, with no theme code files touched. --- --- title: "How to Add Scrolling Testimonials to Shopify (No App)" description: A merchant wanted a smooth marquee of 5-star testimonials on their Supply store. Here is a free custom section that scrolls non-stop, no app, with the full code and step-by-step screenshots. --- ## The problem A merchant asked about this on the Shopify Community, and it is a request I see a lot. They wanted a scrolling marquee of customer testimonials on their home page. A single row of cards that glides sideways at a steady pace and never stops. Each card showing a 5-star rating, a short quote, and the customer's name. Clean, premium, on-brand. They had years of real feedback sitting on a testimonials page and wanted it moving across the front page where new visitors would actually see it. They run **Supply**, one of Shopify's older free themes. So the first thing they found is that there is no "scrolling testimonials" block anywhere in the theme. There is nothing to just switch on. There does not need to be. This is a small custom section that lives in your theme as a text file. No app, no monthly fee. Here is the finished thing running on a store. ![A scrolling testimonials marquee live on a Shopify home page](/images/blog/add-scrolling-testimonials-shopify/01-scrolling-testimonials-live.jpeg) I reproduced this on a vintage Shopify theme and it took one file and about five minutes. The rest of this guide is that file plus the exact clicks. ## Testimonials or product reviews? Pick the right one first Before you build anything, know which of these two you actually want, because people mix them up and then install the wrong thing. **Testimonials** are quotes you control. You write them, you choose which ones show, and they sit wherever you place them. Great for a home page trust strip. That is what this guide builds. **Product reviews** are star ratings customers leave on individual products. Those need a reviews app that collects, verifies, and stores them per product. If your goal is "let buyers rate my products," that is a different job and an app like Judge.me or Loox is the right tool. The marquee below is testimonials. You type the quotes in, so it works even if you have never collected a single product review. If you later want it fed by verified reviews instead, I cover that at the end. ## Why older themes have no marquee block This is worth understanding, because it decides how you add anything custom to your store. Themes come in two broad generations. Newer themes (Dawn, Horizon, and most 2021-and-later themes) are built from sections and blocks you can drop anywhere. Older free themes like Supply, Debut, Brooklyn, and Minimal are from an earlier era. They ship a fixed set of home page sections and that is mostly it. Supply does one helpful thing though. Its home page still supports adding sections. That means if you create a new section file, and that file declares a **preset**, it shows up in the theme editor's "Add section" list like any built-in one. No editing of template files, no theme surgery. So the plan is two parts. Create the section file once in the code editor. Then drop it on the home page from the customizer like any other section. Let us do it. ## What you are building A Shopify section is a single `.liquid` file in your theme's `sections` folder. This one has three jobs. **The markup and the animation.** A row of cards, printed twice, sliding left forever with a CSS animation. Printing the set twice is the trick that makes the loop seamless, and I explain it below. **The settings.** A schema block at the bottom generates the controls you see in the theme editor: heading, scroll speed, card width, and colours. You never touch code again to tune it. **The testimonials.** Each testimonial is a repeatable block with a quote and a name. Add, edit, reorder, and delete them from the sidebar. The 5 stars are printed on every card automatically. ## Step 1: create the section file Go to **Online Store > Themes**. Next to your theme, open the **...** menu and click **Edit code**. In the file list on the left, click the **sections** folder, then the **New file** icon. Name it `testimonial-marquee` and keep the type as Liquid. ![Shopify code editor, adding a new section file](/images/blog/add-scrolling-testimonials-shopify/02-edit-code-new-section.jpeg) Shopify creates the file with a little starter code. Delete all of it, paste in the code below, and save. ```liquid {%- assign speed = section.settings.speed | default: 40 -%}
{%- if section.settings.heading != blank -%}

{{ section.settings.heading }}

{%- endif -%}
{%- for i in (1..2) -%} {%- for block in section.blocks -%}

{{ block.settings.quote }}

{%- if block.settings.name != blank -%}

{{ block.settings.name }}

{%- endif -%}
{%- endfor -%} {%- endfor -%}
{% schema %} { "name": "Testimonials marquee", "settings": [ { "type": "text", "id": "heading", "label": "Heading", "default": "What our customers say" }, { "type": "range", "id": "speed", "min": 15, "max": 90, "step": 5, "unit": "s", "label": "Scroll speed (lower = faster)", "default": 40 }, { "type": "range", "id": "card_width", "min": 240, "max": 480, "step": 10, "unit": "px", "label": "Card width", "default": 320 }, { "type": "header", "content": "Colors" }, { "type": "color", "id": "bg_color", "label": "Section background", "default": "#0f1115" }, { "type": "color", "id": "heading_color", "label": "Heading text", "default": "#ffffff" }, { "type": "color", "id": "card_color", "label": "Card background", "default": "#ffffff" }, { "type": "color", "id": "text_color", "label": "Card text", "default": "#1a1a1a" }, { "type": "header", "content": "Spacing" }, { "type": "range", "id": "padding_top", "min": 0, "max": 100, "step": 4, "unit": "px", "label": "Padding top", "default": 48 }, { "type": "range", "id": "padding_bottom", "min": 0, "max": 100, "step": 4, "unit": "px", "label": "Padding bottom", "default": 48 } ], "blocks": [ { "type": "testimonial", "name": "Testimonial", "settings": [ { "type": "textarea", "id": "quote", "label": "Quote", "default": "Fantastic service and the radio works perfectly." }, { "type": "text", "id": "name", "label": "Customer name", "default": "Happy customer" } ] } ], "presets": [ { "name": "Testimonials marquee", "blocks": [ { "type": "testimonial" }, { "type": "testimonial" }, { "type": "testimonial" }, { "type": "testimonial" }, { "type": "testimonial" } ] } ] } {% endschema %} ``` ![Pasting the section code into the Shopify code editor and saving](/images/blog/add-scrolling-testimonials-shopify/03-paste-section-code.jpeg) That is the whole thing. Nothing else to install. ## Step 2: add it to your home page Leave the code editor and click **Customize** to open the theme editor. On the home page, click **Add section**. Because the file declares a preset, **Testimonials marquee** is right there in the list with a live preview. Click it. ![Adding the Testimonials marquee section from the Shopify theme editor](/images/blog/add-scrolling-testimonials-shopify/04-add-section-homepage.jpeg) It drops onto the page already scrolling, with five sample cards so you can see the shape immediately. ## Step 3: add your own reviews In the sidebar, the section expands to show the testimonial blocks. Click each **Testimonial** to set its quote and the customer's name. Use **Add Testimonial** to add more, drag them to reorder, and delete any you do not want. The 5 stars appear on every card automatically, so you do not type them. ![Editing the testimonial quote and name blocks in the Shopify theme editor](/images/blog/add-scrolling-testimonials-shopify/05-edit-testimonial-blocks.jpeg) Add as many as you like. More cards just make a longer loop. ## Step 4: speed, width, and colours Open the section's own settings and you get the knobs. - **Scroll speed.** Lower number means faster. The default of 40 is a calm, premium glide. Drop it to 20 for something livelier. - **Card width.** Narrower cards fit more on screen at once. - **Colours.** Section background, heading, card background, and card text. The default is a dark, premium look, but set the section background to white and the card text dark if that suits your brand better. ![The Testimonials marquee settings: speed, card width, and colours](/images/blog/add-scrolling-testimonials-shopify/06-settings-speed-colours.jpeg) Save, and it is live. It stays a single smooth row on desktop and mobile. ## The one trick that makes the loop seamless This is the part people get wrong, so it is worth a minute. A naive marquee scrolls one set of cards off the left edge, then jumps back to the start. You see the jump, and it looks broken. The fix is in these two lines of the code you pasted: ```liquid {%- for i in (1..2) -%} {%- for block in section.blocks -%} ``` The cards are printed **twice**. The animation then slides the whole track left by exactly half its width (`translateX(-50%)`). At the moment the first copy has fully scrolled off, the second copy is sitting in precisely the position the first one started in. The animation loops, but because the two halves are identical, the seam is invisible. It looks like one endless river of cards. That is why the loop never stutters. Do not remove the `(1..2)` loop or the `-50%`, they are a matched pair. ## Common tweaks **Make it pause when someone hovers.** Add this one line inside the ` {%- elsif section.settings.image != blank -%} ``` This does the real work. It builds a video player set to autoplay, loop, and muted, and it makes that video cover the same area your image used to fill. **Edit two, add the setting.** Scroll to the bottom of the same file, to the part that starts with `{% schema %}`. Find the image setting. ```liquid { "type": "image_picker", "id": "image", "label": "t:sections.image-with-text.settings.image.label" }, ``` Add this new block right after it. ```liquid { "type": "video", "id": "video", "label": "Video", "info": "Autoplays muted and loops. Use Height Small, Medium or Large." }, ``` Save the file. Now open the theme customizer and open your Image with text section. A new **Video** setting is sitting there. ![The new Video setting inside the Image with text section in the Shopify theme editor](/images/blog/add-video-to-shopify-homepage/02-video-setting-customizer.png) Pick your video in that setting. Set the section Height to Small, Medium, or Large. Save. That is it. The video now plays on its own, loops forever, and fills the same space the image used to. The text on top of it does not change. On my test store the section went from a frozen frame to a video that played and looped the moment the page loaded, covering the full hero area. ## How do I make a Shopify video autoplay? The key word in the code above is **muted**. Browsers block videos that try to autoplay with sound. Chrome, Safari, and the rest all do this, to stop pages blasting audio at you. A muted video is allowed to autoplay. So a hero video that plays on its own has to be muted. That is a browser rule, not a Shopify one, and there is no way around it. The `playsinline` part matters too. Without it, some phones will try to open the video full screen instead of playing it in place. `playsinline` keeps it inside your hero where it belongs. So the recipe for a self-playing hero video is always the same: autoplay, loop, muted, playsinline. All four. The code above sets all four for you. ## Does a video slow down your Shopify store? This was the merchant's original worry, and it is a fair one. It is also why they switched away from a GIF. Here is the thing. A short video is usually **lighter** than a GIF that shows the same clip. GIFs are a very old format and they get huge fast. A five second GIF can easily be several megabytes. The same clip as an MP4 can be a fraction of that. So moving from a GIF to a video is often a speed win, not a speed cost. To keep it fast, do a few simple things. Keep the clip short. Let Shopify host the file, which the code above does, so it serves the right size for each device. And do not stack three autoplay videos on one page. One muted, looping hero video, hosted by Shopify, is fine for almost every store. ## How do I save a video in a metaobject? The merchant in the thread had stored their video in a metaobject. You do not have to, but it is a tidy way to manage reusable media, so here are the steps. - Go to Settings, then Custom data. Or Content, then Metaobjects. - Open your definition, or click Add definition and give it a name like Hero Video. - Click Add field and choose the type **File**. - In that field's validation, set the accepted file types to Media, or Video only. - Save the definition. - Open the definition and click Add entry. - In the File field, upload your video or pick it from Files. - Save the entry. The video now lives in that metaobject. To use it, you do not have to pick the video directly in the Video setting. On that setting, click the small **dynamic source** icon and choose your metaobject. The section reads the video from there. That keeps your setup exactly as it was, just pointed at a section that can actually play it. ## The no-code way If you would rather not touch theme code at all, you have two options. First, some themes ship a dedicated **Video** section already. On Dawn it is a separate full-width section you add from the theme editor. The catch is it is its own section, so you cannot put a heading and a button on top of it the way Image with text lets you. Second, there are apps for exactly this. **Videowise** and **Easy Video Background** both add autoplay video sections and video backgrounds without code. They cost money and add a bit of weight, but they are quick and they are supported. For a single hero, the two-edit code above is lighter and free. For lots of video across the store, an app is easier to manage. ## If the video still will not play A few things to check if you followed the steps and it is still stuck. - **Height is set to Adapt.** Adapt sizes the section from an image, and there is no image now. Set Height to Small, Medium, or Large instead. - **The video setting is empty.** Make sure you actually picked the video in the new Video setting, or connected your metaobject to it. - **The file is not a video.** Only real video files play. A GIF is still an image, so it will not autoplay through a video player. - **You edited the wrong section.** If your hero is not "Image with text", it might be "Image banner". The edit is the same idea, just in `sections/image-banner.liquid`. - **You are looking at the live theme.** If you edited a duplicate, preview the duplicate, not your published store. ## Image setting versus video setting The whole issue comes down to two setting types, so it helps to know the difference. An **image** setting shows a picture. It is the right choice for a photo, a logo, or a banner still. It cannot play anything, because a picture does not move. A **video** setting shows a video player. It can autoplay, loop, and mute. It is the right choice for a moving hero. Connecting a video file to an image setting does not upgrade the image setting into a player. It just feeds the picture-shower a single frame of your video. That is what the merchant ran into, and it is easy to run into, because the setting happily accepts the video and shows something. The fix is not a workaround. It is giving the section the setting it actually needed, a video setting, so your video can finally play. --- --- title: "How to Assign a Template to a Page in Shopify" --- ## The step that makes people think their code is broken You built a page template. You added your code to it. You saved. You reload the page and absolutely nothing has changed. Nine times out of ten the template is fine and the code is fine. The page is simply still using the default template, because creating a template and assigning it are two separate actions, and only the first one happens in the theme editor. This comes up constantly on the Shopify Community. A merchant posts asking why their customisation did not apply, someone gives them correct code, and the thread stalls because the assign step never gets mentioned. Here is how assigning works, why the theme editor is not where you do it, and a worked example from a real thread. ## Create the template first In the Shopify admin, go to Online Store, Themes, then Customize. At the top of the editor there is a template selector showing what you are currently editing, usually "Home page". Click it, choose Pages, then Create template at the bottom of the list. Name it something meaningful. `sales`, `landing`, `no-header`. Base it on Default page unless you have a reason not to. ![Template selector, Pages, Create template](/images/blog/assign-template-to-page-shopify/03-create-template.jpeg) Look at that screenshot carefully, because it contains the tell. Next to each template Shopify prints how many pages use it. Default page says "Assigned to 1 page". The new `sales` template says **"Assigned to 0 pages"**. That line is the theme editor telling you the template exists but does nothing yet. If your customisation is not applying, check that line first. ## How to assign a template to a page in Shopify The assign step does not happen in the theme editor. It happens in the page's own admin screen. 1. Go to **Content**, then **Pages**. 2. Click the page you want to change. 3. On the right hand side, find the **Template** card. 4. Change the dropdown from "Default page" to your new template. 5. Click **Save**. ![Set the page Template to your new template](/images/blog/assign-template-to-page-shopify/05-assign-template-to-page.png) That is the whole thing. Reload the storefront page and your template is live. The reason this trips people up is that everything else about theming happens in the theme editor, so it feels like assignment should too. It does not. The theme editor edits templates. The page admin decides which page uses which template. ## One template, many pages This is the other half people get wrong, and it matters if you have more than one page to change. You do not need a template per page. A template is a layout that any number of pages can share. Build `sales` once, then assign all of your sales pages to it. The merchant whose thread prompted this article had **six** pages to change. Six templates would have meant six copies of the same code, and six places to edit when they want to change something. One template assigned six times means one place. You still repeat the assign step per page, since there is no bulk template picker in the pages list. Open each page, set the dropdown, save. It is quick, and you only do it once. Use a separate template only when the pages genuinely need different layouts. ## Worked example: hiding the header and footer on six pages Here is the thread this came from, because it is a good reason to want a page template at all. A merchant running the Shopify Horizon theme wanted six sales pages to display with no header and no footer, so they read as focused landing pages with nothing to click away to. They did the obvious thing first: opened the theme editor, found the header section, and switched it off. It disappeared from every page on the store. That is not a bug. The header and footer are **section groups**, shared by every page in the theme. There is no per page toggle for them. Toggling them off is a store wide change, which is exactly what they saw. The fix is to leave the global sections alone and hide them on one template only. ### Turn the global sections back on first If you already switched the header or footer off site wide, undo that before anything else. Otherwise you will be testing your new template against a store that is already broken, and nothing will look like it worked. ### Add the CSS to the template With your `sales` template selected in the theme editor, look at the sidebar. It has three groups: Header, Template, Footer. Header and Footer are global. Anything you put in the **Template** group applies only to that template. So that is where the code goes. In the Template group, click Add section, then choose Custom Liquid. Paste this into the Liquid code box and save. ```html ``` ![Paste the CSS into the Liquid code box](/images/blog/assign-template-to-page-shopify/04-paste-css-custom-liquid.jpeg) Those two class names are what Shopify puts on every section belonging to a group, which is why this catches the announcement bar, the header, the footer and the footer utilities without naming any of them individually. Then assign your six pages to the template, as above. Before, on the default template: ![Default template: announcement bar and header on top](/images/blog/assign-template-to-page-shopify/01-default-template-header-footer.png) After, on the sales template, same page and same viewport: ![Sales template: header, announcement bar and footer gone](/images/blog/assign-template-to-page-shopify/02-sales-template-chrome-gone.png) I tested this on Horizon 4.1.1. With the template applied, all four sections report `display: none` and zero height, and the page content starts at the very top of the viewport. The home page, collection pages and any page still on Default page keep their header and footer, so nothing leaks to the rest of the store. ### Keeping the announcement bar The announcement bar belongs to the header group, so the snippet above removes it along with the header. If you want to keep it and lose only the header, target the header section specifically: ```html ``` That second class is `header-section` on Horizon. Other themes name it differently, so inspect your own header in dev tools rather than assuming this carries across. ## Preview before you assign anything There is a shortcut worth knowing, especially with six pages to update. Add `?view=` and your template name to any page URL: https://your-store.com/pages/your-page?view=sales Shopify renders that page through the `sales` template without assigning anything. Nothing is saved and no customer sees it. Use it to confirm the code works on one page before you go and update all six. If the preview looks right and the real page does not, you know immediately that the problem is the assignment, not the code. ## How to create a new page template in Shopify Covered above, but to state it plainly since it is asked separately: Customize, template selector at the top, Pages, Create template, name it, base it on Default page. On older Shopify themes you may also see templates created by duplicating a `.json` file in Edit code. That still works. The theme editor route is easier and does the same thing. Templates for products and collections work identically. The selector has Products and Collections entries alongside Pages, and the assign step lives on the product or collection admin screen instead of the page one, in a Template card in the same position. ## How to delete a page template in Shopify Go to Online Store, Themes, then Edit code. Find your template under the `templates` folder, for example `templates/page.sales.json`. Use the three dot menu next to the file and choose Delete. Reassign any pages using it **before** you delete, otherwise those pages fall back to the default template and any customisation on them disappears without warning. ## If the template still is not applying **Check the assignment.** Open the page in the admin and look at the Template dropdown. If it says "Default page", that is your answer. This is by far the most common cause. **Check which template you edited.** It is easy to create `sales` and then add your section while the editor is still showing Home page. In the theme editor, confirm the template name at the top matches the one you assigned. **Check the section is in the Template group.** Code placed in the Header or Footer group applies everywhere, which is the original problem, not the fix. **Check you saved both.** Saving the theme editor and saving the page are two different saves, in two different screens. **Check the page is not a different resource type.** Shopify's Pages are `/pages/...` in the URL. If your URL is `/products/...` or `/collections/...` you need a product or collection template, and the page template you built will never apply. ## Templates, section groups, and why the difference matters These two get conflated constantly, and the distinction is the whole reason the assign step exists. A **template** describes one type of page and is chosen per resource. That is why it has an assign step: Shopify has to know which pages use it. A **section group** is the header and footer region, shared by every page in the theme. There is no assign step because there is nothing to assign; it is always on, everywhere. Once that is clear, the behaviour that confused the merchant stops being mysterious. Switching off the header section edited the section group, and section groups are global by definition. Nothing about it was per page, so the change was not either. --- --- title: "Avalara Shopify Integration vs Shopify Tax: Which to Use" description: Moving to Shopify with Avalara? Shopify Tax already calculates US sales tax to the street address. What the Avalara Shopify integration adds, what filing costs, and how to decide. --- ## The question: keep Avalara, or switch to Shopify Tax? A merchant moving a store from Magento to Shopify asked this on the Shopify Community. They had used Avalara on Magento for years. On Shopify, the cost of carrying Avalara across was higher than they expected: a new connector licence, migration work, and a fresh contract. They wanted two things from any tax setup: 1. **Rooftop-level calculation.** Rooftop means the tax rate is worked out from the buyer's exact street address, not from the ZIP code. One ZIP code can cross several cities and special tax districts, so a ZIP-based rate is sometimes wrong. 2. **Automatic filing in each US state.** Filing means sending the sales tax return to each state and paying what you collected. Their question was whether Shopify's own tax service is good enough, or whether the Avalara Shopify integration is still worth paying for. I checked this on a Shopify store with Shopify Tax active. The answer splits cleanly into those two jobs. Shopify covers the first one out of the box. The second one is where you need to spend money, but not necessarily on Avalara. ## What Shopify Tax does out of the box Shopify Tax is the tax service built into every Shopify store. You do not install it. For the US it is switched on under **Settings > Taxes and duties**. Open **Settings**, then **Taxes and duties**, then click **United States** in the list of tax regions. The **Tax service** column already shows Shopify Tax next to the United States. ![Shopify Settings, Taxes and duties, with the United States region using Shopify Tax](/images/blog/avalara-shopify-integration/01-shopify-taxes-and-duties-united-states.png) On the United States page, the **Tax service** box shows Shopify Tax as **Active**, with its fee printed right under the name. ![Shopify Tax shown as Active in the United States tax service box](/images/blog/avalara-shopify-integration/02-shopify-tax-active-tax-service.png) Shopify describes the calculation as rooftop accurate. Its feature page says Shopify Tax works across the more than 11,000 US sales tax jurisdictions, using the buyer's precise address. A jurisdiction is any area that sets its own tax rate: a state, county, city or special district. So for calculation alone, the merchant's first requirement is already met. You do not need Avalara to get address-level rates on Shopify. The same page carries two more tools worth knowing about: - **Tax liability insights.** Shopify tracks your sales per state and tells you when you have crossed a state's threshold and need to register. On my test store it flagged California with "Action required" because of physical presence. In tax terms this is called nexus: the point where a state says you owe it sales tax. - **Tax rate management.** Shopify rates each product by its category. Clothing, food and digital goods are taxed differently in different states. Products with no category are listed so you can fix them. My test store had 27 uncategorised products waiting there. ## What Shopify Tax costs Shopify Tax is not free at scale, but it is cheap next to most tax software contracts. From Shopify's pricing page: - **Free** for your first \$100,000 in sales. - Then **0.35%** of each order on Basic, Grow and Advanced plans in the US. - **0.25%** on Shopify Plus. - Capped at **\$0.99 per order**. One detail matters for stores that are moving over now. For stores created on or after May 13, 2026, the \$100,000 is a **lifetime** threshold. For older stores it resets every year. A merchant migrating from Magento today is opening a new Shopify store, so the free allowance is used once, not every year. The fee only applies to orders from regions where you have tax collection turned on. Put a number on it. A store doing \$1,000,000 a year in US sales, with an average order of \$80, pays about 0.35% of the amount above \$100,000. That is around \$3,150 a year, and the \$0.99 cap per order does not kick in at that order size. Compare that with your Avalara quote before deciding. ## Does Shopify file sales tax for you? Filing is what decides the question for most merchants. Shopify built an automated filing service on top of Shopify Tax. For stores enrolled in it, Shopify prepares and files the monthly, quarterly and annual US sales tax returns. It is closed to new stores. Shopify's help page on eligibility says automated filing is "closed to new enrollment" and only stores already enrolled can use it. On my test store there is no sign-up for it anywhere on the United States tax page. The only option in the Shopify Tax menu is **Downgrade service**. What you do get is the data to file from. Click **Access the data you need to file in each jurisdiction** under the Tax service box. ![The Access the data you need to file in each jurisdiction link under Shopify Tax](/images/blog/avalara-shopify-integration/03-access-data-to-file-link.png) That opens the **United States sales tax** report. It lists net sales, tax collected, shipping and tax on shipping, grouped by destination state. ![The United States sales tax report in Shopify, grouped by destination state](/images/blog/avalara-shopify-integration/04-united-states-sales-tax-report.png) You, your accountant or a filing app then files each state's return from those numbers. If you need a custom split of the same data, such as taxable and non-taxable sales, the [Shopify sales tax report guide](/blog/shopify-sales-tax-report) shows how to build it. ### Does Shopify collect and remit sales tax? Shopify **collects** sales tax at checkout once you turn on collection for a state. It does **not remit** it for a new store. Remitting means paying the collected tax to the state, and it happens when you file the return. The tax sits in your payouts until you pay it. The one exception is marketplaces that act as the seller for tax purposes, such as Amazon or TikTok Shop. Those platforms collect and remit on your behalf for orders placed there, and Shopify leaves those orders out of its own filing data. ## What the Avalara Shopify integration adds Avalara still has a place, and it is worth being exact about what it adds. Shopify lists Avalara as a tax app you can connect in place of its own tax calculation. From Shopify's Avalara help page: - Avalara is a paid service that needs a **direct contract between you and Avalara**. - Shopify charges **no extra fee** for connecting it. The cost is whatever Avalara quotes you. The things Avalara covers that Shopify Tax does not: - **SST filing.** SST is the Streamlined Sales Tax programme, a group of about 24 states that share one registration and offer free filing through certified providers. Shopify's feature page says Shopify Tax does not support SST filing. - **Local returns.** A few states, such as Colorado, Louisiana and Alabama, have cities or parishes that collect their own sales tax and want their own returns. Shopify Tax does not file those. - **Your existing setup.** If you already have product tax codes, exemption records and filing calendars in Avalara, keeping it avoids re-doing that work. If none of those apply, the Avalara contract pays for calculation Shopify Tax already does. ## The cheaper setup: Shopify Tax plus a filing app For most US merchants moving to Shopify today, the setup that meets both requirements is: 1. **Shopify Tax** for the calculation at checkout. It is already on. 2. **A sales tax filing app**, or an accountant, to file the returns in each state from Shopify's data. Sales tax apps on the Shopify App Store with a reasonable number of reviews: | App | Rating | Reviews | Price | | --- | --- | --- | --- | | Numeral Sales Tax | 4.4 | 100 | Free to install | | TaxCloud Sales Tax Automation | 4.8 | 95 | Free to install | | Kintsugi Sales Tax Automation | 4.7 | 25 | Free plan, then \$75/month | | TaxJar Sales Tax Automation | 2.4 | 64 | From \$39/month | "Free to install" means the app itself is free on the App Store. The filing service is priced by the provider, usually per return or per state. Ask each one for a quote based on the number of states you are registered in. Before you sign up, ask each app two questions: - Does it file from Shopify Tax's numbers, or does it replace Shopify Tax at checkout as well? - Does it file SST and local returns, if you need them? ## Avalara vs TaxJar This comparison comes up a lot for merchants already shopping for tax software. Both do the same two jobs: calculate tax at checkout and file returns. TaxJar is owned by Stripe and priced by monthly plan. Avalara is sold by contract and aimed at larger or more complex businesses, including those with exemption certificates and many product types. On Shopify, the comparison has a third option that did not exist on Magento. Shopify Tax already handles calculation, so you may only need the filing half from either company. Price the filing-only option before paying for both halves. ## How to decide Use this as a checklist: - **You only need accurate rates at checkout.** Use Shopify Tax. It is already on. - **You need automatic filing, and your store was enrolled in Shopify's filing before it closed.** Use Shopify Tax with its filing. - **You need automatic filing on a new store.** Use Shopify Tax plus a filing app or accountant. Compare quotes. - **You file SST or local returns, or have heavy exemption needs.** Keep Avalara and sign the direct contract. - **You are on Shopify Plus with several business entities.** Avalara supports multiple entities on Plus and Enterprise plans. Check that route with Avalara directly. ## Common questions after switching **Can I run Shopify Tax and Avalara at the same time?** Only one tax service calculates the rate at checkout. Connecting a tax app replaces Shopify's calculation for that region. **What happens to my Magento tax history?** It stays in Magento and in Avalara. Shopify's report only covers orders placed on Shopify. Keep the old records for any audit period. **Are imported orders included in Shopify's filing data?** Shopify's filing documentation says imported orders are not handled by its automated filing. Plan to file your pre-migration orders from the old system. **Do I need to register in each state myself?** Yes. Shopify tells you when you cross a threshold, but registering with the state is on you. The United States tax page has a **Register with each state** link and a **Collect in a new state** button for when you have your registration number. **Where do I see if my products are taxed correctly?** Under **Tax rate management** on the United States tax page. Assign a category to every product listed there, especially clothing, food and digital products. ## Summary Shopify Tax already does the rooftop-level calculation the merchant asked for, at 0.35% of each order after the first \$100,000 in sales. Shopify's own automatic filing is closed to new stores, so a new store needs a filing app or an accountant to file each state's return from Shopify's sales tax report. Pay for the Avalara Shopify integration when you need SST or local filing, or when your existing Avalara setup is too big to rebuild. --- --- title: "Be Yours Shopify Theme: Show From Price, Not a Price Range" description: "The Be Yours Shopify theme shows a price range like $45.00 - $125.50 on product cards. Two lines of code turn it into from $45.00. Tested on Be Yours 9.5.1." --- ## The problem You sell a product in several sizes or versions, and each one has its own price. On your collection pages the product card shows the whole spread, for example `$45.00 – $125.50`. You would rather show one clean starting price: `from $45.00`. A merchant asked exactly this on the Shopify Community. They run the Be Yours theme, version 9.5.1, and wanted every card with a price spread to show only the lowest price with the word "from" in front of it. I installed Be Yours 9.5.1 on a test store and reproduced it. A cake with three sizes at $46, $66 and $86 showed `$46.00 – $86.00` on the collection page. After the change below, the same card shows `from $46.00`. Products with a single price did not change. ![Before: the product card shows the price range $46.00 – $86.00](/images/blog/be-yours-shopify-theme-from-price/10-before.png) ![After: the same card shows from $46.00](/images/blog/be-yours-shopify-theme-from-price/11-after.png) ## Why Be Yours shows a price range Every product in Shopify has at least one variant. A variant is one buyable version of the product, such as the 6 inch cake or the 10 inch cake. Each variant has its own price. When a product's variants all cost the same, the card shows one price. When they differ, Be Yours prints two prices side by side on the card: the cheapest and the most expensive. Its stylesheet (the file that controls how the theme looks) then puts a dash in front of the second price. That is how `$46.00` and `$86.00` turn into `$46.00 – $86.00`. Be Yours does not offer a theme editor setting to switch this off, so the fix is a small edit to the theme's code. The upside is that both prices are already on the page. The fix does not need to work anything out. It hides the second price and writes "from" in front of the first one. ## Before you edit: make a backup Any code edit is safer with a copy of the theme to fall back on. It takes ten seconds. On the Themes page shown in step 1 below, click **...** next to your Be Yours theme and choose **Duplicate**. The copy appears in your theme library as an unpublished theme. If anything looks wrong later, you can publish the copy or compare the two. ## The fix: show "from" and the lowest price The whole change is two lines pasted at the end of one file. 1. Go to **Online Store > Themes**. 2. Click **...** next to your Be Yours theme. 3. Click **Edit code**. ![Online Store, the three-dot menu on the theme, and Edit code](/images/blog/be-yours-shopify-theme-from-price/01-themes-edit-code.png) 4. On the left, open the **assets** folder and click **component-price.css**. This file holds the styling for every price in the theme. 5. Go to the very end of the file and paste this on a new line: ```css .price price-money + price-money { display: none; } .price price-money:first-child:not(:only-of-type)::before { content: "from "; margin-inline-end: 0.4rem; } ``` ![component-price.css with the two lines pasted at the end](/images/blog/be-yours-shopify-theme-from-price/12-file-open.png) 6. Click **Save**. ![Save in the code editor](/images/blog/be-yours-shopify-theme-from-price/12-save.png) Open a collection page on your store and refresh it. Cards for products with a price spread now read `from $46.00`. Cards for products with one price look exactly as before. ### What the two lines do You do not need to understand the code to use it, but it helps when something looks off. - The first line hides the second price on the card, the most expensive one. The dash disappears with it, because the dash belongs to that second price. - The second line adds the word "from" in front of the first price, but only when a second price exists. A product with one price has nothing hidden and gets no "from". Nothing is deleted from the theme. Remove the two lines and save, and the range comes back. ## Change "from" to "From", "Starting at" or another language The word in quotes is plain text, so you can change it to anything. - **Capital F:** change `"from "` to `"From "`. - **Different wording:** `"Starting at "` or `"As low as "` work the same way. - **Another language:** use your own word, for example `"ab "` for German or `"à partir de "` for French. Keep the space before the closing quote. Without it, the word runs into the price. If your store is in several languages, the text in this code is the same for all of them. A multi-language store is better off with a short word that reads fine in each language, or with a translation app that handles theme text. ## Where the change shows up The price styling lives in one shared file, so the two lines apply wherever Be Yours prints a product card, not only on the collection page I tested: - Collection pages - Search results - Featured collection sections on the home page On the product page itself, Be Yours already shows the price of the selected size or version, not a range, so nothing changes there. ## What about sale prices? When some variants are on sale, Be Yours shows a crossed-out regular price next to the sale price. Be Yours prints the sale price spread the same way, as two prices, so the same two lines turn it into `from` and the lowest sale price. ## Is "from" the right choice for your store? A range tells shoppers the ceiling. A starting price tells them the floor. Both are fair, and it depends on what you sell. - **Starting price works well** when the cheapest option is a real, popular choice: the smallest size, the basic finish, a single unit. Shoppers see a lower number on the grid and click through. - **A range works better** when the cheapest option is rarely bought. If `from $45` turns into `$125` for most people once they choose, the jump can feel like a bait and switch. A quick check is your own sales data. If most orders for the product land on the cheapest variant, "from" describes what shoppers actually pay. ## About the Be Yours Shopify theme Be Yours is a paid theme from RoarTheme, sold in the Shopify Theme Store. It is built for beauty, fragrance and fashion brands, and it comes with quick buy, a slide-out cart and a quick view drawer on product cards. Like most Theme Store themes, it gets regular updates. The fix in this article was tested on version 9.5.1. Your theme's card on the Themes page (the screen in step 1 below) shows which version you run. Because Be Yours is a paid theme, the theme developer offers support to buyers. RoarTheme can make changes like this one for you if you would rather not edit code. The two lines here are small enough that most merchants can paste them in a couple of minutes. A few other common Be Yours changes follow the same pattern: find the file that styles the element, paste a short rule at the end, save. Price size, price colour and the sale badge all live in the theme's stylesheet files in the **assets** folder. ## Troubleshooting **Cannot find component-price.css?** Click in the file list on the left and type `component-price` in the search box at the top of the code editor. Very old versions of Be Yours may name it differently; search for `price` and open the CSS file with that word in its name. **Saved, but the storefront still shows a range?** Refresh the page with a hard reload (Ctrl+Shift+R on Windows, Cmd+Shift+R on Mac). Browsers keep a stored copy of theme files for a while. **Edited the wrong theme?** The code only changes the theme you edited. If your live theme is a different copy of Be Yours, repeat the steps on the live one. The theme marked **Current theme** at the top of the Themes page is the one shoppers see. **Updated Be Yours and the range came back?** A theme update installs fresh copies of the theme files, including this one. Paste the two lines again after updating. **Using a different theme?** The two lines are written for Be Yours. Other themes print the range in a different way, so the code will not match. Dawn and most free Shopify themes show "From $45.00" on cards already, which is worth checking before you edit anything. ## Apps that do this without code Some merchants would rather not touch code. Price display apps and variant option apps can change how prices appear on product cards. They add a monthly cost and another script to your store, so for a two-line change the code above is the lighter option. Ask a question on the thread linked below if you get stuck, or send it to your theme developer along with this page. Source thread: Change price in Be Yours theme on the Shopify Community. --- --- title: How to Change Font Size on Shopify for Mobile Only description: Your heading looks fine on a laptop and enormous on a phone. Here is the Custom CSS that shrinks it on mobile alone, and why the rule most people copy does nothing on newer Shopify themes. --- ## The problem Your store looks right on a laptop. You open it on your phone and one heading takes up most of the screen. A three line sentence becomes six lines, the button under it drops below the fold, and the page reads as one giant sentence instead of a shop. Shopify has no setting for this. Theme settings let you pick a heading size, but that size applies at every screen width. Turn it down far enough to look right on a phone and your desktop headings go weedy. So people reach for Custom CSS, which is the box Shopify gives you for pasting your own styling rules. Then they hit the second problem: the rule most tutorials print does nothing. ## The rule that does nothing A merchant on the Shopify Community was running the Dwell theme and pasted this: ```css @media only screen and (max-width: 768px) { .h2 { font-size: 22px !important; } } ``` Saved it. Reloaded. The heading did not move by a pixel. ![The h2 rule is saved in the Shopify Custom CSS box and the heading on mobile is still full size](/images/blog/change-font-size-shopify-mobile/01-h2-css-rule-saved-no-change.png) The usual answer on forums is that the dot is wrong. `.h2` with a dot points at a class, which is a label attached to an element, while `h2` without a dot points at the HTML tag. Drop the dot and it will work. On older themes that advice is right. On Shopify's newer themes it is wrong twice over, and following it wastes an afternoon. ## Why newer Shopify themes break the usual advice Shopify's newest themes, the Horizon family, separate how a heading looks from what it is in the page code. Dwell, Horizon, Fabric, Studio and the rest of that family all work this way. So does anything built on Shopify's 2024 and later theme structure. When you add a Heading block and set its style to H2, the theme does not output an `

` tag. It outputs something closer to this: ```html

Where quality craftsmanship meets timeless design

``` Two things follow from that, and both of them matter. **There is no `h2` tag to target.** A rule written as `h2 { font-size: 22px }` finds nothing on that part of the page, so dropping the dot changes nothing. **The size is set twice.** The theme's own stylesheet carries this: ```css h2, .h2.h2, .text-block.h2 > * { font-size: var(--font-h2--size); } ``` Read the third line. `.text-block.h2 > *` means "every direct child of a text block styled H2". That is the `

` holding your words. So when you write `.h2 { font-size: 22px !important }`, the size does change on the outer `

`. The paragraph inside then sets its own size from the theme's rule, and a child's own font size always beats the one it would have inherited from its parent. Your rule lands one level too high, and the text you can actually see never reads it. That is why nothing happens, and why `!important` does not rescue it. `!important` wins arguments between rules pointing at the same element. It does nothing about a different element further down. ## The fix Add the children to the rule. Two selectors, one extra character of typing: ```css @media screen and (max-width: 749px) { .h2, .h2 * { font-size: 22px !important; } } ``` `.h2 *` means "anything inside an element labelled h2". That catches the paragraph, and it catches a real heading tag if your text happens to contain one. On a test store running Dwell 4.1.5 this took the pull quote heading from 40px down to 22px on mobile and left the desktop layout exactly as it was. ## Where to paste it There are two Custom CSS boxes in the Shopify theme editor and they do different jobs. Picking the wrong one is the other reason this fix appears not to work. ### 1. Open the theme editor In your Shopify admin go to **Online Store > Themes** and click **Customize** on your current theme. ### 2. Click the gear icon The narrow strip down the top left of the editor has three icons. The middle one, the gear, opens **Theme settings**. These settings apply to your whole store rather than to one section of one page. ![The gear icon in the Shopify theme editor opens Theme settings](/images/blog/change-font-size-shopify-mobile/02-shopify-theme-settings-gear-icon.png) ### 3. Scroll to the bottom and open Custom CSS Theme settings is a long list: Logo and favicon, Color palette, Typography, and so on. **Custom CSS** is near the very bottom, under Variant pickers. Click it and a small code box opens. The wording under the heading tells you which box you are in. Under Theme settings it reads "Adds custom styles to your entire online store." The box inside an individual section reads "Adds custom styles to this section only", and that one will not touch headings anywhere else on your store. ### 4. Paste the rule Paste the code into the box. The preview on the right updates as you type, so you can see the heading shrink before you commit to anything. ![The Custom CSS box in Shopify Theme settings with the mobile font size rule pasted in](/images/blog/change-font-size-shopify-mobile/03-custom-css-box-paste-code.png) ### 5. Save Click **Save** at the top right. The change is live on that theme immediately. ![Click Save at the top right of the Shopify theme editor](/images/blog/change-font-size-shopify-mobile/04-click-save-theme-editor.png) ### 6. Check desktop Switch the preview back to desktop with the monitor icon in the top bar. Your headings should be exactly as they were. The rule sits inside `@media screen and (max-width: 749px)`, so it only runs on screens narrower than that. ![The desktop preview shows the Shopify heading still at the theme's full H2 size](/images/blog/change-font-size-shopify-mobile/05-desktop-heading-unchanged.png) ## Picking the right breakpoint A breakpoint is the screen width where a rule switches on. The number inside `max-width` is yours to choose, but matching your theme's own number keeps everything consistent. - **749px** is what the Horizon family uses, Dwell included. Below it the theme treats the screen as a phone. - **768px** is the common generic choice, and it is what most tutorials print. It works, it just includes small tablets held upright. - **989px** catches tablets in landscape too. Use it if your headings also look heavy on an iPad. If you are not sure, start with 749px. Resize your browser window slowly and watch where your theme's own layout flips from a phone layout to a desktop one. That is your number. ## Changing a different heading level The same pattern works for every heading size in the theme. Swap the number in the class: ```css @media screen and (max-width: 749px) { .h1, .h1 * { font-size: 30px !important; } .h2, .h2 * { font-size: 22px !important; } .h3, .h3 * { font-size: 18px !important; } } ``` Only add the lines you actually need. A store where every heading level has been overridden is harder to adjust later than one with a single rule in it. ## Changing heading size everywhere, without code If your headings are too big on desktop as well, you do not need CSS at all. Go to **Theme settings > Typography**. Each heading level has its own size control there. Turn Heading 2 down from 40px to, say, 32px and it changes at every screen width, with no code and nothing to maintain. ![Theme settings Typography panel in Shopify showing Heading 2 size set to 40px](/images/blog/change-font-size-shopify-mobile/06-theme-settings-typography-h2-size.png) This is worth checking first. On Dwell, Heading 2 is set to 40px and the theme prints that same 40px on a phone. Heading 1 is set to 72px but the theme shrinks it as the screen narrows. That difference is why H2 is the level that looks wrong on mobile while H1 looks fine. Use Typography when the size is wrong everywhere. Use the Custom CSS rule when desktop is right and only mobile is wrong. ## Does this work on Dawn and older themes? Yes, and on older themes you have more targets to choose from, not fewer. Dawn, Debut, Craft, Spotlight, Refresh and the rest of the Online Store 2.0 generation output real `

` tags for most headings. Dawn also carries `.h2` as a utility class for things that should look like a heading without being one. So on Dawn this covers both: ```css @media screen and (max-width: 749px) { h2, .h2, .h2 * { font-size: 22px !important; } } ``` Adding `h2` costs nothing on a Horizon-family theme, since there are few loose `h2` tags for it to find. Leaving it out on Dawn misses most of your headings. If you do not know which generation your theme is, use the three-selector version. One caution on newer themes. Because the tag and the visual style are decoupled, a block styled H1 can still contain an `

` tag inside it. A bare `h2 { }` rule will shrink that too, which is usually not what you wanted. That is the other reason to prefer the class. ## If it still has not changed Work down this list in order. In practice it is almost always the first or second item. **You pasted into a section's Custom CSS box, not Theme settings.** The section box only styles that one section on that one page. Read the line of help text above the box; it tells you which one you have. **You are editing a different theme.** The theme editor opens on whichever theme you clicked Customize on. If you have a draft copy and a live one, check the theme name in the top bar of the editor. **You are looking at a cached page.** Shopify and your phone both cache stylesheets. Load the page in a private window, or add `?x=1` to the end of the address to force a fresh copy. **Your browser window is wider than the breakpoint.** Shrinking a desktop browser window does trigger the rule, but only once it is narrower than 749px. Watch the heading as you drag the window edge in. **An app is drawing the heading.** Review widgets, page builders and popup apps render their own markup and their own classes, and `.h2` will not be in it. Right click the heading, choose Inspect, and look at the class names on the element. Whatever you see there is what the rule needs to name. **The text is inside a Rich text block, not a Heading block.** Rich text output is wrapped in `.rte` rather than a heading class. Target `.rte h2, .rte p` instead. ## Related fixes on this blog - [How to add custom CSS in Shopify](/blog/how-to-add-custom-css-in-shopify) walks through both Custom CSS boxes from scratch, with a worked example. - [Change your Shopify menu font size](/blog/change-shopify-menu-font-size) covers navigation text, including app-built mega menus. - [Change the price font size on a collection page](/blog/shopify-price-font-size) does the same job for product card prices. ## What to do - On Dwell, Horizon and the rest of Shopify's newest themes, a heading styled H2 is a `
` with a `

` inside, not an `

` tag. - The theme sets the size on that inner `

` as well, so a rule aimed at `.h2` alone is overridden. - Use `.h2, .h2 *` inside a `max-width` media query, in **Theme settings > Custom CSS**. - Use 749px for the Horizon family, 768px as a generic phone breakpoint. - If desktop is wrong too, change **Theme settings > Typography** instead and skip the code. --- --- title: "How to Change Menu Font Size in Shopify: Bigger and Bold" description: Make your Shopify menu text bigger or bold with a few lines of Custom CSS. Works for normal themes and for app-built mega menus like Meteor, including the selector mistake that stops most people. --- ## The problem You want your Shopify menu text to be bigger. Or bold. Or both. You look through the theme settings and nothing changes the menu. The typography setting changes your headings and body text, but the navigation menu stays the same small size. This is one of the most common small styling questions from store owners, and the answer is almost always the same: a few lines of Custom CSS. No app, no paid tool, no developer. A store owner asked exactly this on the Shopify Community. They ran the **Meteor Mega Menu** app and wanted the top menu larger and bold. Their theme's font settings did not touch it. Someone gave them a snippet of CSS that looked right, and it did nothing. I reproduced their setup, found why it failed, and gave them the version that worked. They confirmed it "worked a treat." This article covers both cases: a normal Shopify theme menu, and a menu that an app draws for you. The second one is where people get stuck, so I will go slow there. ## The short answer Shopify menu text is controlled by CSS, the language that decides how things look on a web page. You do not need to touch your theme's real code files. Every Shopify theme has a **Custom CSS** box built for exactly this. You paste a few lines in, hit Save, and the change is live. Here is the shape of what you are pasting. The details depend on your theme, and I will give you the exact version for both cases below. ```css your-menu-links { font-size: 18px; font-weight: 700; } ``` `font-size: 18px` makes the text bigger. `font-weight: 700` makes it bold. That is the whole idea. The only hard part is naming the menu links correctly, and there is one catch that trips most people up. First, where the CSS goes. ## Where to paste it (2 steps) The Custom CSS box is in the same place for every theme. **Step 1.** Go to **Online Store > Themes**. On your live theme, click **Customize**. Newer stores show this button as **Edit theme**. ![Shopify Themes page, the Edit theme button on your live theme](/images/blog/change-shopify-menu-font-size/03-themes-edit-theme.png) **Step 2.** In the editor, click the **gear icon (Theme settings)** on the left. Scroll down and open **Custom CSS**. Paste your code in the box, then click **Save** at the top right. ![Theme settings panel open on Custom CSS, with code pasted and the Save button](/images/blog/change-shopify-menu-font-size/04-custom-css-box.png) That box adds your styles to the whole store, safely. You are editing a settings field, not the theme's code, so you cannot break anything. If you ever want to undo it, come back and delete the lines. ## Case 1: a normal theme menu (Dawn and most free themes) If your menu is the built-in theme menu, the theme draws it and you target the theme's own menu links. On Dawn, the free theme most stores start with, the top menu links use the class name `header__menu-item`. So the CSS is: ```css .header__menu-item { font-size: 18px; font-weight: 700; } ``` Paste that into Custom CSS and the menu gets bigger and bold. Before you even do that, check one thing. Some themes have a menu size option built into the header. Open the theme editor, click the **Header** section, and look for a font size or menu style setting. If it is there, use it, and skip the code entirely. Custom CSS is the fallback for when the theme gives you no setting, which is most of the time. ## Case 2: a menu built by an app (Meteor Mega Menu and similar) This is the case the store owner had, and it is where the usual advice falls apart. When a menu is built by an app, the app draws its own menu with its own HTML and its own class names. Your theme is not drawing that menu at all. So your theme's font settings never reach it, and neither do the normal theme selectors from Case 1. You have to target the app's own class names. For **Meteor Mega Menu**, the class names are `Meteor-Navigation__Link__desktop` for the top bar and `Meteor-Navigation__Link__mobile` for the mobile drawer. The CSS that works is: ```css .Meteor-Navigation__Link__desktop, .Meteor-Navigation__Link__mobile { font-size: 18px !important; font-weight: 700 !important; } ``` Here is that store's menu before and after the change. The links go from small and light to bigger and bold, on the live storefront. ![Meteor menu before, text small and thin](/images/blog/change-shopify-menu-font-size/01-shopify-menu-before.png) ![Meteor menu after, text bigger and bold](/images/blog/change-shopify-menu-font-size/02-shopify-menu-after.png) On the real store the desktop links went from 16px and normal weight to 18px and bold. The mobile menu changed too, because the CSS targets both classes. ### Why the "clever" selector fails The store owner was first given a catch-all selector, something like `[class*='meteor'] a`. The idea is to match any class name that contains the word meteor, then style the links inside it. It looks smart, and it saves you from finding the exact name. On this store it changed nothing. I tested both selectors on the live store to be certain. The catch-all did nothing at all. The exact-class version worked instantly. Two reasons, and both are worth knowing for any app menu: 1. **Class matching is case-sensitive.** The app's class is `Meteor` with a capital M. A selector that writes `meteor` in lowercase never matches it. A single wrong letter and the whole rule is ignored. 2. **The top links were not inside a matching container.** The "links inside it" part had nothing to find, so nothing got styled. The lesson is simple. For an app menu, do not guess a wildcard. Use the exact class name. If you do not know it, right-click a menu item, choose **Inspect**, and read the real class name on the link. Then put that in your CSS. ### Why the `!important` matters You will notice the app version has `!important` after each value, and the Dawn version does not. The app ships its own stylesheet that already sets a font size on those links. To make sure your rule wins over the app's rule, you add `!important`. Without it, your line and the app's line can carry equal weight, and the app can win depending on which stylesheet loads last. `!important` removes the guessing and makes your change stick. For a plain theme menu you usually do not need it, but adding it does no harm if a stubborn menu refuses to change. ## Make it bigger, smaller, or less heavy Once the rule is in, tuning it is easy. You are only changing two numbers. - **Size:** change `18px`. Try anywhere from 16px to 22px. Go up slowly and check the menu does not wrap onto two lines on a laptop screen. - **Weight:** `700` is bold. `600` is semi-bold, a softer look. `500` is just a touch heavier than normal. `400` is normal. Want it bigger on desktop only, and left alone on phones? Wrap the desktop rule in a screen-size check: ```css @media (min-width: 990px) { .Meteor-Navigation__Link__desktop { font-size: 20px !important; } } ``` That rule only applies on screens 990px wide and up, which is roughly laptops and desktops. ## Change the font, color, or spacing too The same rule holds more than size and weight. Add whatever you want to change: ```css .Meteor-Navigation__Link__desktop, .Meteor-Navigation__Link__mobile { font-size: 18px !important; font-weight: 700 !important; letter-spacing: 0.5px !important; text-transform: uppercase !important; } ``` - **Font family:** add `font-family: 'Georgia', serif !important;` to use a different font. Stick to fonts your theme already loads, or the browser falls back to a default. - **Color:** add `color: #ffffff !important;` and use your own hex color. Handy when a bigger, bolder menu needs a different shade to stay readable over your header background. - **Spacing:** `letter-spacing` spreads the letters out. Small values like 0.5px to 1px look intentional. Large values look broken. Change one thing at a time and Save between each, so you can see what each line does. ## Mobile and desktop are often separate This surprises people. Many menus, Meteor included, build a **separate** set of links for mobile. That is why the working CSS above lists two class names, one for desktop and one for the drawer. If you only style the desktop class, your phone menu stays small. On a normal theme menu the mobile version usually uses a different element as well. So after any menu change, open your store on your phone, or shrink the browser window narrow, and check the small-screen menu too. ## What to check if nothing changes If you pasted the CSS and the menu looks the same, run down this list. One of these is almost always the reason. - **You forgot `!important` on an app menu.** App menus need it. Add it after each value. - **Wrong class name.** Inspect a real menu link and copy the exact class. Watch the capital letters. - **You edited a draft theme, not your live one.** Make sure the theme you edited is the one that is published. - **Browser cache.** Your change is live but your browser is showing an old copy. Do a hard refresh, or check in a private window. - **The size sits on a child element.** Rare, but if the link wraps the text in another tag with its own size, target that inner element instead. ## Do you need an app or a developer for this? No For changing menu font size, you do not need either. The Custom CSS box and a few lines cover it completely, and you can undo it any time by deleting the lines. It is worth being clear about what the menu app is actually for, though, because the answer is not "styling." A mega menu app handles the mobile drawer, the dropdown behavior, keyboard access, and staying intact when you update or switch your theme. That maintenance is the product. The look is a thin layer on top, and that layer is yours to adjust with CSS whenever you like. So keep the app if you use its menu. Just remember that the font size, weight, color, and font are a five-line CSS change you own, not something you need to pay for or wait on. ## Quick recap - Menu font size is a Custom CSS change, found under **Theme settings > Custom CSS**. - A normal theme menu: target the theme's link class, like `.header__menu-item` on Dawn. - An app menu (Meteor): target the app's exact class, `.Meteor-Navigation__Link__desktop` and `.Meteor-Navigation__Link__mobile`, and add `!important`. - Avoid wildcard selectors like `[class*='meteor']`. They are case-sensitive and miss. - Change `18px` for size and `700` for weight, and always check the menu on a phone. --- --- title: "Custom Liquid Shopify: Hide the Header on One Page" --- ## The problem custom liquid actually solves A merchant posted this on the Shopify Community. They run the Taste theme, they built a separate template for one page, and they wanted that page to show without the site header. They did the obvious thing. They opened the theme editor, found the header section, and switched it off. It disappeared from every page on the store. That reaction is not a bug and it is not something you configure your way out of. It is how Shopify structures a theme, and once you see the structure the fix is one small block of CSS in a Custom Liquid section. I reproduced the whole thing on a Taste 15.5.0 store. Here is what is going on and what to paste. ## What is custom liquid in Shopify Custom Liquid is a section you can drop into a template to inject your own code. It accepts HTML, CSS, Liquid, and script tags, and it renders exactly where you place it in the template. It exists because themes cannot anticipate everything. Rather than force you to edit theme files for every small change, Shopify gives you a slot in the theme editor where your own markup goes. Two things make it more useful than it first appears. It is a **section**, so it obeys the same scoping rules as every other section. Put it in a template and it only exists in that template. It renders **inline**, so a ` ``` That is the whole fix. Because the ` ``` It looks right. It does nothing. I checked on Taste 15.5.0. `document.querySelectorAll('#shopify-section-header')` returns **zero elements**. Same for the announcement bar. Sections rendered through a section group do not get that ID. They get a generated one that includes the group's internal numeric ID: ``` shopify-section-sections--20216712724657__header ``` That number is unique to the store. It changes when the theme is duplicated, and it changes again when the theme updates. There is no value you can hardcode and rely on. The class is the stable handle. Shopify derives `shopify-section-group-header-group` from the group's filename, so it is the same on every store running any Online Store 2.0 theme, and it survives updates. It also covers both sections at once. The announcement bar and the header are both in that group, so one rule handles both. ## Hiding only part of the header group If you want the header gone but the announcement bar kept, add the header section's own class: ```liquid ``` For a true landing page with no chrome at all, hide the footer group too: ```liquid ``` One caveat on the header-only variant: `.section-header` is the class Dawn-family themes put on the header section. Most free Shopify themes are Dawn-family, so it works on Taste, Dawn, Refresh, Sense, Craft, Studio, and Origin. On a heavily customized paid theme, inspect the header element and use whatever class it actually carries. ## How to add a custom liquid block in Shopify The navigation is where people get lost, because the Add section button appears three times on the page, once per group. Go to **Online Store > Themes > Customize**, then pick the template you want from the template dropdown in the top bar. This is the step that gets skipped. If you leave it on the default, you will edit the wrong template and see no effect. ![Pick your template, then Add section in the Template group](/images/blog/custom-liquid-shopify-hide-header/03-theme-editor-navigation.jpeg) Then click **Add section** in the **Template** group, and search for `custom`. ![Add section in the Template group](/images/blog/custom-liquid-shopify-hide-header/04-add-custom-liquid-section.png) Paste the CSS into the **Liquid code** box and save. ![Paste the CSS into the Liquid code box](/images/blog/custom-liquid-shopify-hide-header/05-paste-css-liquid-code.jpeg) Position in the template does not matter for CSS. A ` ``` That is the whole thing. Save the section, then open your storefront preview and click the hamburger. You should see the Shop tab open by default. ## The result Tapping Explore swaps to the second panel, and the drawer stays open the whole time. The signup and the footer links stay pinned at the bottom on both tabs. That switch-without-closing behaviour is the part the merchant wanted, and it is the part a plain menu cannot do. ![The same Horizon drawer with the Explore tab active, showing the second set of links while the signup and footer stay in place](/images/blog/customize-shopify-horizon-theme-menu/04-horizon-drawer-explore-tab.png) I tested this on a Horizon store on both desktop and mobile. The Shop tab shows by default, the Explore tab swaps panels without closing the drawer, and the signup and footer stay at the bottom. ## How to edit the menu in Horizon later This is the main reason to use menus rather than hardcoded links. Once the section is in, you never touch the code again to change a link. - To add, remove, or rename a link in either tab, go to Settings, then Navigation, and edit the Shop Menu or Explore Menu. - To change the footer links, edit whichever menu the `footer_handle` points at. - The change shows up in the drawer straight away. That is also the plain answer to "how do I edit the menu in the Horizon theme?" for anyone who just wants to change links. Your menus live in Settings, then Navigation, and the theme reads them. You rarely need to touch theme code for menu changes at all. ## Can I add a mega menu or drop-down in Horizon instead? Yes, and it depends on what you mean. A drop-down, where a parent link reveals child links, is native. In Settings, then Navigation, drag a link underneath another link to nest it. Horizon renders nested links as an expandable submenu with no code. A mega menu, the big multi-column panel with images, is a bigger job. Horizon's header block has some of this built in on desktop. For a full custom mega menu, you are either extending the theme or using an app. The tabbed drawer in this guide is a different pattern, aimed at the slide-out menu rather than a desktop hover panel. ## Can I put a newsletter signup in the menu? The code above already does. It uses Shopify's own customer form, so a signup creates the customer and turns on their email marketing consent. No app needed to capture the email. If you use Klaviyo or another email tool, you can swap their embed code in place of that signup block later. The tabs and the rest of the drawer are not affected, because the signup is just one part of the section. ## What to check if it did not work If you saved the section and the drawer still looks plain, run through these. - **Handles do not match.** The most common cause. The handle in the code has to match the menu handle exactly. Check Settings, then Navigation, and confirm your menu handles are `shop-menu` and `explore-menu`, or edit the handles at the top of the code to match. - **You added it to the wrong place.** The section must load site-wide. The Footer group is the safe spot. If you added it inside a single template, it will only load on that page. - **You did not Save.** The theme editor needs an explicit Save. If the button stayed greyed out, click into the box, add a space, delete it, then Save. - **Browser cache.** You saved, but your phone still shows the old drawer. Reload, or check in a private window. ## Custom Liquid vs editing theme code People often ask whether they should just edit Horizon's files instead. For this, Custom Liquid is the better tool. Editing theme code means opening the code editor and changing the drawer snippet and the header block. It works, but a theme update can overwrite those files, and a typo can break the header on every page. The Custom Liquid section is self-contained. It cannot be overwritten by a Horizon update, and if you ever want it gone, you delete the one section. Reach for theme code only when you need something Custom Liquid genuinely cannot express. For a tabbed drawer, it can. ## The no-code alternative If you would rather not paste any code, a menu or drawer app can build a tabbed navigation visually. Meteor Mega Menu, qikify Smart Menu, and Buddha Mega Menu are all popular for this. They cost more over time than a free section, but they give you a visual editor and support. For a store that wants exactly the Shop and Explore drawer, though, the two menus plus one section is hard to beat. It is free, it is fast, and everything after setup is editable from your admin. ## The short version - Horizon's drawer shows one plain menu and has no built-in tabs or signup. - Create two menus, Shop Menu and Explore Menu, in Settings, then Navigation. - Add one Custom Liquid section in the Footer group and paste the code, matching the three handles to your menus. - The section injects the tabs, signup, and footer into your existing drawer, on desktop and mobile. - Tabs switch panels without closing the drawer, and every link stays editable from your admin with no code. That is how to customize the Shopify Horizon theme menu into a proper tabbed drawer, without touching a single theme file. --- --- title: How to Customize the Shopify Inbox Chat Button description: What you can change on the Shopify Inbox chat widget today, what you cannot, and the free code and app workarounds for a custom button text, icon, and greeting. --- ## The problem A merchant asked about this on the Shopify Community. They wanted more control over the Shopify Inbox chat widget than the app seems to allow. Their list was clear: - A rich-text greeting message, not a plain box. - Their own text on the chat button, instead of picking from a fixed list. - A custom icon they could upload. - A name for the AI agent, so it feels personal. These are fair requests. If you have opened the Inbox settings and felt boxed in, you are not missing a hidden toggle. Some of this is simply not built yet. I installed Shopify Inbox on a test store and went through every chat setting it has. This post shows what you can change today, what you cannot, and the workarounds for the two that matter most: the button text and the button icon. Shopify Inbox is Shopify's free chat app. It puts a chat button on your storefront so shoppers can message you or ask its AI assistant a question. The button, the greeting, and the colors are all set in one small settings panel. ## What Shopify Inbox lets you change today Open the Inbox app in your admin. Click Edit chat settings. That opens the theme editor on the App embeds panel, under Online store chat. Everything you can change lives in that one panel. Here is the honest list. - **Greeting message.** A single plain-text box. - **Colors.** Background and font color for the chat window. - **Icon.** A dropdown of preset icons. - **Label.** A dropdown of preset button labels. - **Position.** Left, center, or right, and three height options. ![The Shopify Inbox Greeting Message is a single plain-text field|600x388](/images/blog/customize-shopify-inbox-chat-button/01-greeting-plain-text.png) That is the whole panel. No free-text label, no icon upload, no rich text, no agent name. Below I go request by request. ## How to change the Shopify Inbox chat button text You cannot type your own text on the button in the settings. The Label field is a dropdown with a fixed set of choices: Chat, Ask anything, Assistance, Contact, Help, Support, Live chat, Message us, Need help?, and No text. ![The chat button Label is a fixed preset list, not free text|600x348](/images/blog/customize-shopify-inbox-chat-button/02-chat-button-label-presets.png) If one of those fits, pick it and save. If you want wording that is not on the list, you have two routes. The free route uses a little code. You hide Shopify's own button, then add your own button with any text you like, and have it open the chat. I show the exact steps further down. The no-code route is an add-on app. More on that below too. So the short answer to "how do I change my Shopify chat button text": inside Inbox you can only pick a preset. For truly custom words, you replace the button. ## How to use a custom chat button icon Same story as the text. The Icon field is a dropdown, not an upload. Your choices are Chat bubble, Email, Question mark, Smiley face, Team, Hand wave, and No icon. ![The chat button Icon is six presets with no upload option|600x243](/images/blog/customize-shopify-inbox-chat-button/03-chat-button-icon-presets.png) There is no way to upload your own logo or SVG in the Inbox settings. To show a custom icon, you use the same trick as the text: hide the default button and build your own, with your own image on it. ## Can you use a rich-text greeting message? Not today. The Greeting Message is one plain-text field, as the first screenshot shows. You can write the words you want. You cannot bold part of it, add a heading, add a link, or split it into styled blocks. There is no rich-text editor, and there is no reliable workaround. Anything that hacks formatting into that box tends to break the next time Shopify updates the app. If your goal was to separate information for shoppers, the closest built-in tool is Instant answers inside Inbox. That lets you set up common questions and canned replies. It is not rich text in the greeting, but it does help you present information in a tidy way. ## Can you name the Shopify Inbox AI agent? Not today. Inbox does not give the assistant a name field. You can turn the agent on or off, and you can set its tone and rules so replies sound like your brand. But you cannot label it "Ava" or "Sam" in the chat header. That is a genuine gap, not a setting you missed. ## How to change the chat button color and position Two things you asked less about are fully supported, so it is worth naming them. **Color.** The settings panel has a Background and a Font color for the chat window. There is also an Invert activator colors switch for the button itself. So the chat button color is adjustable, even though the icon and text are not. **Position.** You can set the button to the left, center, or right, and to one of three heights. That is how you move it off a menu or a cookie bar. So if your real question was how to change the Shopify chat button color or move it, that part is easy and native. Set it in the same panel and save. ## The free way to get a custom button text and icon This is the route when you want your own words and your own image, without paying for an app. The idea is simple. You hide Shopify's own chat button. You add your own button anywhere on the page. When someone clicks it, it opens the real Inbox chat. One code block does all three. Here is the button you start with. This is the default Shopify Inbox chat button. ![The default Shopify Inbox chat button on a test store|1280x704](/images/blog/customize-shopify-inbox-chat-button/04-default-chat-button.png) **Where to paste it.** The chat button is added by an app, so it does not live in your theme files. To replace it on every page, put the code in your layout, not on a single page. Go to Online Store, then Themes, then the three dots, then Edit code. Open `layout/theme.liquid` and paste the block just before the closing `` tag. A Custom Liquid section works too, but it only appears on the one page you add it to, so `theme.liquid` is the right place for a button that follows the whole store. ![Where to paste the code: layout/theme.liquid in the theme code editor|2600x1410](/images/blog/customize-shopify-inbox-chat-button/07-where-theme-liquid.png) Then change the text and the icon to your own. Upload a light-colored icon under Settings, Files and paste its URL in place of `YOUR-ICON-URL`. ```html ``` Save, then open your store. The default button is gone, and your own button shows in its place. ![The default chat button replaced by a custom Message our team button|1280x752](/images/blog/customize-shopify-inbox-chat-button/08-default-replaced.png) Click it, and the real Shopify Inbox chat opens. ![Clicking the custom button opens the real Inbox chat|1280x704](/images/blog/customize-shopify-inbox-chat-button/06-custom-button-opens-chat.png) I tested this on a Dawn store with Shopify Inbox turned on. The default Chat button stayed hidden, my own purple button took its place, and clicking it opened the real chat. It also stayed hidden after opening and closing the chat, which is the part a simpler script gets wrong. A quick note on how it works, so you can trust it. The Inbox button lives inside a `` element, and once the chat's agent loads, its real button (class `activator`) sits in a shadow DOM nested a couple of layers deep. The script walks every shadow root to find it, hides it, and forwards your click to it. It also re-checks a few times a second, because the widget rebuilds that button each time the chat opens and closes. That is why plain CSS like `#shopify-chat{display:none}` does not work, and why a one-time script lets the default button creep back after the first use. The trade-off is real. This is a small custom build, and you are responsible for keeping it working after theme or app updates. If Shopify changes the widget's internals, the script may need a tweak. If you are comfortable pasting code, it costs nothing. If you are not, read the next section. ## The no-code alternative: an add-on app If you do not want to touch code, an add-on app can give the Inbox button a custom icon, your own label text, and a custom font. One example is Spark Tools for Inbox, which is a paid add-on at around \$5 a month. An app like that sits on top of Inbox. You do not rebuild anything. You install it, set your icon and text, and it restyles the existing chat button. Weigh it against the free route. The app is faster and needs no code, but it is a monthly fee and a new app on your store. The code route is free but is yours to maintain. Both reach the same result for the button text and icon. Neither an app nor code can add a rich-text greeting or name the AI agent. Those still live inside Shopify Inbox, which does not expose them. ## How to send this as a feature request to Shopify For the two gaps that only Shopify can fix, the rich-text greeting and the named AI agent, the best move is to ask for them properly. - Use the feedback link inside the Shopify Inbox app. That goes to the team that builds Inbox. - Post the request on the Shopify Community and keep the thread active. Other merchants can add their voice. Features like these get built on demand. The more merchants who ask for the same thing, the more likely it moves up the list. A single request is easy to miss. Fifty requests for the same feature is a signal. ## If the chat button is not showing at all A quick detour, since it is a common follow-up. If your chat button is missing after setup, check these. - **The app embed is off.** The chat button is an app embed on your theme. Open the theme editor, go to App embeds, and make sure Online store chat is turned on for the theme you publish. - **You edited a different theme.** Settings on an unpublished theme do not affect your live store. Confirm you are editing the live theme. - **Business hours.** If you set the chat to only show during staff hours, it can hide outside those hours depending on your setup. - **Cache.** Old styles linger. Refresh hard, or open the store in a private window. ## Definitions people mix up A few terms get tangled here. The plain version. **Shopify Inbox versus the chat widget.** Inbox is the app and the inbox where you read messages. The chat widget is the button and window shoppers see on your storefront. Same product, two parts. **The greeting versus Instant answers.** The greeting is the one line that shows when the chat opens. Instant answers are preset questions and canned replies. Different features, both inside Inbox. **The Label versus custom text.** The Label is the preset word on the button, chosen from a dropdown. Custom text means wording that is not on that list, which needs the code or app route. **The icon preset versus a custom icon.** The icon dropdown offers a handful of built-in shapes. A custom icon is your own uploaded image, which the settings do not support. **App embed versus theme code.** An app embed is a toggle that lets an app add itself to your theme, like the chat button. Theme code is the actual Liquid and CSS files. Turning the chat on or off is an embed toggle. The free custom-button route touches a bit of code. That is the full picture. On the Shopify Inbox chat button you can change the color, the position, and pick a preset icon and label. For your own text or your own icon, you replace the button with code or an app. And for a rich-text greeting or a named AI agent, the honest answer today is to file the request and rally other merchants behind it. --- --- title: "Shopify New Customer Accounts: Customizing the Login Page" description: "Can you redesign the Shopify customer login page on Horizon or any modern theme? Here is what you can actually change in 2026, why the old fully custom login is gone, and the real options left." --- ## The problem A merchant asked this on the Shopify Community, and it is a fair question with a frustrating answer. It comes down to Shopify's new customer accounts, and what they let you change. They run the Horizon theme. Their login page is Shopify's standard sign-in screen, a "Continue with Shop" button and an email field. They wanted to replace it with a fully custom design: a photo on the left, and email plus password boxes with their own buttons on the right. So the question was simple. Can you change the Shopify login page to a custom design like that? They also asked a good follow-up: would switching to a different free theme let them do it? I dug into this on a test store. The short answer is that the exact custom design is not possible on Horizon, or on any current theme, and the reason is a platform change most guides have not caught up with. But there is a real set of things you can change, so let me walk through both. ## Why you cannot edit the login page like you used to This is the key shift, so it is worth being precise. Shopify has two generations of customer accounts. The **old, classic** accounts rendered the login page from inside your theme. There was a login template in the theme files, and you could rebuild it: add a side image, add email and password fields, restyle everything with Liquid and CSS. The custom design the merchant wanted is exactly that old style of login. The **new** customer accounts are different. The login page is hosted by Shopify, not by your theme. Your theme does not contain a login template at all. There is nothing in the theme code to edit, because the page is not served from the theme. Horizon is a new theme, so it uses new customer accounts. I checked its files: there is no customer login template anywhere in it. That is by design. And classic accounts are on the way out. Shopify deprecated the classic customer accounts in early 2026. Stores that are not already using them can no longer switch to them. So the theme-editable login that the merchant's target design relies on is simply not available to turn on. ## The new login has no password field There is a second reason the target design cannot be recreated, separate from the layout. New customer accounts do not use email and password at all. Customers sign in with a one-time code sent to their email, or through Shop, Google, or Facebook. There is no password box to add, because passwords are not part of the new sign-in. So even setting aside the custom layout, the email-and-password form in the merchant's mockup is not something the new login supports. ## What you CAN change on the login page Now the useful part. The Shopify-hosted login is not frozen. You can brand it, and the controls live in your admin, not in theme code. - Go to **Settings > Customer accounts**. - Next to **Configurations**, click **Customize**. ![Settings, Customer accounts, then click Customize](/images/blog/customize-shopify-login-page/01-customer-accounts-customize.png) This opens the branding editor that is shared by checkout and customer accounts. Open the **Settings** tab, the gear icon on the left, and you can set: - your **logo** and its alignment - **background, accent, and button colors** - **fonts** for headings and body text ![The branding editor showing logo, color palette, and font controls](/images/blog/customize-shopify-login-page/02-branding-editor.png) Click **Save**, and these apply to the login screen and the account pages. The editor even labels these as applying to "checkout and customer accounts", so you can see the scope while you edit. That is the full extent of the built-in styling: logo, colors, and fonts. There is no layout change, and no option for a side image. You cannot turn the single-column Shopify login into the two-column, image-plus-form design from the mockup. ## Does switching to another free theme help? The merchant asked this directly, so it deserves a clear answer. No. The login page limitation is not a Horizon problem. It comes from customer accounts, which is a store-level setting, not a theme feature. Every current theme on a store using new customer accounts gets the same Shopify-hosted login. Dawn, Spotlight, Refresh, Horizon: same login page, same branding-only controls. Changing themes changes your storefront. It does not give you back a theme-editable login, because no current theme ships one. ## If you truly need a fully custom login If the branded Shopify login is genuinely not enough, and you need the side image and your own form layout, there are two real routes. Both are bigger commitments. - A **customer login or account app** from the Shopify App Store. Some apps add their own account and login experiences that sit alongside or in front of the default. This is the lighter option, though it depends on the app. - A **custom, headless build**. Here you build your own storefront and your own login flow against Shopify's APIs. This gives full design control, but it is a full development project, not a settings change. Neither is achievable with theme code alone on a current theme, which is the honest bottom line. ## How to preview your branded login page Change branding, then look at the real thing before you decide it is not enough. Your customer account area has its own URL. In **Settings > Customer accounts**, there is a URL field near the bottom that points at your account and login pages. Open that link in a private browser window, where you are not already signed in, and you will see the login screen exactly as a customer does. Do this after you set your logo, colors, and fonts. It is the honest test of how far the branding gets you. For a lot of stores, a clean logo and matching brand colors on the login screen is genuinely enough, even though it is not the fully custom layout the merchant originally pictured. If you decide it is not enough after seeing it live, that is the point to weigh an app or a headless build, not before. ## Should you force customers to log in? A related setting confuses people, so it is worth clearing up. Separate from styling the login page, you can decide whether accounts are optional or required. In the checkout and accounts configuration, there is an option to require customers to sign in before checkout. Turning it on sends every shopper through the login screen, so the branding you set there matters more. Most stores leave login optional, so guests can check out without an account. If you run a wholesale or members-only store, requiring login makes sense. Either way, the styling options are the same. Requiring login just means more customers see the page you branded. ## Classic vs new customer accounts Since the two get confused constantly, here is the plain distinction. **Classic customer accounts** were theme-rendered. Email and password login, a login template in your theme, fully customizable with Liquid and CSS. Deprecated in early 2026 and not available to switch on for stores that were not already using them. **New customer accounts** are Shopify-hosted. Passwordless sign-in by email code, or Shop, Google, and social login. Not editable in theme code. Branding only, through Settings > Customer accounts. If your store is new, or on a new theme like Horizon, you are on the new system. That is the reality the design decision has to work within. ## Common questions **Can I add my own CSS to the login page?** Not in the way you could with the classic theme login. The page is hosted by Shopify. You style it through the branding controls, not with custom CSS in your theme. **Can I at least put my logo and brand colors on it?** Yes. That is exactly what Settings > Customer accounts > Configurations > Customize covers. Logo, colors, and fonts carry across the login and account pages. **Can I remove the "Continue with Shop" button?** The Shop sign-in option is managed under Settings > Customer accounts > Authentication, along with Google and Facebook. You control which sign-in options appear there, rather than editing them out with theme code. **Why does the login ask for an email code instead of a password?** That is the new customer accounts flow. Instead of a password, Shopify emails a one-time code to verify the customer. It removes password resets and locked-out-customer support tickets, which is a large part of why Shopify moved to it. It is not something you switch off per theme. **Will Shopify bring back the custom login?** The direction is the opposite. Shopify is consolidating on the hosted new customer accounts and retiring the classic, theme-editable version. Plan around the hosted login, not against it. I tested all of this on a Horizon store. The login is served by Shopify, the only built-in styling is logo, colors, and fonts, and there is no layout or side-image option in the theme. The branding controls above are the real, supported way to make the login page look like yours. --- --- title: "How to Customize a Shopify POS Receipt (Visual Editor)" description: "Shopify's new POS receipt visual editor moved things around. How to move the order code to the bottom, what you can change, and what is locked." date: "2026-08-12" --- ## Shopify changed my POS receipts, how do I change them back A merchant asked this on the Shopify Community. Shopify had swapped their printed POS receipts to a new visual editor overnight, and the layout changed on them. They wanted two things: move the QR code (their order code) to the bottom of the receipt, and add separator lines between the line items. They do not write code and wanted plain directions. This is the new **Printed receipts visual editor** for Shopify POS. It is a block-based editor, and it rolled out to a lot of stores at once. One of the two changes is doable with no code. The other one is not, and it is better to know that up front than to hunt for a setting that does not exist. I rebuilt this on a POS Pro test store and worked through both. Here is exactly what you can and cannot do. ## Where the POS receipt editor is First, so you are in the right place: 1. From your Shopify admin, open the **Point of Sale** channel in the left sidebar. 2. Go to **Settings**. 3. Under Customization, click **Printed receipts**. 4. Click **Customize your receipts**. That opens the visual editor. On the left is a block tree: a **Header** section, a **Content** section, and a **Footer** section. The receipt preview is on the right. The Header holds blocks like your logo, location details, and the **Order code**. The Footer holds customer information, a **QR code** block, a return policy, and more. The Content section in the middle is your list of items. ## Move the order code to the bottom This is the doable one, and it is no code. The "QR code" people mean is usually the **Order code** block, and by default it sits in the Header, at the top. The visual editor only reorders blocks inside a section, so you cannot drag the Order code from the Header down into the Footer. That is the wall people hit. The way around it is to hide it up top and re-add it at the bottom. 1. In the left panel, open the **Header** section. 2. Click the **Order code** block, then click the **eye icon** next to it to hide it. It stops printing at the top. 3. Open the **Footer** section and click **Add block**, then choose **Custom Liquid**. 4. Paste this into the block: `Order number: {{ order.name }}` 5. Click **Save**. The order number now prints at the bottom. ![Hide the order code in the Header, then add it to the Footer](/images/blog/customize-shopify-pos-receipt/01-move-order-code-visual-editor.png) A Custom Liquid block is a small box where you can type text and Shopify variables. `{{ order.name }}` is the variable for the order number, so it prints the real number for each sale. One thing to know so the result does not surprise you: - The built-in Order code prints the **register receipt number**, which is prefixed by the register (something like #1-1288). - `{{ order.name }}` prints the **plain order number** (like #1425). For most shops the plain order number at the bottom is exactly what they want. If you specifically need that exact register-prefixed number moved to the bottom, that precise format is not available without code. ## Separator lines between items: the honest answer This one is not possible in the visual editor. The item list is the **Content** section, and Shopify locks it. Unlike the Header and Footer, it has no chevron to expand, no eye icon, and no **Add block** button. You cannot add a divider, a line, or any custom element between the line items. So there is no toggle to find. If your goal was lines between products on the printed receipt, the visual editor cannot do it today. It is better to hear that than to keep looking. ## What about the code editor There is a code editor for printed receipts, and it is more capable. On POS Pro it lives behind an **Edit code** link in the receipts editor, and it supports HTML, CSS, and Liquid. In there, the item rows are styled by a rule that draws the divider under each item, so solid separator lines between products are reachable with a small CSS change. Two honest caveats. First, it is code, and this merchant did not want code. Editing Liquid templates is a different skill from clicking blocks. Second, once the new visual editor is fully active on a store, the code editor is not always shown anymore. If you do not see an **Edit code** link in your receipts editor, that route is not open to you, and the visual editor limits above are what you have. So the summary is: the order-code move is a clean no-code win, and item dividers are either a code job or not available, depending on what your store still exposes. ## Where is the Shopify POS receipt editor? It is inside the Point of Sale channel, not the theme editor. Point of Sale, then Settings, then Printed receipts, then Customize your receipts. This trips people up because online store receipts and POS receipts are edited in completely different places. The theme editor does not touch POS printed receipts at all. ## Why did my Shopify receipts change on their own? Shopify replaced the older printed-receipt setup with the new visual editor and rolled it out automatically. If your printed layout looks different than it used to, that is why. Nothing on your account broke. The blocks and defaults are simply new. If the change has not shown up on your actual printed receipts yet, check the POS app version on every device. The new template only prints from a current app version, and a device on an older version keeps printing the old layout. If you run more than one device, update them all, or some will print the new layout while others print the old one. ## Can I add a logo or a QR code to POS receipts? Yes, both are blocks in the visual editor. The logo is a Header block. A scannable QR code is a Footer block, so it prints near the bottom by default. Add it from the Footer with **Add block**, then set its label and the link it points to. That QR is separate from the Order code discussed above, so do not confuse the two: the Order code identifies the sale, the QR block can point anywhere you choose, such as a review page or your store. For a sale that did not go through POS, such as a market stall sale you write up later, the [free receipt maker](/tools/receipt-generator) makes a POS-style receipt on 58 mm or 80 mm paper. ## Do I need POS Pro to customize receipts? For the deeper edits, yes. The code editor and the fuller block controls are POS Pro features. On the base POS plan you can still edit the header and footer message text, but the advanced layout control and the code route are Pro. If you are on Pro and still cannot find a control mentioned here, it is usually because that specific block sits in a section you have not expanded, or because the item Content section is genuinely locked, as covered above. ## Visual editor vs code editor: which one am I in? Quick way to tell. - **Visual editor:** you see a block tree with Header, Content, and Footer, and you click blocks and toggle their visibility. No code. - **Code editor:** you see files like `header.liquid` and `line-items.liquid` and you edit HTML, CSS, and Liquid directly. Most merchants are now in the visual editor by default. The code editor, where still available, is the "advanced edits" escape hatch behind an **Edit code** link. ## What to check if it did not work A few things trip people up on this receipt editor: - **The order code still prints at the top.** The Header block was not hidden. Open the Header, select the **Order code** block, and confirm the eye icon shows it as hidden. Hiding is per block, so make sure you toggled the Order code, not a neighbour. - **The Custom Liquid block shows nothing.** Check the text is exactly `Order number: {{ order.name }}`, with the double curly braces. A typo in the variable prints blank. The `order` object is available in the receipt template, so `{{ order.name }}` resolves at print time, not while you are editing. - **Your edits are not on the printed paper.** That is almost always the POS app version. The new template only prints from a current app, so update the app on every device, not just one. - **You changed it for one location but not another.** Receipt settings can apply per location on POS Pro. If you run several, confirm you edited the location you are printing from. - **You cannot find Add block on the item list.** That is expected. The Content section is locked, so there is no Add block there. It only appears on the Header and Footer. ## Order code vs QR code vs receipt number These three get mixed up, so quickly: - The **Order code** block is a scannable code that encodes the sale, and it lives in the Header by default. - A **QR code** block is a separate Footer block you can point at any link, like a review request or your store. - The **receipt number** (register-prefixed, like #1-1288) is the printed sale reference, which differs from the plain order number (#1425) that `{{ order.name }}` prints. Knowing which one you actually want saves a lot of back and forth. The merchant here wanted the order identifier moved down, which the Custom Liquid footer block handles cleanly. ## The short version Shopify's new POS receipt visual editor is block-based, at Point of Sale, Settings, Printed receipts, Customize. To move the order code to the bottom, hide the Order code block in the Header with the eye icon, then add a **Custom Liquid** block in the Footer containing `Order number: {{ order.name }}`. Separator lines between items are not available in the visual editor, because the Content section is locked. Those need the code editor, if your store still shows one, and that is a code change rather than a click. --- --- title: "Customize Shopify Product Page Layout With CSS" description: The product info on your Shopify product page starts too far down on desktop. Here is why the right column sits low, and one small CSS rule that lifts the whole column up while leaving mobile alone. Tested on Atelier, with screenshots. --- ## The problem A merchant asked about this on the Shopify Community. On desktop, the whole right-hand column of their product page sat too low. The images filled the left side from the top, but the title, price, variants and Add to cart button all started well below them, with a big empty gap above. They wanted to move the entire right column up together as one block: the product title, the price, the variants and options, the quantity, the Add to cart button, the Buy buttons and the description. Everything, in one move, so it sits closer to the top. There was one hard rule. The mobile layout had to stay exactly as it was. Only desktop should change. This is a common request, and it looks like it should be a single setting. It is not, and the reason is worth understanding before you touch anything. I reproduced it on an Atelier store. Here is the product page with the gap. Notice how the images start at the top on the left, but the title and price on the right begin much lower down. ![A Shopify product page on Atelier where the right column of product info starts far below the images](/images/blog/customize-shopify-product-page-layout/01-before-info-column-too-low.png) That empty space at the top of the right column is the whole complaint. The page is not broken. It is doing exactly what the theme tells it to do. ## Why the product info starts so low Here is the part that trips people up. The theme is adding a fixed amount of space to the top of the product info column, and it only does it on desktop. In Atelier that space is 80 pixels. The theme sets it with a single rule that runs at tablet and desktop widths and does nothing on phones. In plain terms, the column has a built-in top padding. Padding is empty space inside a box, above the content. So the title, price and everything under it get pushed down by that padding, while the image column next to it starts at the very top. The two columns are the same height, but one has a cushion on top and the other does not. This is why nudging the title, or the price, or the Add to cart button on their own never works cleanly. The gap is not on any one of those pieces. It is on the container that holds all of them. Move the container and every piece inside it moves together, which is exactly the behaviour the merchant wanted. It is also why there is no on and off switch for it in the theme editor. The gap is written into the theme's own stylesheet, not exposed as a setting. So no amount of clicking through the Product information section will reveal a control that removes it. Another person on the thread suggested looking for a built-in Product Details position or height control first. That is a sensible thing to check, and you should. But when the merchant went looking on their version of Atelier, their reply was short and clear: they did not see those controls. That is the normal outcome. The top gap is styling baked into the theme, and the fix has to happen in CSS. ## First, check the easy things Before you add any code, rule out the two things that occasionally are a setting. Open your theme and go to Online Store, then Themes, then Customize. Open a product and click into the Product information section, then into each block. If your version of the theme happens to expose an alignment or vertical-position control for the details column, try it first. On some themes and some versions it exists. On the Atelier version in this case, it did not. Also check whether the gap is coming from the section's own top spacing rather than the column. In the theme editor, select the Product information section and look for a Padding or spacing control. If the whole section has a large top padding, reducing that is the cleanest fix and needs no code. In this case the section spacing was normal and the gap was on the column itself, so a setting could not remove it. If neither of those applies, which is the usual result, one small CSS rule does the job. ## The fix: one Custom Liquid section The clean way to add a little CSS to a single template, without an app and without editing theme files, is a Custom Liquid section. It lives only on the template you add it to, so it cannot leak onto the rest of your store. I tested every step below on an Atelier store. Duplicate your theme first if you want to be safe. You are only adding one section, but a duplicate lets you preview with zero risk. ### Step 1: Add a Custom Liquid section to your product template Go to Online Store, then Themes, then Customize. Make sure the template selector at the top says Default product, or whichever product template you use. This matters, because it scopes the change. Anything you add here shows up on product pages only. In the left panel, click Add section, then choose Custom Liquid. In Atelier it is listed under Layout. ![Adding a Custom Liquid section to the product template in the Shopify theme editor](/images/blog/customize-shopify-product-page-layout/02-add-custom-liquid-section.png) ### Step 2: Paste the CSS and Save Click into the new Custom Liquid section. Paste this into the Liquid code box, then click Save. ```html ``` ![Pasting the desktop-only CSS into the Custom Liquid code box](/images/blog/customize-shopify-product-page-layout/03-paste-css-liquid-box.png) That is the whole fix. Here is what each part is doing, so you can adjust it with confidence. The `@media (min-width: 768px)` wrapper means the rule only runs at 768 pixels wide and up. That is tablet and desktop. Phones are narrower than that, so the rule never touches them. This is what keeps the mobile layout untouched, which was the merchant's hard requirement. The `.product-information .product-details` part targets the product info column inside the main product section, and nothing else. It is written that way on purpose. The short version, just `.product-details`, would also match the small product card inside quick-add popups, which reuse the same name. Scoping it to the product section keeps the change where you want it. Setting `padding-top` to `0` removes the cushion entirely, so the top of the title lines up with the top of the images. If you would rather keep a small breathing space instead of going flush, change `0` to `20px`, or any value you like. That single number is the one knob you adjust. Here is the same page after saving. The whole right column has moved up as one block and now sits level with the images. ![The Shopify product page after the fix, with the right column moved up to sit level with the images](/images/blog/customize-shopify-product-page-layout/04-after-info-column-at-top.png) On the store I tested, the product info moved up 80 pixels, from starting well below the images to lining up with their top edge. Everything inside the column moved together: title, price, variants, quantity, Add to cart, Buy buttons and description. Mobile did not change at all. ## How do I move the Add to cart button up on Shopify? This is the same problem seen from a different angle, and the answer is the same rule. The Add to cart button is not floating on its own. It sits inside the product info column, below the title, price and variants. If the whole column is pushed down, the button is pushed down with it. So you do not move the button by itself. You move its container, and the button follows. Trying to move the button alone with its own negative margin tends to backfire. It can slide the button up over the price, or break the spacing between the variant picker and the button on some screen sizes. Lifting the column keeps all the internal spacing intact and just changes where the whole group begins. If your real goal is to keep the Add to cart button visible without scrolling, moving the column up helps, but the bigger lever is often the image size. A very tall image column pushes the fold down. Shortening or constraining the gallery height on desktop can do more for button visibility than moving the text column. ## Can I change the product page layout without an app? Yes, for spacing and position tweaks like this one. A Custom Liquid section with a few lines of CSS covers most of these small layout complaints, and it costs nothing and loads nothing extra. Page builder apps like PageFly, Shogun and GemPages are a different tool for a different job. They let you rebuild the product page visually with drag and drop, which is worth it if you want a heavily custom layout with extra sections, tabs and blocks. For a single spacing fix they are overkill. Reach for one when you are redesigning the page, not when you are nudging one column. The native theme editor also does more than people expect. Most sections have their own Width and Padding controls, so before writing CSS it is always worth checking whether a section setting already does what you want. ## How do I add custom CSS to a Shopify theme? There are three common places, and it is worth knowing the difference. A Custom Liquid section, which is what we used, is the most surgical. It applies to the single template you add it to. That is perfect when you want a rule to affect product pages only, or one specific page only, and never the rest of the site. Some themes also have a global Custom CSS box in their theme settings. That applies everywhere on the store. It is convenient, but it is the wrong tool when you want to limit a change to one page type, because you then have to add your own conditions to stop it leaking. The third option is editing the theme's CSS files directly through the code editor. That is the most powerful and the easiest to get wrong, and it is not needed for a small change like this. Keep code edits for things a section cannot do. For a targeted, page-specific tweak, the Custom Liquid section wins. It is easy to find later, easy to remove, and it cannot affect anything you did not intend. ## What to check if it did not work - **Nothing changed on desktop.** Confirm the Custom Liquid section is on the product template, not on the home page or another template. Also confirm you clicked Save. If Save stayed greyed out, click once inside the code box, add a space and remove it, and Save should light up. - **It changed the layout on mobile too.** You probably dropped the `@media (min-width: 768px)` wrapper, or changed the number. Keep the media query exactly as shown. It is the part that protects the phone layout. - **Something else on the page shifted.** You may have used the short selector `.product-details` on its own. Use the scoped version, `.product-information .product-details`, so the rule stays on the main product column and does not reach quick-add popups. - **The title now touches the top too tightly.** Change the `0` to `20px` or `30px` for a small gap. There is nothing special about zero. It is just the value that makes the column flush with the images. - **It works in the editor preview but not on the live site.** Make sure you published the theme, or that you are viewing the same theme you edited. It is easy to edit a duplicate and then check the live one. ## Section, block, template: the words that get mixed up Most of the confusion around product page edits comes from three words that get used loosely. A **template** decides which sections appear on a page and in what order. Your product pages use a product template. Adding a Custom Liquid section to that template is what scopes a change to product pages, because the section only exists on that template. A **section** is a band on the page, like the Product information area or a Custom Liquid block you add. Sections are where most layout settings live, such as Width and Padding. A **block** is a smaller piece inside a section, like the title, the price or the variant picker inside the Product information section. Blocks are what you rearrange within a section. And one more pair worth separating: **padding** is empty space inside a box, above or around the content, while **margin** is space outside the box, between it and its neighbours. The gap in this case was top padding on the info column, which is why zeroing the padding, rather than adding a negative margin, is the correct and predictable fix. Once those words line up, this kind of edit stops feeling like guesswork. You find the container, you find whether the space is padding or margin, and you change it on the one template that should be affected. That is the whole method, and it works for far more than moving a product column up. --- --- title: "How to Edit the Shopify Cart Page and Add a Message" description: "Shopify checkout hides the shipping option when a cart holds only pickup-only products, and it never says why. You cannot edit that screen without Plus, but you can edit the cart page. Here is how to add a message there for chosen products, tested on Dawn." --- ## The problem A merchant on the Shopify Community sells trail mix, dried fruit and chocolate from a local business in Colorado. Some of the products can only be collected in person, so the store has them set to pickup only. When a customer's cart holds nothing but those products, checkout shows a single delivery choice: collect from the store. There is no shipping option and no sentence explaining why it is missing. The merchant's concern was that customers assume the checkout is broken and leave. Their request was a line of text on that screen, such as "Shipping isn't available for these items", placed next to the pickup choice. This article shows what you can do instead. It also covers how to edit the Shopify cart page, because that page is where the fix goes. ## Why checkout shows no shipping option In Shopify, the shipping rates a customer sees come from a shipping profile. A shipping profile is a group of products plus the delivery prices that apply to them. A pickup-only product sits in a profile that has no delivery prices at all. If every item in the cart belongs to such a profile, checkout has nothing to offer except pickup, so it shows only that. The step-by-step setup is in [how to make a product pickup only on Shopify](/blog/how-to-make-product-pickup-only-shopify). Checkout treats this as a normal result, so it shows no warning and no explanation. That works for a shopper who chose pickup on purpose. It confuses a shopper who expected delivery. ## Can you add the message at checkout? Not directly. The checkout page is not part of your theme, so the theme editor cannot change it. Two routes exist, and neither suits this case: - **Edit the wording of the pickup line.** Shopify lets you rename some checkout phrases, such as "There is 1 location with your item". The merchant had already found this. The same phrase appears in other carts too, so a note about shipping would show up where it makes no sense. - **Add a checkout extension.** An extension is a small add-on that places your own content inside checkout. Putting one on the delivery step needs a Shopify Plus plan. So the closest option is the last page you do control before checkout: the cart page. The customer reads the message, then clicks Check out already knowing what to expect. ## What the result looks like This is the cart of a pickup-only product on my test store. Shopify's cart page says nothing about shipping. ![Cart page with one pickup-only product and no message](/images/blog/edit-shopify-cart-page-add-message/01-cart-before-no-message.png) After the change, a green box explains it above the total and the Check out button. ![Cart page with a green message saying pickup only and shipping is not available](/images/blog/edit-shopify-cart-page-add-message/02-cart-after-pickup-only-message.png) The box appears only when every item in the cart is a pickup-only product. A cart that mixes pickup-only and shippable products does not show it. I tested both: a cart with the pretzels alone showed the message, and a cart with the pretzels plus a tote bag did not. ![Cart page with two products, one pickup only, and no message](/images/blog/edit-shopify-cart-page-add-message/11-cart-mixed-no-message.png) Mixed carts behave differently at checkout, and the pickup-only article linked above explains why. In short, a shopper in a mixed cart has to choose Pickup to buy everything in one order. ## Before you start: check your cart type Dawn and similar themes let you pick what happens after a customer clicks Add to cart. In the theme editor, open Theme settings (the gear icon), then Cart, and look at Cart type. ![Theme settings in the editor with the Cart section open and Cart type set to Popup notification](/images/blog/edit-shopify-cart-page-add-message/12-theme-settings-cart-type.png) There are three choices: Page, Drawer and Popup notification. Dawn ships with Popup notification. That popup has a button that goes straight to checkout, so a customer can skip the cart page and never see your message. Set Cart type to **Page** if you want every customer to pass through the cart page. If you keep the drawer or the popup, the message below will only show to customers who open the full cart page. ## Step 1: Tag the pickup-only products The message needs a way to tell which products are pickup only. A tag does that job. A tag is a short label you attach to a product, and the theme code can read it. Open each pickup-only product, add the tag **pickup-only** in the Tags box, and save. Type it exactly as written, because the code looks for that spelling. ![Product page in Shopify admin with the pickup-only tag added](/images/blog/edit-shopify-cart-page-add-message/03-product-tag-pickup-only.png) ## Step 2: Open the theme editor Go to Online Store, then click Edit theme on your current theme. The theme editor is where you change how your store looks without touching the files directly. ![Online Store themes page with the Edit theme button highlighted](/images/blog/edit-shopify-cart-page-add-message/04-online-store-edit-theme.png) ## Step 3: Switch to the Cart page At the top of the editor there is a page list that says Home page by default. Click it and choose **Cart**. The editor now shows your cart page. Its sections are listed on the left under Template: Items, Subtotal and Featured collection. A section is one block of a page that you can move, hide or add to. ![Theme editor page list open with Cart selected](/images/blog/edit-shopify-cart-page-add-message/05-theme-editor-pick-cart.png) If your cart is empty, the editor shows the "Your cart is empty" version of the page. The message stays hidden there, because it only appears when the cart has items. ## Step 4: Add a Custom Liquid section Liquid is the code Shopify themes are written in. A Custom Liquid section is a box in the theme editor where you paste a short piece of that code. Under Template, click **Add section**. ![Cart template in the editor with the Add section button highlighted](/images/blog/edit-shopify-cart-page-add-message/06-cart-template-add-section.png) Type Custom Liquid in the search box and click the result. ![Add section search showing Custom Liquid](/images/blog/edit-shopify-cart-page-add-message/07-search-custom-liquid.png) ## Step 5: Paste the code Paste this into the Liquid code box: ```liquid {%- assign pickup_only = true -%} {%- for item in cart.items -%} {%- unless item.product.tags contains 'pickup-only' -%} {%- assign pickup_only = false -%} {%- endunless -%} {%- endfor -%} {%- if cart.item_count > 0 and pickup_only -%}

Pickup only. Shipping isn't available for the items in your cart. Choose pickup at checkout.

{%- endif -%} ``` ![Custom Liquid box with the code pasted in](/images/blog/edit-shopify-cart-page-add-message/08-paste-liquid-code.png) Here is what the code does, in plain words: - It starts by assuming the cart is pickup only. - It looks at each item in the cart. If an item does not carry the tag, it changes its mind. - If the cart has items and every one of them has the tag, it shows the green box. Otherwise it shows nothing. ## Step 6: Move the section above the total A new section lands at the bottom of the page, below Featured collection. Drag **Custom Liquid** up in the left list until it sits between Items and Subtotal. Shopify shows a blue line where it will drop. ![Left list in the editor with Custom Liquid placed between Items and Subtotal](/images/blog/edit-shopify-cart-page-add-message/09-drag-custom-liquid-above-subtotal.png) ## Step 7: Save Click **Save** in the top right corner. The message is live on your cart page as soon as the theme you edited is the published one. ![Theme editor with the Save button highlighted](/images/blog/edit-shopify-cart-page-add-message/10-save-theme.png) I ran these steps on Dawn 11.0.0, the theme the merchant uses. Themes built on the same base look the same. A theme with a different layout may use other section names, but the Add section and Custom Liquid steps are the same. ## Change the wording or the colors Edit the text between the `` and `

` tags to say what you like. Keep the tag name `pickup-only` the same in the product and in the code. If you rename the tag, rename it in both places. The colors sit in the `style` line. `border` is the outline, `background` is the fill. Replace the hex values (the codes starting with `#`) with your own brand colors. The message says "Choose pickup at checkout" because that is what the checkout offers for these items. Change that last sentence if your pickup has an extra step, such as booking a time. ## What else you can edit on the cart page The cart page is built from the same sections as any other page, so the editor controls cover most changes: - **Move or hide a section.** Drag a section in the left list to reorder it. The eye icon hides it without deleting it. - **Add a section.** Any section type your theme offers, such as Rich text or Image banner, can sit on the cart page. Custom Liquid is the one to use when the content depends on what is in the cart. - **Turn on the cart note.** In Theme settings, under Cart, the Enable cart note switch adds a box where customers can leave a message for you. - **Change the cart type.** Page, Drawer or Popup notification, as shown earlier. If you want a message for a different group of products, create another tag and copy the Custom Liquid section with a new tag name. Use `contains` with the tag in the code, the same way as above. ## If the message does not show - **Check the tag.** The tag on the product must read `pickup-only`, with a hyphen and no capital letters, the same as in the code. - **Check every item.** The message needs all items in the cart to carry the tag. One product without it hides the message by design. - **Check the cart type.** With Popup notification or Drawer, a customer may never open the cart page. Set Cart type to Page, or tell customers to open the cart. - **Check you saved the right theme.** The editor shows the theme name at the top. A draft theme does not change your live store until you publish it. - **Check the section is on the Cart page.** If you added it while the page list said Home page, the message sits on the home page instead. Switch the page list to Cart and add it again. ## Cart page, cart drawer and checkout These three get mixed up, so here is the difference: - **Cart page** is the full page at `/cart`. Your theme controls it, and this article edits it. - **Cart drawer** is a panel that slides in from the side after Add to cart. It belongs to the theme too, but it is a separate piece of code from the cart page, so a section on the cart page does not appear in it. - **Checkout** is the page where the customer enters an address and pays. Shopify controls it. Only Plus stores can add their own content to the delivery step. The merchant who asked already had a pickup note on the cart page and on the product pages. Their wish was for Shopify to add a short explanation at checkout, so this stays a request for Shopify. Until then, the cart page is the last page where you can add your own text for every plan. ## Summary Checkout shows only the pickup choice when a cart holds nothing but pickup-only products, and it gives no reason. Without Plus, you cannot add that reason at checkout. Tag the pickup-only products, add a Custom Liquid section to the cart page, paste the code and drag it above the total. On my test store the message showed for a pickup-only cart and stayed hidden for a cart that also held a shippable product. Set Cart type to Page so that customers see it before they pay. --- --- title: Remove Archived Products From a Shopify Collection in Bulk description: Archived products stay in Shopify collections. Remove them in bulk, keep them out with a status rule, or bulk hide products by archive, draft or sales channel. --- ## The problem A merchant asked about this on the Shopify Community, and it is a good example of a UI change breaking a workflow with nothing in the admin to flag it. They had a collection they sort by hand. After Shopify's collections redesign, the collection view lost its status filter. Archived products still sit in the collection, still occupy numbered manual positions, and there is no longer any way to filter them out from inside the collection itself. Their exact words: they had to click "next" roughly 400 times to reach the end of the collection and reorder products. I reproduced it on a test store. Here is a collection where every single item is archived, and the collection view gives you nothing to hide them with. ![A Shopify collection where every product is archived, with no status filter available](/images/blog/hide-archived-products-shopify-collection/01-archived-products-in-collection.jpeg) There is no setting for this. The new collection view has no status filter. ## Why archived products still clog the collection Archiving a product hides it from your storefront and from the main product list in your admin. Customers cannot see it. That part works exactly as you expect. But archiving does not remove the product from collections it already belongs to. Shopify's Help Center says it directly: archived products stay in collections and are still listed in the Collection items section of the admin, but customers cannot view them. In the admin today the Collection items count includes them, while the list itself opens with a status filter of Active, Draft, Unlisted, and Suspended, so the archived ones only appear once you add Archived to that filter. If you sort manually, each one keeps its position number. So positions 1 through 400 might be mostly products that no shopper will ever see. That is the whole issue. The archived products are doing nothing for you except taking up slots in your manual sort order. Once you frame it that way, the answer changes. You do not need to filter them out of the view. You need to get them out of the collection. Nothing customer facing changes when you do. They were already hidden from shoppers. ## First, check where the collection gets its products Everything below depends on this, so check it before you start clicking. It takes about five seconds. Open the collection in your admin. A Shopify collection gets its products from one or more sources, and the two that matter here are: - **Products you added by hand.** You picked each product, using Browse or Add products. This is what older guides call a **manual** collection. - **Conditions.** A rule such as "Tag includes summer" that Shopify matches against your catalog and keeps re-checking as products change. This is an **automated** collection. In the current admin the rules sit inside a Products source on the collection page. A collection can contain items from more than one source, so check for both. Merchants often assume theirs is manual because they remember adding products, when in fact a tag rule has been filling it for months. That one check decides the method. Products you added by hand need Method 1, a cleanup you perform. Products that come in through a rule get Method 2, a rule that does the work for every future product too. ## Method 1: Remove them in bulk from the Products page The collection view lost its status filter. The Products page did not. It still has both filters, and it can act on collection membership. So do the work from there instead. ### Step 1. Filter to exactly the products you want gone Go to Products. Add a filter for Collection and pick your collection. Then add a filter for Status and pick Archived. ![Shopify Products page filtered by collection and archived status](/images/blog/hide-archived-products-shopify-collection/02-filter-collection-status-archived.jpeg) You are now looking at precisely the archived products inside that one collection, and nothing else. Check the count before you go further. It should match roughly what you expect. ### Step 2. Select them and choose Remove from collection Tick the checkbox in the table header row. That selects every product on the current page. If more than 50 products match your filters, open the "50 selected" drop-down and click Select all results, which selects every product that matches the filter, not only the ones on screen. ![The Select all results option in the Shopify Products list after filtering by collection and Archived status](/images/blog/hide-archived-products-shopify-collection/07-select-all-results.png) Then open the `...` overflow menu in the bulk action bar and choose Remove from collection(s). ![The Remove from collections bulk action in the Shopify admin](/images/blog/hide-archived-products-shopify-collection/03-remove-from-collections-bulk-action.jpeg) Shopify's Help Center notes that larger bulk changes take longer to finish, so give a big selection a minute before you check the result. ### Step 3. Pick the right collection, then Save The dialog lists all of your collections, not just the one you filtered by. Tick only the collection you are cleaning up, then Save. ![Choosing which collection to remove the products from](/images/blog/hide-archived-products-shopify-collection/04-choose-collection-to-remove.png) Slow down on this screen. It is the one place in this process where a mis-click costs you real work, because removing the wrong collection's products would wipe a manual sort order you may not be able to rebuild. ### The result The archived products leave the collection, and the manual order closes up behind them and renumbers from 1 with no skipped numbers. ![The collection after removal, with manual sort order intact and renumbered](/images/blog/hide-archived-products-shopify-collection/05-collection-after-removal.jpeg) On my test store the collection went from 7 items down to 4, renumbered 1 through 4. The sort order I had set for the remaining products was untouched. That last part is the bit people worry about, and it holds up. ## Method 2: Let a status rule keep archived products out Method 1 is a cleanup. It fixes today's mess but does not stop the next archived product from landing in the collection. If your collection fills itself using conditions rather than manual selection, there is a much better answer. Open the collection and, in the Products source that holds your rules, click Add condition and set it to: - Product status - is not equal to - Archived Make sure the source is set to Match all conditions. With Match any condition, a status rule adds every product with a matching status, so the collection grows instead of shrinking. Shopify's own instructions say to use Match all conditions when you filter a collection by product status. ![Adding a Status is not equal to Archived condition to a Shopify collection](/images/blog/hide-archived-products-shopify-collection/06-status-not-equal-archived-condition.jpeg) On my test store this took a collection from 24 items to 4 the moment I saved it. This method works differently from Method 1 because archived products never enter the collection in the first place. Anything you archive in future drops out on its own. There is no page-by-page clicking, no repeat cleanup, and the collection size does not matter. One rule handles 20 products or 20,000. The catch is that conditions only apply to products the rule matched. Shopify states that a condition does not remove products you added by hand. If your collection has both, add the rule for the matched products and use Method 1 for the hand-added ones. ## Which one should you use Pick based on where the products came from, not how big the collection is. | Your situation | Use | | --- | --- | | Products come in through conditions, any size | Method 2, the status condition | | Products added by hand, small collection | Method 1, bulk remove | | Products added by hand, thousands of items | Method 1 with Select all results, or consider rebuilding it with conditions | | A mix of both | Method 2 for the rule, then Method 1 for the hand-added products | That third row deserves a note. The merchant who asked this came back and said they had around 23,000 archived products, all added automatically by tag. Select all results can pick up all of them in one go, but a bulk change that size takes a long time, and the next archived product would land in the collection again. The detail that matters is "added automatically by tag." That means the collection is already rule based, so Method 2 applies. Add the status condition alongside the existing tag condition, with Match all conditions. All 23,000 archived products drop out without any clicking through pages. The tag rule keeps working exactly as before. If you are dealing with a big collection, check for conditions before you start clicking. They change the answer entirely. ## If removing archived products did not work Each of these ties to one of the two methods above, with the check that rules it out. **The count did not change after adding the condition.** Check the Match all conditions option on the Products source. On Match any condition, your status rule adds products instead of filtering them. **Some archived products are still in the collection after Method 2.** Those were added by hand, and a condition does not remove products you added by hand. Run Method 1 on them: filter the Products page by the collection and Archived, select all, and remove them from the collection. **Products came back later.** A condition is controlling membership. Check the collection for conditions and use Method 2. **You cannot find the status condition.** Click Add condition inside a Products or Variants source, then pick Product status. Shopify does not offer the status condition in the Exclude section, so look for it under Add condition. **The Products page shows fewer archived products than the collection.** Check that both filters are on, Collection and Status, and that the Collection filter names the right collection. A Status filter of Active or Draft instead of Archived gives a different count. **Your manual order looks scrambled.** Removal renumbers to close up the empty positions, so numbers shift, but the relative order stays the same. If the actual sequence changed, check that the collection's sort is still set to Manually and not something like Best selling. ## How to bulk hide products on Shopify If you searched for a way to hide many products at once, archiving is only one of three ways, plus a fourth option, Unlisted, covered in the table below. Each of the three hides products from your online store, and each leaves something different behind. Shopify's troubleshooting page says to check two things when a product is missing from your online store: that its status is Active and that it is available to the Online Store. Changing either one hides it. All three start the same way. Go to Products, add filters until the list shows only the products you want hidden, tick the header checkbox, and use Select all results if more than 50 match. ### Archive them Use this for products you have finished selling. In the bulk action menu, choose the archive option. ![The bulk action menu on the Shopify Products list with Archive products, Unlist products and Exclude from sales channels](/images/blog/hide-archived-products-shopify-collection/08-bulk-actions-menu.png) Archived products move to the Archived tab, leave your storefront, and stay in their collections. When you unarchive one later, Shopify sets it to Draft, not Active, so you need to set it to Active again before it goes back on sale. ### Set them to Draft Use this for products you are still preparing. Click Set as draft in the bulk action bar. ![The Set as draft button in the bulk action bar of the Shopify Products list, with several products selected](/images/blog/hide-archived-products-shopify-collection/09-set-as-draft.png) A Draft product is not Active, so it does not show on your online store. Unlike an archived product, it does not move to the Archived tab. You find it under the Draft view of the Products list. ### Exclude them from the Online Store Use this when the product should stay Active but leave your website, for example a product you only sell in person. In the bulk action menu, choose Exclude from sales channels, then pick Online Store. The Help Center still calls this action Make products unavailable. ![The Exclude from sales channels dialog in Shopify with the Online Store sales channel selected](/images/blog/hide-archived-products-shopify-collection/10-exclude-from-sales-channels.png) A sales channel is a place you sell, such as your online store, a marketplace or the point of sale app. The product stays Active, keeps its status, and stays on any channel you did not pick. To find these products later, filter the Products list by Sales channel. ### Which way to hide them | You want to | Use | Where the products end up | | --- | --- | --- | | Stop selling them for good, but keep the records | Archive | Archived tab, off the storefront, still in collections | | Hide them while you finish the listing | Draft | Draft view, off the storefront | | Keep selling them elsewhere, just not on your website | Exclude from sales channels | Still Active, off the Online Store channel | | Keep them buyable by direct link only | Unlisted (Unlist products in the bulk menu) | Still sellable, out of collection pages and search | Archiving does not take a product out of a collection, and Shopify does not document Draft or channel changes doing so either. If the collection's manual order is your concern, follow Method 1 or Method 2 above as well. ## Hide every product from one brand If a brand you stocked is discontinued, hide its whole range in one pass. Shopify stores this in the product's Vendor field, which it describes as the manufacturer, wholesaler, or other vendor. If your vendor values are brand names, this works per brand. On the Products page, add the Vendors filter and pick the brand. Add the Status filter with Active, so you only touch products that are still on sale. Select all results, then archive them or exclude them from the Online Store, as described above. ![The Shopify Products list filtered by one vendor and Active status, ready for a bulk action](/images/blog/hide-archived-products-shopify-collection/11-vendor-filter.png) Collections built from conditions can also keep a brand out. Add a vendor condition set to is not equal to and the brand name, with Match all conditions. Every product from that vendor that the rules matched drops out, including products you add to your catalog later. Products you added to the collection by hand stay, so remove those with Method 1. ## How to remove a product from a Shopify collection, archived or not Everything above works for any product, not just archived ones. If you landed here because you simply want a product out of a collection, the route depends on how it got there. For a product you **added by hand**, open the collection, hover over the product in the Collection items section, click the x next to it, and click Save. Shopify's Help Center confirms that removing an item takes it out of the collection without deleting the product from your store. For several at once, use the Products page method in Step 1 to Step 3 above and skip the Status filter. Filter by Collection only, tick the products you want gone, then use Remove from collection(s). For a product that came in **through a condition**, Shopify documents the x only for products you added by hand. Either change the rule so it stops matching, or change the product so it no longer qualifies. A Products source also has an Exclude section that keeps products out by category, tag, type or vendor (for example, tag the product and exclude that tag) without changing the include rule. That distinction matters more than it looks. If a product keeps reappearing in a collection, check the collection for conditions that match it. For more on the rule side, see [how to build smart collections from extra fields you add to your products](/blog/shopify-smart-collections-metafields). To move a product to the front instead of removing it, see [how to pin a product to the top of a Shopify collection](/blog/shopify-pin-product-to-top-of-collection). ## How to remove or hide a whole collection Sometimes the collection itself is the thing to go. You have two options, and only one of them is permanent. **Delete it.** Go to Products > Collections, open the collection, click the trash can icon at the top of the page, then confirm the delete. Shopify removes it permanently, and it also removes links to it from your online store menus. You can delete several collections at once with a bulk action from the collections list. ![The trash can icon at the top of a Shopify collection page, which deletes the collection](/images/blog/hide-archived-products-shopify-collection/12-delete-collection-menu.png) **Hide it from your store.** Open the collection, click Channels, clear Online Store in the Sales channels drop-down, and click Save. The collection stays in your admin and you can turn it back on later. Hiding a collection does not hide the products in it. Shopify notes that changing a collection's availability does not change the availability of the products inside it, so each product keeps its own setting. ## What happens when you archive a product on Shopify Shopify's Help Center describes four effects: - The product moves to the Archived tab of the Products page, so it disappears from the main product list - It is hidden from your storefront - It stays in every collection it already belonged to, listed under Collection items, but customers cannot view it there - If you unarchive it, its status is set to Draft, not back to Active The third point is the behaviour this whole article exists for. Archiving is about sales visibility, not collection membership, and merchants reasonably expect it to handle both. You can still find an archived product at any time by opening the Archived view of the Products page or by filtering Status to Archived. ### Archive vs delete Archiving is reversible and deleting is not. Shopify states that a deleted product is permanently removed and cannot be restored. **Archive** when you might sell it again, or when you need the product's details for reference. You can unarchive it at any time and set it to Active, and the product's details are still there. **Delete** only when the product was a mistake, like a duplicate or a test entry. For seasonal stock, archive. For a product you accidentally created twice, delete. When in doubt, archive, because you can always delete later but you cannot undo a delete. ## Archived, draft, and unlisted are not the same thing Merchants mix these up often, and it matters here because each status changes where a product shows up. **Active** is a product that is ready to sell and visible on the channels you have made it available to. **Draft** is a product you are still working on. It is not Active, so it does not show on your online store, and you find it under the Draft view of the Products list. **Archived** is a product you are finished selling. Shopify hides it from your storefront and moves it out of your main product list, which is why it feels deleted when it is not. **Unlisted** is narrower. The product can still be sold and reached by direct link, but it does not appear in collection pages, search results or product recommendations, and Shopify removes it from your sitemap. For more on that, see [how to keep products out of Shopify search results](/blog/shopify-hide-product-from-search). So if your collection looks cluttered, archived products may not be your only problem. When you run the Method 1 filter, try Status set to Draft as well as Archived, and remove any drafts you find the same way. When you build the Method 2 rule, you can add a second condition, Product status is not equal to Draft, the same way. Unlisted suits merchants who want a product to stay buyable but stop cluttering their storefront. It is worth knowing about before you reach for archive out of habit. ## One last thing worth asking Before you clean up thousands of archived products, ask whether they need to stay archived. Archived is meant for products you are done selling. If you are archiving seasonal stock you plan to bring back next year, the Method 2 rule handles that on its own. Products drop out of the collection while archived. When you unarchive them they come back as Draft. Draft is not Archived, so they rejoin the collection straight away, but shoppers do not see them until you set them to Active. If you also added Product status is not equal to Draft, they return only once they are Active. You never touch the collection. That is the real advantage of solving this with a rule instead of a cleanup. A cleanup fixes the collection once. A rule keeps it correct while your catalog changes underneath it. ## Frequently asked questions ### Does archiving a product remove it from a Shopify collection? No. Archived products stay in their collections and are listed under Collection items in the admin, but customers cannot view them. To take them out, remove them from the Products page (Method 1) or add a Product status is not equal to Archived condition (Method 2). ### How do I bulk hide products on Shopify? Filter the Products list, tick the header checkbox, and use Select all results if more than 50 match. Then archive them, click Set as draft, choose Exclude from sales channels and pick Online Store, or use Unlist products. ### What happens when you archive a product on Shopify? It moves to the Archived tab, it is hidden from your storefront, and it stays in its collections. It is not deleted. If you unarchive it, Shopify sets it to Draft, so set it to Active to sell it again. ### How do I filter archived products out of a collection? The new collection view has no status filter. Filter the Products page by Collection and by Status set to Archived instead, then use Remove from collection(s). For a collection built from conditions, add Product status is not equal to Archived with Match all conditions. ### Why did my status condition not remove archived products? Either the source is set to Match any condition, which adds products instead of filtering them, or the archived products were added by hand. A condition does not remove products you added by hand, so remove those with Method 1. ### How do I remove a collection in Shopify? Open the collection, click the trash can icon at the top of the page, then confirm the delete. Deleting is permanent. To keep the collection but hide it, click Channels and clear Online Store instead. --- --- title: How to Add Custom CSS in Shopify (Beginner Guide) description: Custom CSS lets you fix small design problems in Shopify without touching theme code. Here is where to paste it, how to target the right element, and a real worked example that aligns two image banner boxes. --- ## The problem A merchant asked this on the Shopify Community. Their homepage had two image boxes side by side, a cat box and a dog box. The left box sat lower than the right one, and they wanted the tops to line up. They were a beginner and asked for the CSS to fix it. That is one of the most common reasons people reach for custom CSS. The theme is 95% right, one small thing is off, and you do not want to hire a developer or edit theme code for a single rule. This guide shows how to add custom CSS in Shopify the safe way, using that exact alignment problem as the worked example. The store in the screenshots runs the Vitazen theme, but the steps are the same on Dawn, Horizon, and almost every modern theme. ![Two image boxes on a Shopify homepage, the left box sitting lower than the right](/images/blog/how-to-add-custom-css-in-shopify/01-before-image-boxes-misaligned.jpeg) ## What custom CSS is, in plain words CSS is the language that controls how your store looks. Spacing, colors, sizes, alignment, all of it. Your theme already ships with thousands of lines of CSS. Custom CSS is a small block of your own that you add on top. It overrides the theme for one specific thing, without changing any theme files. Two things make it safe for a beginner: - It lives in its own box, separate from theme code. You cannot break a template by editing it. - It is easy to undo. Delete the block, click Save, and you are back to normal. That is the whole idea. You are not rewriting the theme. You are adding one polite instruction that says "for this element, use my value instead." ## Where to add custom CSS in Shopify Shopify gives you two places to paste custom CSS. Picking the right one matters, so here they are side by side. **Per section (the one you want most of the time).** Every section in the theme editor has its own Custom CSS box at the bottom of its settings. CSS you paste there only affects that one section. This is the cleanest option, because it keeps your change scoped and easy to find later. **Whole theme.** In the theme editor, open Theme settings, then find the Custom CSS box (some themes label it App embeds or Advanced). CSS here applies to every page of your store. Use this only when the change really is site-wide, like a font tweak that should appear everywhere. For the image box problem, and for most small fixes, the per-section box is the right choice. That is what the steps below use. ## How to add custom CSS to a Shopify section, step by step Here is the exact process. It took under a minute on the test store. ### 1. Open the theme editor From your admin, go to **Online Store**, then **Themes**, then **Customize** on your live theme. ### 2. Click the section you want to change In the preview, click the section that holds the problem. In this example it is the Image banner with the cat and dog images. Clicking it opens that section's settings in the left panel. ### 3. Scroll to the Custom CSS box Scroll to the bottom of the section's settings. You will see a box labelled **Custom CSS**. It even tells you "Adds custom styles to this section only," which is your confirmation that the change stays scoped. ### 4. Paste your CSS and Save Paste your rule into the box and click **Save**. That is it. The change is live. For the two misaligned boxes, the rule was: ``` .banner--image-space-true .grid__item:first-child { margin-top: 0 !important; } ``` ![The Custom CSS box inside a section's settings in the Shopify theme editor](/images/blog/how-to-add-custom-css-in-shopify/02-paste-custom-css-into-section.png) The theme was deliberately dropping the first box down with a top margin to create a staggered look. The rule sets that margin back to zero, so both boxes start on the same line. ![The same two boxes now aligned, both starting on the same line](/images/blog/how-to-add-custom-css-in-shopify/03-after-image-boxes-aligned.jpeg) ## How to find the right thing to target The hardest part of custom CSS is not writing it. It is knowing which element to point at. Here is the beginner method. - Open your storefront in Chrome. - Right-click the element you want to change and choose **Inspect**. - The panel that opens highlights the element and shows its `class` names. - Read the styles on the right. The value causing your problem is usually there, often with the file and line it came from. In the image box example, inspecting the low box showed a `margin-top` of `8rem` on the first `.grid__item`. That single value was the whole problem. Once you can see the value in Inspect, your custom CSS just needs to override it. You do not have to memorise CSS. You need to find the one property that is wrong and set it to the value you want. ## Section CSS vs theme CSS: which to use This trips people up, so here it is plainly. **Section Custom CSS** only affects the section you pasted it into. If you have three image banners and only want to fix one, this keeps the other two untouched. It is the safer default. **Theme Custom CSS** affects the whole store. It is right for global changes, but risky for one-off fixes, because a broad selector can accidentally hit other pages. A good rule: start with the section box. Move up to theme-wide only when you genuinely need the change everywhere. ## Does custom CSS apply to products you add later? Yes. This is the question that arrives once your rule is working: you have styled one product page, and next week you add ten more products. You do not have to open the theme editor ten more times, and the reason is where Shopify puts the code. The Custom CSS box is not attached to the product you happened to have open in the preview. It is saved into the **template** that the page is built from. A template is the reusable layout a page type uses: one file that decides which sections appear, in what order, with which settings. Every theme ships with one called **Default product**, and unless you deliberately change it, every product in your catalogue is drawn by that same template. Paste a rule into a product section's Custom CSS box and you have edited the template, not the product. Products you create afterwards are drawn by the same template, so they arrive with the styling already on them. Here is a product created after the CSS was saved, with the theme editor never reopened in between. The size label and the value are already uppercase and the dropdown already has its blue focus ring. ![A newly created Shopify product page already showing the custom styling, with an uppercase size label and a blue ring on the dropdown](/images/blog/how-to-add-custom-css-in-shopify/04-new-product-styling-applied.png) Deleting a product does not touch the code either. The rule lives in the template, so removing one of the pages that uses it leaves it exactly where it was. ### The one case where it does not carry over There is a single exception, and it is easy to check. Shopify lets you build more than one product template. Shops do this when a few products need a different page shape, such as a bundle that needs extra sections or a made-to-order item with its own form. Each template is a separate file with its own settings, which means each one has its own Custom CSS box. If you assign a product to one of those other templates, it is no longer drawn by the template holding your rule, so the styling will not appear on it. To check which template a product uses, open the product in your admin and look at the right hand column, near the bottom. The card is labelled **Theme template**. On a normal product it reads **Default product**. ![The Theme template card on a Shopify product page in the admin, set to Default product](/images/blog/how-to-add-custom-css-in-shopify/05-theme-template-default-product.png) Leave it on Default product and there is nothing more to do. If you do need a second template, open that template once in the theme editor and paste the same CSS into its own Custom CSS box. That is once per template, which is usually once or twice in the life of a shop, rather than once per product. ### What does remove it Two things, and neither happens by accident. - **You edit or clear the box yourself.** The rule stays until you change it. - **You switch to a different theme.** The code is stored inside the theme, not inside your store, so a brand new theme starts with an empty box. Duplicating your current theme is different: the copy carries every template across, Custom CSS included, which is why duplicating before a big change is the usual advice. That is also the answer to "is custom CSS permanent?". It is as permanent as the theme it sits in. It survives new products, deleted products, product edits, and normal theme editor work. It does not survive being replaced by a different theme. ## When to use !important You will see `!important` in a lot of Shopify CSS answers, including the one above. Here is what it does and when to reach for it. Your theme's own rule and your custom rule can have the same strength. When that happens, the theme can win and your change does nothing. Adding `!important` forces your value to take priority. Use it when a plain rule has no effect even though the selector is correct. Do not sprinkle it everywhere by default, because once everything is `!important`, nothing is, and future overrides get harder. For a single scoped fix like the alignment one, it is fine and often needed. ## What to check if your custom CSS is not working If you pasted a rule and nothing changed, run through these in order. One of them is almost always the cause. - **Wrong selector.** The class you targeted is not the one on the element. Re-check it in Inspect. Class names are case sensitive, so `Banner` and `banner` are different. - **The theme is winning.** Your rule is being overridden. Add `!important` to the property, or make the selector more specific. - **You edited the wrong section box.** Section CSS only affects that section. If you pasted it into a different section, it will not reach the element. - **You did not Save.** The theme editor needs an explicit Save. If the button stayed greyed out, click into the box, add a space, delete it, then Save. - **Browser cache.** You saved, but your phone or browser is showing the old version. Reload, or check in a private window. ## Common Shopify custom CSS snippets Once you know where the box is, a lot of small requests become one-liners. Here are a few that come up constantly. Always confirm the class names on your own theme with Inspect first. Hide an element on mobile only: ``` @media (max-width: 749px) { .your-element { display: none !important; } } ``` Center a heading: ``` .your-heading { text-align: center; } ``` Add space above a section: ``` .your-section { margin-top: 40px; } ``` Make a button full width: ``` .your-button { width: 100%; } ``` These are starting points, not copy-paste magic. Swap `.your-element` for the real class you find in Inspect, paste into the section box, and Save. ## Custom CSS vs editing theme code People often ask whether they should just edit the theme code instead. For small visual fixes, custom CSS is the better tool, and here is why. Editing theme code means opening the code editor and changing `.liquid` or `.css` files. It is powerful, but a theme update can overwrite your change, and a typo can break a template. Custom CSS in the section box survives normal theme edits and cannot break a template, because it is additive. Reach for theme code when you need new markup or logic that CSS cannot express. For spacing, alignment, colors, sizes, and visibility, custom CSS is faster and safer. ## The no-code alternative Before you write any CSS, it is worth checking the section's own settings. Many staggered or offset layouts, like the image box example, come from a toggle in the section itself. In that example, the Image banner had an image-offset option turned on. Turning it off aligns the boxes with no code at all. So the order to work in is: check the section settings first, and only add custom CSS if there is no setting for what you want. ## The short version - Custom CSS is a small block of your own styles that overrides the theme without touching theme files. - The best place for most fixes is the section's own Custom CSS box, at the bottom of its settings in the theme editor. - Use Inspect in Chrome to find the exact class and the value that is wrong. - Add `!important` only when a correct rule is being overridden. - Check the section's built-in settings first, since a toggle often does the job with no code. That is how to add custom CSS in Shopify safely. One scoped rule, pasted in the right box, fixed two misaligned image boxes in under a minute, and the same approach handles most of the small design problems a theme leaves behind. --- --- title: How to Create a Blog on Shopify (Beginner Guide) description: Yes, you can run a blog or content site on Shopify. Here is how to create a blog, add posts, turn categories into blogs, keep your old URLs, and get recipe rich results. Beginner steps with screenshots. --- ## The problem A merchant asked this on the Shopify Community, and it is a fair question if you only know Shopify as a store builder. They run a recipe site on custom code. They want to move it to Shopify for features they cannot build themselves. But everything they read says Shopify is for ecommerce. So they asked the obvious thing: can you actually make a blog site on Shopify, or is it stores only? The short answer is yes. Shopify has a full blog built in, and plenty of content and recipe sites run on it without a single product listed. Here is their live site. It is a clean recipe blog with posts and categories like Baking, Salads, Muffins, and Pastries. ![A custom-coded recipe site with posts and categories, the kind that moves to Shopify well](/images/blog/how-to-create-a-blog-on-shopify/01-recipe-site-before.png) That structure maps onto Shopify almost one to one. This guide walks through it, using a recipe site as the example, but the steps are the same for any blog. ## Yes, Shopify can be a blog or content site You do not need a plugin, an app, or a theme change to blog on Shopify. The blog is part of every plan. What you get out of the box: - Unlimited blog posts and multiple blogs - A clean editor with images, formatting, and video - Categories, tags, and an author for each post - A built-in SEO listing so each post has its own Google title and description - Fast hosting and good mobile performance without any setup The one thing to know upfront: in Shopify, the word "blog" does not mean the whole blog area. It means one category. Each blog holds a group of posts. You can have as many blogs as you want. More on that in step 3, because it trips up almost every beginner. ## How to create a blog on Shopify, step by step I set this up on a test store so the screenshots match what you will see. It took a few minutes. ### 1. Find the blog In your Shopify admin, go to **Content** in the left menu, then **Blog posts**. Every post you write lives here. There is nothing to install. It is already switched on. ![The Content > Blog posts screen, where every post lives, with Manage blogs and Add blog post at the top right](/images/blog/how-to-create-a-blog-on-shopify/02-blog-posts-list.png) The two buttons to remember are top right. **Add blog post** writes a new post. **Manage blogs** is where your categories live. ### 2. Write your first post Click **Add blog post**. You get a title field, a content box, and an image panel. - Type the title, for example "Easy Lemonade Scones". - Write the post in the content box. It handles headings, bold, links, lists, and images, so a recipe with ingredients and steps formats cleanly. - Add a **featured image**. This is the photo that shows on the blog and on the post card. - Fill in the **Excerpt**. This is the short summary that appears under the title on your blog index. ![The Add blog post editor with a title, recipe content, and the featured image panel](/images/blog/how-to-create-a-blog-on-shopify/03-add-blog-post.png) That is one recipe done. Everything else on this screen is optional polish. ### 3. Turn your categories into blogs This is the step people get stuck on, so read it slowly. In Shopify, each category is its own **blog**. A recipe site with Baking, Salads, and Pastries needs three blogs, one per category. On the post editor, look at the **Blog** menu on the right. Open it and choose **Create a new blog**. Name it after the category, for example Baking. Repeat for each category you need. ![The Blog menu on a post open, showing the Create a new blog option](/images/blog/how-to-create-a-blog-on-shopify/04-create-blog-category.png) For finer sorting inside a category, use **Tags**. On a Baking post you might tag "gluten-free" or "30-minute". Tags let visitors filter within a blog, while blogs are the top-level categories. Between blogs and tags you can build the full category and filter structure a recipe site needs. ### 4. Publish the post and set the SEO listing A new post starts hidden. To make it live, set **Visibility** to **Visible** and click **Save**. While you are on this screen, scroll to **Search engine listing** and fill it in. This is the exact title and description Google shows in results. Writing it yourself, instead of letting Shopify guess, is one of the easiest SEO wins there is. ![Visibility set to Visible and the Search engine listing preview filled in](/images/blog/how-to-create-a-blog-on-shopify/05-visible-seo-listing.png) Once it is Visible and saved, the post is live on your storefront at a URL like `/blogs/baking/easy-lemonade-scones`. ### 5. Add the blog to your menu A published post is not much use if readers cannot find it. Add the blog to your navigation. Go to **Content**, then **Menus**, then open your **Main menu**. Click **Add menu item**, name it something like "Recipes", and set the **Link** to **Blogs**. Pick the blog you want it to point at, or link a single blog per category. ![Adding a menu item and setting its link to a blog so visitors can find it](/images/blog/how-to-create-a-blog-on-shopify/06-add-blog-to-menu.png) Save, and your recipes now show in the top navigation, right where visitors expect them. ### 6. Keep your old URLs when you move over If you are moving from custom code or another platform, this step protects the traffic you already have. Go to **Content**, then **Menus**, then **URL redirects**. For each old address on your current site, add a redirect that points it at the matching new Shopify URL. Do this and visitors who click an old link, and Google's index, land on the right new page instead of a dead end. Your rankings carry over instead of resetting to zero. ## Blogs vs tags: how to organize a recipe site Because the naming is odd, here is the plain-English version. A **blog** is a category. Baking is a blog. Salads is a blog. Each one has its own page that lists the posts inside it. A **tag** is a label inside a category. "Vegan", "quick", and "kid-friendly" are tags. One post can carry several tags, and visitors use them to narrow a category down. A **post** is a single recipe. So the shape of a recipe site on Shopify is: a handful of blogs for your main categories, tags for the cross-cutting filters, and a post per recipe. That covers almost every content site, not just recipes. ## Moving from custom code or WordPress Two things make the move painless. **Bulk import.** You do not have to retype years of posts. You can import your existing posts and images in one batch, so the content moves over intact. **Redirects.** Covered in step 6. The reason it matters so much is that a content site's value is its existing Google rankings. Redirects hand that value to the new pages instead of throwing it away. If your current site is on WordPress, the same two ideas apply. Export the posts, import them into Shopify, then redirect the old permalinks. ## Recipe rich results: the stars and cook time in Google If you run a recipe site, you have seen the Google results with a photo, a star rating, a cook time, and a calorie count. That is recipe rich results, and it comes from structured data on the page. Shopify's plain blog does not output recipe structured data by default. To get it you have two routes: - A **recipe app** that adds a proper recipe card with ingredients, steps, and the schema behind them. - **Theme metafields** plus a small block of custom code, if you or a developer want to build it into the theme. For most recipe sites, an app is the faster path and gives you the printable card and the rich-result markup together. ## Shopify blog vs WordPress for a content site This is the question most people ask next, so here is the honest version. WordPress is more flexible for pure blogging, with a bigger plugin ecosystem aimed at content. If your entire business is content and you will never sell anything, WordPress is a reasonable pick. Shopify wins when you might sell later. You get a fast, hosted, secure site with a real blog now, and the option to add products, digital downloads, or ads without moving platforms again. For a recipe creator who might sell an ebook, a meal plan, or merch one day, that matters. Moving platforms twice is the expensive path. ## Shopify blog examples Plenty of brands run their blog on Shopify as a genuine content channel, not an afterthought. Recipe creators, coffee roasters, and skincare brands all use the built-in blog for guides, stories, and how-tos that pull in search traffic and feed their email lists. The blog is a first-class part of the platform, so there is no ceiling on treating it seriously. ## What to check if your blog is not showing If a post does not appear on your storefront, run through these in order. - **Visibility.** The post must be set to Visible, not Hidden. A saved but hidden post will not show. - **The right blog.** Confirm the post is in the blog you are looking at. A post in "News" will not appear on the "Baking" page. - **The menu link.** If visitors cannot find it, the blog is probably not in your navigation yet. See step 5. - **The URL.** Blog URLs follow the pattern `/blogs//`. If you linked the wrong handle, the page will not load. ## Blog, blog post, and page: the words Shopify uses Three terms get mixed up, so here they are side by side. A **blog** is a category that holds posts, like Baking. A **blog post** is one article inside a blog, like a single recipe. It is dated and shows in the blog feed. A **page** is a standalone, undated document like About or Contact. It is not part of any blog and does not appear in the feed. For a recipe site you will use blogs and blog posts for the recipes, and a few pages for About, Contact, and your policies. That is the whole picture. Shopify absolutely works as a blog or content site, the blog is built in on every plan, and a recipe site with categories and tags fits it naturally. --- --- title: How to Import Reviews to Shopify for Free description: You can import a supplier or manufacturer's existing product reviews into Shopify for free, label them honestly, and keep them apart from your own. Here is the exact route, plus the Google-stars problem most guides skip. --- ## The problem A merchant asked this on the Shopify Community. They sell a lot of products through Shopify Collective and dropshipping. In many cases the manufacturer already has hundreds of real reviews for the exact same product, while that product starts at zero reviews on their own store. They wanted an app that could pull those reviews over, label them clearly as coming from the manufacturer, and keep them separate from reviews left by their own customers. Ideally for free. It is a fair thing to want. A product page with zero reviews converts worse than the same page with fifty. When the reviews already exist and are genuine, starting from zero feels like throwing away social proof you are entitled to use. So here is how to import reviews to Shopify the honest way, what is free, and the one catch that can get your store in trouble with Google before you notice. ## The short answer first Two things are true, and you need both before you start. - You can import existing reviews into Shopify for free. A CSV import into a review app does it, and it does not cost anything on the plans most stores already have. - No app can safely and reliably keep scraping a manufacturer's website and syncing new reviews forever. That part does not really exist, and the tools that claim it are fragile. So the realistic setup is a one-time import you control, not a live feed. Once you accept that, the rest is straightforward. ## Decide two things before you pick a tool I see people install three apps and give up before they answer these. Answer them first. **One-time import or ongoing sync?** Most review apps import a structured file just fine. Almost none can safely watch a supplier's own site and pull new reviews on a schedule. If you truly need ongoing sync, that is a custom job, not an off-the-shelf app. For most stores, a one-time import of the reviews that exist today is enough. **Should the imported reviews feed your star rating?** This is the one almost every guide skips, and it matters more than which app you choose. More on it below, but decide early, because it changes the whole approach. ![How importing manufacturer reviews into Shopify actually works, as a flow](/images/blog/how-to-import-reviews-to-shopify/01-import-reviews-flow.png) ## The free way to import reviews into Shopify Most stores already run a review app. When I looked at the merchant who asked this, their store was already on Judge.me. So the first move is usually not installing anything new. It is using the importer in the app you already have. Judge.me is the common one, it has a generous free plan, and its Import Wizard is included. The steps are the same idea in Loox, Yotpo, or Stamped if you use one of those instead. Here is the flow in Judge.me: - Open the app and go to the import area, then choose Import Wizard. - Upload your file. CSV is safest. Judge.me also accepts .xls and .xlsx, up to 100 MB per file. - Map the columns. You match the headers in your file to Judge.me's fields using dropdowns: rating, review title, review body, reviewer name, date, and photo URLs. - Confirm and import. One rule trips up most imports: you cannot import a review that is only a star rating. Every row needs review text in the body, or that row is skipped. So a bare "4 stars, no comment" export will not come through. ![Mapping a CSV of supplier reviews to Judge.me's review fields](/images/blog/how-to-import-reviews-to-shopify/02-csv-to-judgeme-mapping.png) ## Getting the reviews out of the manufacturer's site The import is the easy half. The reviews have to come from somewhere first, and this is where you protect yourself. Do not scrape. Ask instead. Contact the manufacturer or supplier and ask two questions: - Which review platform do you use? - Can you send an authorized export of the reviews for the products we carry? Most review platforms can export a CSV. If the supplier is on Yotpo, Okendo, Stamped, or similar, that export is a normal thing for them to hand over. You then map that file in the step above. If they say no, stop there. A scraper that copies reviews from a site without permission raises consent and terms questions, even when the product is identical to yours. It also breaks the moment they redesign their page. An authorized export is the only version of this that is safe and stable. ## If the same product is also on AliExpress, Amazon, or eBay This is the common dropshipping case, and it has better tooling. If the exact item is also listed on a marketplace, you can import those reviews by product URL. - Opinew imports reviews from Amazon, AliExpress, and eBay, and it fits dropshipping stores well. - Ryviu imports from AliExpress, Amazon, Etsy, and a few others. Its free tier covers AliExpress through a browser extension, with paid tiers for the rest. The limit is important: these tools pull from those marketplaces, not from a manufacturer's own custom website. So they solve the AliExpress-reviews-to-Shopify case cleanly, and they do nothing for a supplier who only sells on their own site. For that supplier, you are back to the authorized CSV route above. ## Label them honestly, and keep them separate The merchant who asked this was clear that they did not want to pass manufacturer reviews off as their own. Good. Here is how to disclose the source and keep the two sets distinct. There is no built-in "sourced from manufacturer" badge in Judge.me. So you create the label yourself, two easy ways: - Put the source in the reviewer name column of your CSV, like "Jane D. (via BrandName)". It then shows on every imported review. - Or add a short first line to each review body, like "Originally posted on BrandName's site." Keeping them separate is partly automatic. Reviews you import by CSV do not get Judge.me's "Verified buyer" badge, because there is no order behind them. Reviews your own customers leave after buying do get it. So your real reviews carry a badge the imported ones never will, which is a clean visual line between the two. That verified-badge difference only holds for CSV imports. Migrations straight from Loox, Yotpo, or Stamped can carry verification across, so if you go that route, the line blurs. ## The Google-stars problem almost every guide skips This is the part worth reading twice. Most Shopify review apps write the star rating that shows up in Google search results, the little row of stars under a product. The app builds that number from every published review in its database. That includes the manufacturer reviews you just imported. So the moment you import them, syndicated reviews become part of your store's Google star rating. That is a different and bigger claim than a labeled line on the page saying where a review came from. And Judge.me, like most apps, cannot exclude just one source from that rating. It is all reviews or none. ![Imported manufacturer reviews get folded into your storefront's Google star rating](/images/blog/how-to-import-reviews-to-shopify/03-syndicated-reviews-google-stars.png) Decide whether you are comfortable with that. If you are, importing into your review app is fine. If you are not, do not put the manufacturer reviews in the review app at all. Use the no-app method below instead, which keeps them off your star rating entirely. ## The no-app alternative If you want the social proof without touching your star rating or any app, there is a clean version. - Create a product metafield that holds a short summary of what buyers said on the manufacturer's site. - Show it on the product page as a labeled, collapsible row, something like "What buyers said on BrandName." You lose star sorting and filtering, and you lose the review count. But you keep the social proof, there is nothing to sync or scrape, and it never touches the star rating Google reads. For a store that cares about staying clean on the rich-snippet side, this is often the better trade. ## What to check if the import did not work If you ran the import and the reviews did not show up, work through these. - **Rows with no text.** Rating-only rows are skipped. Every review needs body text. - **Product mapping.** The file has to point each review at the right product, usually by handle or by SKU. A wrong or blank product column sends reviews nowhere. - **Date format.** If dates come in blank or wrong, the column mapping missed the date field, or the format is one the importer did not read. - **Widget not placed.** The reviews imported fine but your theme is not showing the reviews widget on the product page. That is a theme placement issue, not an import one. - **Still processing.** Large imports take a few minutes. Give it time before assuming it failed. ## Quick answers to related questions **Can you import AliExpress reviews to Shopify for free?** Yes, with limits. Ryviu's free tier imports AliExpress reviews through a browser extension. Opinew also imports from AliExpress. Both pull from the marketplace listing, not from a supplier's own website. **Does Judge.me import reviews for free?** Yes. The Import Wizard and CSV import are available on the free plan. You map your file's columns to Judge.me's fields. Reviews need body text, not just a star rating. **Can you automatically sync a supplier's reviews?** Not reliably from a custom supplier website. Marketplace importers can refresh reviews from Amazon or AliExpress listings, but there is no safe, off-the-shelf way to keep syncing a manufacturer's own site. Treat it as a one-time import. **Will imported reviews hurt my SEO?** Not by themselves, but they do get folded into the star rating Google shows, so they change what that rating represents. If that concerns you, keep them out of the review app and use the metafield method. ## The short version - You can import existing manufacturer or supplier reviews into Shopify for free with a CSV import into a review app like Judge.me. The Import Wizard is on the free plan. - Get the reviews as an authorized export from the supplier. Do not scrape, it is fragile and raises consent issues. - If the item is also on AliExpress, Amazon, or eBay, Opinew or Ryviu can import from those listings by URL. - Label the source in the reviewer name or the review body. Imported reviews stay unverified, which keeps them visually distinct from your own. - Watch the Google stars. Imported reviews join your storefront's star rating, and most apps cannot exclude them. If that matters, use a labeled metafield block instead of the review app. That is the whole picture. The import itself is free and takes minutes. The care goes into where the reviews come from, how you label them, and whether you want them counting toward the stars Google shows. --- --- title: "How to Make a Product Pickup Only on Shopify" description: "Some products should never be shipped, only picked up in store. Shopify has no product-level 'no shipping' checkbox, but you can get the same result with one custom shipping profile. Here is the exact setup, what the customer sees at checkout, and the one catch with mixed carts. Tested with screenshots." --- ## The problem A merchant asked this on the Shopify Community: they wanted to mark certain products as in-store pickup only, so those items can be bought on the storefront but can never be added to a shippable order. Think of a florist's fresh bouquets, a bakery's cakes, a heavy item, or anything too fragile or too local to post. They were looking for a simple switch on the product page. Something like a "no shipping" checkbox you tick per product. Shopify does not have that checkbox. There is no product-level control that says "this item is pickup only." But you can get exactly that behaviour with one setting change, and it takes about five minutes. I built it on a test store and ran real checkouts through it, so this is what actually happens, not just the theory. ## Why there is no "no shipping" checkbox Here is the part that trips people up, and it is worth understanding before you touch anything. In Shopify, shipping is not set on the product. It is set on a shipping profile. A shipping profile is a group of products plus the shipping rates that apply to them. Every store starts with one profile, called the General profile, and by default every product lives in it. So a product does not carry its own "can this ship" flag. It inherits shipping from whatever profile it sits in. That is why there is no per-product switch: the setting lives one level up, on the profile. Once you see it that way, the fix is obvious. You make a second profile that has no shipping rates at all, and you move your pickup-only products into it. A product in a profile with no rates cannot be shipped anywhere, because there is no rate for the checkout to charge. If local pickup is switched on, that product can still be bought, just for pickup only. That is the whole idea. Now here are the steps. ## Step 1: Turn on Pickup in store Local pickup has to be on first, otherwise your pickup-only products cannot be bought at all. - Go to Settings, then Shipping and delivery. - Scroll to Pickup in store and open it. - Choose the location customers will collect from, turn pickup on, and Save. ![Pickup in store enabled for the store location](/images/blog/how-to-make-product-pickup-only-shopify/01-pickup-in-store-enabled.png) Make sure the pickup location is the store where customers actually collect, and that it has a real address. On my test store, a location with no street address did not show up as a pickup option at checkout, so fill the address in. ## Step 2: Create a shipping profile with no rates This is the part that replaces the missing checkbox. - In Settings, then Shipping and delivery, find Shipping profiles. - Click Add custom profile. - Give it a name only you will see, for example "Pickup only". - Add your pickup-only products to it. - Do not add any shipping rates. Leave that section empty. - Save. ![Add a custom profile in Shipping and delivery](/images/blog/how-to-make-product-pickup-only-shopify/02-add-custom-shipping-profile.png) When you save, Shopify shows a yellow "No shipping rates" warning that says customers will not be able to complete checkout for products in this profile. On a normal profile that warning is a problem. Here it is exactly what you want. No rates is the point. It is what stops these products from ever being shipped. ![Custom profile with No shipping rates and one product](/images/blog/how-to-make-product-pickup-only-shopify/03-profile-no-shipping-rates.png) That is the closest thing to a per-product "no shipping" switch that Shopify has today. The products in this profile can now only be bought for pickup. ## What the customer sees I added a pickup-only product to a cart and went to checkout. The Delivery section did not offer shipping at all. It only offered Pickup in store, at the location I turned on, for free. ![Checkout shows only Pickup in store, with no shipping option](/images/blog/how-to-make-product-pickup-only-shopify/04-checkout-pickup-only.png) So a cart that contains only pickup-only items behaves perfectly. There is no shipping method, no address form for delivery, just the pickup location. The customer picks it up, exactly as intended. ## The one catch: mixed carts This is the part every short answer skips, and it is the thing most likely to confuse your customers, so test it yourself. What happens when a shopper puts a pickup-only item and a normal shippable item in the same cart? I tried it. With the delivery method set to Ship, checkout showed "Shipping not available" for the whole order. It could not ship, because one of the items has no shipping rate, and Shopify will not ship part of an order and hold the rest for pickup. ![Mixed cart set to Ship shows Shipping not available](/images/blog/how-to-make-product-pickup-only-shopify/05-mixed-cart-shipping-not-available.png) I checked this with split shipping turned on, which is the newer Shopify setting that can split an order across locations. It did not change the outcome. Split shipping splits shipments across your locations, but it will not turn one order into "ship this item and pick up that one." There is a way through, though. If the shopper switches the delivery method to Pickup, the whole order goes through, as long as your shippable items are also in stock at the pickup location. ![Mixed cart set to Pickup goes through for the whole order](/images/blog/how-to-make-product-pickup-only-shopify/06-mixed-cart-pickup-works.png) So the practical guidance is simple. Add a short line to your pickup-only product pages so no shopper gets stuck: "In-store pickup only. Please order pickup items separately from shipped items." That one sentence saves a lot of confused checkout attempts. ## How do I set up local pickup on Shopify? If you have never used it, local pickup is a built-in Shopify feature, free on every plan. You turn it on per location under Settings, then Shipping and delivery, then Pickup in store. You pick which of your locations offer collection, set how long orders usually take to be ready, and write a short "ready for pickup" message. Once it is on, pickup appears as a delivery choice at checkout for products that are in stock at a pickup location. For a store that only does pickup, that is all you need. For a store that ships most things but wants a few items to be pickup only, you combine it with the no-rates profile above. ## Can I turn off shipping for just one product? Not with a single toggle on the product, no. The no-rates profile is how you do it. Add that one product to a custom profile with no shipping rates, and it becomes pickup only while every other product keeps shipping as normal. The reason is the same one from earlier. Shipping is a profile setting, not a product setting. So "turn off shipping for one product" really means "put that one product in a profile that has no shipping." ## Can a customer pick up one item and ship another in the same order? No, not in a single order. This surprises people, so it is worth saying plainly. A Shopify order has one delivery method for the whole order. It is either shipped or picked up, not a mix. That is why a mixed cart forces the choice. The customer either picks up everything, or they place two separate orders, one for the pickup items and one for the shipped items. There is no native way to split a single order into part-ship and part-pickup. ## Do I need an app for pickup only? For the setup above, no. It is all native Shopify settings and costs nothing. You only need an app if you want more than "pickup only." Two common reasons: First, a hard block. The setup above stops pickup-only items from being shipped, but it does not stop a customer from adding a pickup-only item to a cart that also has shippable items and then hitting the "Shipping not available" wall. If you want to actively prevent that combination, that needs a checkout validation. You can do it for free with a Shopify Function, which a developer sets up once with no monthly fee, or with a cart and checkout validation app. Second, pickup scheduling. If you want customers to choose a pickup date and time slot, that is not native. Apps like Zapiet - Pickup + Delivery or Store Pickup + Delivery (Amai) add date and time pickers and are popular with florists, bakeries, and food shops. ## What to check if it did not work - **The pickup-only product cannot be bought at all.** Check that Pickup in store is turned on for a location, and that the product is in stock at that location. A product with no rates and no pickup has no way to be sold. - **Pickup does not appear at checkout.** The pickup location needs a real, complete address. A location with only a country and no street will not show as a pickup point. - **The product still shows a shipping option.** Confirm the product is actually inside the no-rates profile, not still in the General profile. A product can only be in one profile at a time. - **A mixed cart shows "Shipping not available."** That is expected. Tell the customer to choose Pickup, or to order the pickup item separately. Add the note to the product page. - **The product is hidden from the storefront.** Making it pickup only does not unpublish it. If it is missing, check that it is published to the Online Store channel and set to Active. ## Shipping profile, local pickup, local delivery: the words that get mixed up These three get confused, and the confusion is behind most pickup questions. A **shipping profile** is a group of products plus their shipping rates. It decides how, and whether, products get shipped. A profile with no rates is what makes a product pickup only. **Local pickup** is the customer collecting the order from your store or location themselves. There is no delivery. It is free to the customer unless you set it otherwise. **Local delivery** is you, or a driver, dropping the order at the customer's address within a set radius. It is a delivery, just not a courier. It is a separate setting from pickup, with its own rates and zones. Once those three line up, pickup-only products stop feeling like a missing feature. You are not looking for a checkbox that does not exist. You are putting the product in a profile with no rates, turning on pickup, and letting checkout do the rest. --- --- title: Is t.shopifyemail.com or shopifyemail.com Legit or a Scam? description: Yes, t.shopifyemail.com and g.shopifyemail.com belong to Shopify, and the store+ number identifies the shop. Three checks verify who sent the email. --- ## The problem You bought something. The confirmation landed in your inbox. Then you looked at the sender and it said something like this: ``` store+86183936294@t.shopifyemail.com ``` No shop name. No brand. A random-looking number bolted onto the word "store". It looks exactly like the kind of address a scammer would generate. A buyer posted almost that exact question on the Shopify Community in July 2026, and the same question shows up there several times a month in English, French, German ("ist t.shopifyemail.com seriös?") and Italian. So it is worth answering properly rather than with "yes it is fine". ## Is t.shopifyemail.com or g.shopifyemail.com a scam? The addresses themselves are not a scam: both belong to Shopify. When a store has not set up email on its own domain, Shopify sends that store's emails from `shopifyemail.com` instead. Its Help Center says the sender email is "rewritten to store+123@shopifyemail.com" and that "the string of numbers (123) ... is unique to your store". The `t.` and `g.` versions are subdomains of that same Shopify domain. The word `store` at the start is the same for every shop. Searches for `store@t.shopifyemail.com` or `store@g.shopifyemail.com` are usually about an address like `store+86183936294@t.shopifyemail.com`, and the digits after the plus sign are what tell one shop from another. Shopify's Help Center and developer docs do not say what `t.` and `g.` are each used for. The public DNS records (the internet's address book, which anyone can query) showed this on 14 October 2026: - `t.shopifyemail.com` and `g.shopifyemail.com` are subdomains of `shopifyemail.com`, which the domain registry lists as registered to Shopify Inc., and opening either one in a browser redirects to shopify.com. - Both have a `mailer.` subdomain wired to the same SendGrid mail server (SendGrid is an email delivery service) as `mailer.shopifyemail.com`, the "mailed-by" name in the Gmail screenshot further down. - `shopifyemail.com` publishes a DMARC policy of `p=reject`, and neither subdomain has a policy of its own, so the same rule covers them. DMARC is a public request to receiving mail servers: here it asks them to refuse mail that shows these addresses in the From line but cannot prove Shopify allowed it to be sent. Shopify also runs a marketing email app called Shopify Email. Its Help Center says that if a store has not authenticated its own domain, "Shopify sends your emails from a fully authenticated shopifyemail.com subdomain". So a shop's newsletter can also come from a shopifyemail.com address, not only its order emails. So the address is not the scam. The two open questions are whether the email really came through Shopify, and whether the shop behind it will deliver. A fake email can type any address into the From line, and a real Shopify email can come from a shop that never ships. The three checks below answer both: the first two prove the email came from the shop you paid, and the third shows who runs that shop. ## What that address actually is Every Shopify store has a sender email set under Settings, then Notifications. The merchant types in the address they want customer emails to come from. The catch is that Gmail, Yahoo, Outlook and other free providers publish DMARC policies that forbid other services from sending as them. Shopify cannot send as `someshop@gmail.com` without those emails landing in spam. So it does not try. Instead it substitutes its own address and puts the merchant's real one in the reply-to field. Shopify says so directly in the admin: ![The Shopify admin explaining that customers will see store+number@shopifyemail.com as the sender](/images/blog/is-shopifyemail-com-legit/01-shopify-sender-email-setting.jpeg) "Public domains like Gmail don't support custom sending. Customers will see your email as store+68540465329@shopifyemail.com." That is a screenshot of my own test store's admin. Which brings us to the interesting part. ## Those digits are the store's Shopify shop ID The number is not random and it is not a tracking code. It is the store's Shopify shop ID, the internal numeric ID Shopify assigns to every shop. I verified this rather than assuming it. I sent myself an order confirmation from a store I control. The sender was: ``` store+68540465329@t.shopifyemail.com ``` That store's shop ID is 68540465329. Every Shopify storefront prints its own shop ID in the page source, inside the analytics config, as `"shopId":68540465329`. Then I checked it against a store I have nothing to do with. Back in 2025 someone on the Shopify Community posted about an order email from `store+61122347259@t.shopifyemail.com` and named the shop it came from. I pulled that shop's homepage today. Its page source reads `"shopId":61122347259`. Same number, an unrelated store, a year apart. So the digits identify the exact Shopify account that sent the mail. That is a lot more useful than "the domain is legit". ## How to prove the email came from the shop you paid You do not need to view page source for this. Your own email already contains the second copy of the number. Open the confirmation and look at where the "View your order" button points. Do not click it yet, just hover it or long-press to copy the link. A real Shopify order status URL looks like this: ``` https://theshop.com/68540465329/orders//authenticate?key= ``` That first path segment is the shop ID again. So you have two things to compare, both sitting in the same email: 1. The digits in the sender address. 2. The digits at the start of the order status link. They must match. And the domain in that link must be the site you actually typed your card into. If someone builds a convincing fake order email, getting both of those to line up with a real store is not something they can fake casually. If the numbers disagree, or the link goes to a domain you have never seen, treat the email as hostile and do not click anything in it. ## The From line can be faked. The signature cannot. This is the check the reassuring forum answers usually skip, and it is the one that actually decides the question. Anyone can put `store+86183936294@t.shopifyemail.com` in the From header. The From header is just text. It is not authenticated by anything on its own. What cannot be forged is the DKIM signature. DKIM signs the message with a private key held by the sending service, and the receiving mail server checks it against a public key published in DNS. No key, no pass. In Gmail: open the email, click the three-dot menu, choose **Show original**. You get this. ![Gmail Show original showing SPF PASS, DKIM PASS with domain shopifyemail.com, and DMARC PASS](/images/blog/is-shopifyemail-com-legit/02-show-original-spf-dkim-dmarc.png) That is the real order confirmation from my test store. The three lines that matter: - **SPF: PASS** means the server that sent it is allowed to send for that domain. - **DKIM: 'PASS' with domain shopifyemail.com** means the message carries a valid signature from Shopify's email infrastructure. - **DMARC: PASS** means the authenticated domain lines up with the visible From address. A phishing copy that simply types the same address into the From line fails DKIM. It cannot do anything else, because it does not have Shopify's signing key. On Outlook the equivalent is View, then View message source, and you look for the `Authentication-Results` header. On Apple Mail it is View, Message, All Headers. If DKIM fails or is missing on an email claiming to be an order confirmation, stop there. ## Find out who the merchant actually is The third check takes about five seconds and tells you something the shop's own website often hides. In Gmail, click the small arrow under the sender name. The details panel opens: ![The Gmail details panel showing reply-to, mailed-by and Signed by for a Shopify order email](/images/blog/is-shopifyemail-com-legit/03-gmail-reply-to-details.png) Note the `reply-to` line. Because Shopify had to replace the sender address, it puts the merchant's real address there instead. So this line reveals the human behind the shop. That matters. In a long Shopify Community thread from 2024, someone posted an order confirmation from `store+57924911166@t.shopifyemail.com` asking whether it was a scam. The reply-to on that email was `fastingfast2@gmail.com`, and the body invited them to contact the same free Gmail address. The shopifyemail.com domain was not the red flag in that thread. The reply-to was. A real brand with a warehouse and a support team almost always has support@ their own domain. A dropshipper who spun up a store last Tuesday has a Gmail. Neither is proof by itself, but combined with the rest it tells you a lot. ## What the address does not prove All three checks have a limit. They prove the email is real. They prove which Shopify account sent it. They prove nothing about whether the parcel will arrive. Shopify is a platform. It does not vet merchants, it does not vouch for them, and having a Shopify checkout is not a quality signal. Anyone with a card and 20 minutes can open a store. The Shopify Community has plenty of threads where all of this was true and the buyer still got nothing. One person in 2025 posted about a real, well-known consumer electronics brand and received an empty box. Another posted about a store that later went offline completely. In a French thread from July 2026, a buyer was charged three times for one order. So the email being real and the shop being trustworthy are two separate questions. Answer the first with the checks above. Answer the second with the ones below. ## Checking the shop itself Once you know which Shopify account sent the email, you can do something useful with it. **Compare it to the official store.** In the thread that prompted this article, the buyer had ordered a band's new album from a French site. The band's own store is on Shopify and its shop ID is 73158885695. The label's European shop is a different Shopify store with ID 22808743. The buyer's email said 86183936294, which is neither. That does not make the shop a scam, but it does mean the band's own customer service cannot help, and it is worth knowing before you wait six weeks. **Check the domain age.** Look the domain up on a WHOIS service. A store registered three weeks ago running heavy ads on a hyped product is the single most common pattern in these threads. **Check the legal page.** In the EU this is not optional. A French site must publish mentions légales with a company name, address and SIREN number. You can put that SIREN into the French government's own company directory at annuaire-entreprises.data.gouv.fr and see whether the company exists. No legal page, or a number that returns nothing, and you have your answer. **Look for a real phone number and a physical address.** Then search the brand name plus the word "reviews" and skip the first page of results, which is usually affiliate content. ## Why your own store's emails say shopifyemail.com If you found this page as a merchant rather than a buyer, the fix is straightforward and worth doing. Go to Settings, then Notifications, then Sender email, the field in the screenshot near the top. Enter an address on a domain you own, such as `orders@yourbrand.com`. Shopify will then ask you to authenticate the domain by adding CNAME records at your DNS provider. Once those records verify, your customer emails go out from your own address instead of `store+@shopifyemail.com`. If you bought your domain through Shopify, the records are added for you. This is worth ten minutes of your time. Every thread linked in this article exists because a customer could not tell whether an order email was real. A branded sender address removes that doubt, and it measurably helps deliverability too, since receiving servers trust a consistent authenticated domain more than a shared one. Note that the reply-to substitution goes away as well, so support replies land where you expect them. If you are changing what the email says as well, see [how to edit the Shopify order confirmation email](/blog/shopify-edit-order-confirmation-email). ## The lookalike problem One last thing, because it is where people actually get caught. `shopifyemail.com`, `t.shopifyemail.com` and `g.shopifyemail.com` are Shopify's real domains. `mailer.shopifyemail.com` appears as the "mailed-by" value and is also real. What is not real is any of the near misses. Look carefully at the characters. A domain like `shopify-email.com`, `shopifyemails.com` or `t-shopifyemail.com` is not where Shopify sends store emails from. Phishing kits lean on exactly this, because the eye reads the shape of a word rather than its letters. This is also why the DKIM check beats reading the address. You are not asked to judge a string of characters at a glance. The mail server does the comparison for you and prints the answer. Real Shopify emails about your Shopify account, as opposed to a store's order emails, come from `shopify.com` addresses. Shopify will never ask for your password by email. ## Quick checklist If you are staring at one of these emails right now: 1. Open Show original. Confirm DKIM says PASS with domain shopifyemail.com. 2. Compare the digits in the sender address to the digits at the start of the order status link. 3. Confirm that link's domain is the site you actually bought from. 4. Check the reply-to address in the details panel and judge it. 5. Look up the shop's domain age and its legal or contact page. 6. Keep the confirmation and the invoice. If the parcel never turns up, the confirmation email is your evidence. Card issuers accept "goods not received" disputes, commonly up to 120 days from the date delivery was expected, and PayPal's buyer protection window is 180 days. Check your own provider's terms, because the windows vary. Shopify will not refund you, since it is not the seller. It does take reports about merchants at its report an issue page, which is worth filing so the store gets looked at. Three checks, about a minute, and you will know a great deal more than "the domain looks weird". --- --- title: How to Make Shopify Banner and Slideshow Images Clickable description: Shopify only makes the button on a banner clickable, not the image. Here are two tested ways to fix that, for Horizon and for Dawn, plus the CSS rules that defeat the usual advice with no error to explain it. --- ## The problem: your banner looks clickable, but only the button is You upload a hero image to your Shopify homepage. It fills the screen. It looks like a giant button. Then a customer clicks the middle of it and nothing happens. Only the small **Shop now** button actually goes anywhere. The image around it is decoration. A merchant asked about exactly this on the Shopify Community. They wanted their slide images to link to a page on their site and could not find the setting. There is no setting. That is the whole problem. I reproduced it on a test store and worked out two fixes. One takes about thirty seconds and no code. The other makes the entire image clickable and needs one small theme edit. I also hit two things that break the usual advice you will find in other threads. Both are covered below, because if you do not know about them the code looks correct and simply does nothing. ## Why Shopify does not ship this This is a deliberate choice, not an oversight. Shopify's banner and slideshow sections give you a **Button** block with a link field. They do not give you a link field for the image itself. The reasoning is accessibility. A screen reader announcing a link needs text to read out. A button labelled "Shop winter coats" is meaningful. A giant image wrapped in an empty link announces as "link" with nothing after it, which is useless to anyone not looking at the screen. So the default is the accessible option. That is defensible. But it is also true that customers click images. If your banner reads like a call to action, people will click the picture, not hunt for the button. Making the image clickable is a real conversion improvement, as long as you keep an accessible label on the link. Both methods below do that. ## First, check which section you actually have This matters, because the fix differs and people mix these up constantly. Open **Online Store > Themes > Customize** and click the section on your homepage. The panel on the left names it: ![The theme editor section list naming the Image banner section](/images/blog/make-shopify-banner-slideshow-clickable/11-customize-section-list.png) - **Image banner** is one static image. One picture, no arrows, no rotation. - **Slideshow** rotates through several slides. Each slide is a separate block inside it. They are different sections with different files. If you follow slideshow instructions on an image banner, nothing will happen and you will assume the code is wrong. The rest of this guide covers both. ## If you already tried this and the image got huge This is the most common failed attempt, and it looks nothing like a CSS problem. You find an older snippet that says to wrap the banner image in a link, like this: ```liquid {{ section.settings.image | image_url: width: 3840 | image_tag }} ``` You save it. The link works. The image is now enormous, the crop is wrong, and the banner no longer fills its row. Nothing is broken in your code. The theme sizes that image with a **direct child** rule in `base.css`: ```css .media > *:not(.zoom):not(.deferred-media__poster-button) { display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; } ``` `>` means direct child only. Slipping an `` in between makes the link the direct child instead of the image. The link gets the absolute full-size treatment, and the image inside it falls back to its own pixel dimensions. On a Craft test store I measured it: the banner photo went from 560px tall to 1233px, its natural height, the moment the wrapper went in. ![A Craft image banner after the image was wrapped in a link, no longer filling the row](/images/blog/make-shopify-banner-slideshow-clickable/07-craft-banner-image-blown-up.jpeg) The fix is not to force the size back with more CSS. It is to stop wrapping the image at all. Every method below puts a separate link **over** the image and leaves the image markup untouched, so the theme keeps sizing it. ## Method 1: add a button block to the slide (no code) Do this one first. It works on every modern theme, it survives theme updates, and it takes under a minute. The trade-off is that the button is clickable, not the whole image. **Step 1.** Go to **Online Store > Themes**, then **Customize**. **Step 2.** In the left panel click **Slideshow**, then click an individual **Slide**. **Step 3.** Click **Add block**, then choose **Button**. ![Click your Slide, then Add block, then Button](/images/blog/make-shopify-banner-slideshow-clickable/01-add-button-block-to-slide.jpeg) **Step 4.** Click the new **Button** and paste the page you want into the **Link** box. **Step 5.** Click **Save**. ![Paste your page into the Link box](/images/blog/make-shopify-banner-slideshow-clickable/02-paste-page-into-link-box.jpeg) That is it. If a visible button is acceptable, stop here. Nothing below is necessary, and this method cannot break when your theme updates. ## Method 2: make the whole image clickable (one code edit) If you want the entire image to be a link, you need to add a stretched, empty link on top of it. The idea is simple. You place an `` element over the image, size it to cover the whole slide, and let the existing button sit above it so both still work. The execution is where people get stuck, because two separate CSS rules in the free themes defeat it, with nothing on screen to say why. Both are covered under [the two rules that break this on Dawn](#the-two-rules-that-break-this-on-dawn-with-no-error), and the code below already handles them. ### Back up your theme first Non-negotiable. You are editing a theme file. Go to **Online Store > Themes**, click the **...** button on your theme, and choose **Duplicate**. That copy is your rollback. Then open the **...** menu again and click **Edit code**. ![Duplicate first, then Edit code](/images/blog/make-shopify-banner-slideshow-clickable/03-duplicate-then-edit-code.png) ### On the Horizon theme Horizon builds slides from a block file rather than a section file. In the file list on the left, open the **blocks** folder and click **_slide.liquid**. That is one of the files your theme is built from, written in Liquid, the templating language Shopify themes use. ![Open blocks then _slide.liquid](/images/blog/make-shopify-banner-slideshow-clickable/04-open-blocks-slide-liquid.jpeg) First, give the customizer a link field. Find `"id": "video_1"`. Scroll down a few lines to the `},` that closes it, and paste this on the next line: ```json { "type": "url", "id": "slide_link", "label": "Slide link" }, ``` Next, add the link itself. Find `{% content_for 'blocks' %}`. Below it are two `

` lines, then a line saying `{% endcapture %}`. Paste this in between: ```liquid {%- if block_settings.slide_link != blank -%} {%- endif -%} ``` Then the styling. Find `{% stylesheet %}` and paste this right below it: ```css .slide__link { position: absolute; inset: 0; z-index: var(--layer-flat); } slideshow-slide:has(.slide__link) .slide__content { pointer-events: none; z-index: var(--layer-raised); } slideshow-slide:has(.slide__link) .slide__content :is(a, button, summary, label, input) { pointer-events: auto; } slideshow-slide[aria-hidden='true'] .slide__link { pointer-events: none; } ``` Click **Save**. Go back to **Customize** and click a **Slide**. There is now a **Slide link** box. Pick your page and save. ![The new Slide link box in the customizer](/images/blog/make-shopify-banner-slideshow-clickable/05-slide-link-box-in-customizer.jpeg) The whole image is clickable now. ![The whole slide is clickable](/images/blog/make-shopify-banner-slideshow-clickable/06-whole-slide-clickable.jpeg) That last rule matters more than it looks. A slideshow keeps its off-screen slides in the DOM. Without `slideshow-slide[aria-hidden='true'] .slide__link { pointer-events: none; }` a hidden slide's link can sit over the visible one and send people to the wrong page. ### On the Dawn theme Dawn is the theme most people are actually on, and it is easier, because **you do not need to add a link field at all.** Dawn's slide block already has a `url` setting. It is the one powering the button. You can reuse it, which means one edit instead of two. For the **Slideshow** section, open `sections/slideshow.liquid`. Find the `

` that closes `slideshow__media`, and add the link right after it: ```liquid {%- if block.settings.link != blank -%} {%- endif -%} ``` For the **Image banner** section, open `sections/image-banner.liquid`. The banner's link lives on a `buttons` block rather than on the section, so you have to look it up first. Paste this just above the `