Every content source (like your Shopify blog or CMS like Contentful and Contentstack) is different but the same principles apply when adding content aside of products to an eCommerce search:
- The content source is accessed (e.g. “get all content items”, “notify me when a blog post is created” or “notify me when a page is updated”). 
- The content fields are cleaned and mapped to the search provider’s data structure. 
- The mapped data is sent to the index via an API of the search provider. 
No-code and low-code tools like Zapier, Make or n8n enable non-developers to build automations within only a few minutes. You can follow this tutorial and have your first automated workflow set up within 30-60 minutes.
Prerequisites
- Zapier, Make.com or n8n account (or any other tool) 
- Permission to connect apps with your Shopify store 
- Your Shopify URL, e.g. https://your-storename.myshopify.com 
- Minimal technical understanding 
- Nosto API_APPS token 
You can create an account in minutes and request a Nosto API token from the Nosto team.
Zapier Workflow Templates
If you are on a Zapier “Team” or “Enterprise” account, you can import the workflows from our tutorials using the following .json files. Please make sure to go through the workflow and update all fields accordingly.
1. Create an “Utility” Workflow
Your content will likely have characters like HTML formatting that is not needed in the search index. We want to remove these unnecessary characters to make your search results more relevant and increase performance.
- Create a new workflow (or “Zap” in Zapier terms) and call it “Util: Strip HTML and newlines”. 
- Select “Sub-Zap” as trigger, name it “Receive HTML” and set the trigger event to “Start a Sub-Zap”. 
- Add a new “Input / Argument List” and call it “html”. 
- Create a new action with the “Formatter by Zapier” app, name it “Strip HTML tags”, configure the “Transform” action as “Remove HTML tags” and select the “html” field from the trigger as “input”. 
- Create a new action with the “Formatter by Zapier” app, name it “Remove newlines”, configure the “Transform” action as “Replace” and select the “output” field from the previous step as “input”. 
- Set the “Find” field to “[:newline:]” (without the quotes). 
- Set the “Replace” field to “[:space:]” (without the quotes). 
- Add a final action with the “Sub-Zap by Zapier” app and set the “Action event” to “Return From a Sub-Zap”. 
- Add a new “Output / Return Values”, name it “plain_text” and set the value to the “output” of the previous step. 
2. Create the “Shopify Blog Post to Nosto” Workflow
The following principle can vary depending on the tool you are using and can also be used for other content sources like Contentstack or Contentful. (We have a tutorial on how to send all your existing content from Contentful to Nosto.)
If you have multiple Nosto accounts (e.g. because you are using the Shopify Markets integration), you will need to duplicate this workflow per language/Nosto account.
- Create a new workflow (or “Zap” in Zapier terms) and call it “Shopify: New Blog Post to Nosto Product API”. 
2.1. Get the data from Shopify
- Select the “Shopify” app, set the “Trigger event” to “New Blog Entry”, select your Shopify account (you might need to connect your account in this step) 
- Select the Shopify blog from which you want posts to show in Nosto search and set “Blog Entry Status” to “Published”. This step will return 99% of the data we need like the blog post title, image-link, body, summary, tags etc.. 
- Create a new action “Webhooks by Zapier”, set the “Action event” to “Custom Request” and set the “Method” to “POST”. We need this step because Shopify doesn’t return the blog post URL in the trigger step. 
- Set the “URL” to: https://<your-storename>.myshopify.com/api/2025-10/graphql.json (make sure to replace <your-storename> with the actual value) 
- Copy the following query into the “Data” field: 
{
    "query": "{
      article() {
        onlineStoreUrl
      }
    }"
  }- Click inside of the parentheses after “article”, click the “+”-icon and select the “ID” from the popup. 
- Scroll down, add a new “Headers” field “Content-Type” and set the value to “application/json” 
2.2. Clean up the data from Shopify
You will likely only send two fields to Nosto that contain HTML - the body text/content of the blog post and the summary/excerpt of the blog post.
- Create a new action with the “Sub-Zap by Zapier” app and set the “Action event” to “Call a Sub-Zap”. 
- Select your (Zapier) account, set the “Sub-Zap” to the previously created “Utility” workflow and set the “Input Argument” to the “Body Html” field from the first step. 
- Create a new action with the “Sub-Zap by Zapier” app and set the “Action event” to “Call a Sub-Zap”. 
- Select your (Zapier) account, set the “Sub-Zap” to the previously created “Utility” workflow and set the “Input Argument” to the “Summary Html” field from the first step. 
2.3. Send the clean data to Nosto
- Create a new action “Webhooks by Zapier”, set the “Action event” to “Custom Request” and set the “Method” to “POST”. We need this step because Shopify doesn’t return the blog post URL in the trigger step. 
- Set the “URL” to: https://api.nosto.com/v1/graphql 
- Copy the following query into the “Data” field: 
mutation {
  updateProducts(products: [
    {
      productId: ""
      url: ""
      imageUrl: ""
      priceCurrencyCode: "USD"
      name: ""
      description: ""
      attributes: [
        {
          key: "contentType"
          value: "article"
        },
        {
          key: "body"
          value: ""
        }
      ]
      price: 1
      listPrice: 1
      inventoryLevel: 1
      availability: "InStock"
    }
  ]) {
    result {
      errors {
        field
        message
      }
      data {
        productId
      }
    }
  }
}- One by one, click into all the empty strings (""), click the “+” icon and select the matching field from previous steps with the popup. You will likely “map” the fields similar to this: - productId: “Step1.ID” 
- url: “Step2.Step Output” 
- imageUrl: “Step1.Image” 
- name: “Step1.Title” 
- description: “Step4.Output Value: plain_text” 
- attributes.body.value: “Step3.Output Value: plain_text” 
 
- Scroll down, add a new “Headers” field “Content-Type” and set the value to “application/graphql” 
- Copy your Nosto API_APPS token, prepend “:” and encode the string with base64 (e.g. via https://www.base64encode.org/ or any other service, example: base64_encode(“:k8yvSJBge6Jw”)) 
- Add another new “Headers” field “Authorization” and set the value to “Basic <base64_encoded_Nosto_API_APPs_token>” 
- Click “Publish” and Nosto will receive all newly published blog posts within a few minutes. 
- If you are using Nosto variations for fixed price multicurrency or customer group pricing, you need to amend your updateProducts mutation to include the main variation and the individual variations, for example: 
mutation {
  updateProducts(products: [
    {
      productId: ""
      """
            Other fields from the mutation above
      """
      priceCurrencyCode: "USD"
      price: 1
      listPrice: 1
      inventoryLevel: 1
      availability: "InStock"
      variation_id: "GENERAL"
      variations: [
            {
                  variant_id: "LOYAL" 
            },
            {
                  variant_id: "WHOLESALE" 
            }
      ]
    }
  ]) {
    result {
      errors {
        field
        message
      }
      data {
        productId
      }
    }
  }
}
3. Additional Use Cases and Resources
The two workflows above can be created within one hour. You will likely want to copy and adjust certain elements of the main workflow to keep your data in Nosto up-to-date as you:
- Will update your content/blog posts over time. 
- Already have content/blog posts that you want to transfer to Nosto. 
As always, you have different options depending on what your automation tool and content sources like Shopify, Contentful or Contentstack provide:
- Zapier provides only the “New Blog Post” trigger but no “Updated Blog Post” trigger. 
- Make.com provides an “event” trigger that might be useful. 
- Contentful and Contentstack provide webhooks and Zapier triggers for “Entry Published” and “Updated Entry”, so you can just copy the Shopify workflow, change the trigger, update the mapping and you’re good to go within minutes. 
- Shopify currently has no dedicated webhooks for content/blog post updates but the Shopify Admin API can be used to pull this data regularly. - You can create a workflow that regularly checks for new blog posts and updates them in Nosto. 
- You can use the same workflow for the initial sync of all your blog posts. 
 
If you’re using a CMS or blog system that doesn’t provide APIs/webhooks but has “feed”-files (like RSS, Atom or another XML format) your approach of getting the data will vary a bit but the principle remains the same: Read the data regularly, clean and map it, then send it to Nosto.
Below is a simple example of getting existing blog posts from the Shopify admin API (you will need a Shopify Admin API access token) and sending them to Nosto. We’ve also created a step-by-step tutorial on how to send all your existing content to Nosto.

