All things Shopify and commerce
I run a shop that sells 20.000+ thousands of unique products (think antiques).
We recently migrated to a 2.0 theme and are now looking to use the Search & Discovery's new recommendation system for products. Sadly it seems like the automated recommendations generated by Shopify are very lackluster. They just don't make much sense.
Thing is, we have an ERP-System that contains all the data needed to tell Shopify "Recommend these ten products for people that look at this product"... but I can't seem to find an API or some bulk editing tool to do that. The user interface provided by Search and Discovery expects me to manually specify all the recommended products, which is just not possible for the size of our inventory.
Hi:
Are you open to use 3rd party tools, like Amazon Personalize?. Do you have any specific criteria for recommending products? Or are you just leveraging in similarity?
Thanks,
I am asking for a way to tell Shopify over API which products to recommend. I would still need that way if I were to use a 3rd party tool like Amazon Personalize.
That being said, the recommendation that I want would be based on Shopify tags. e.g. When the customer looks at 18th century furniture, just recommend other products that are tagged with '18th century' and 'furniture'.
Hey, I'm in same situation. Do u find a solution for that?
Hey,
I have an idea that might work, but I have not gotten around to trying it myself yet.
Apparently the Product Recommendations are controlled by a product metafield definition called product_recommendation.related_products
While there seems to be no direct API to set product recommendations, there is an API to assign metafield values. My plan is to try and fill a product's metafield product_recommendation.related_products with ids for the products I want recommended.
Like I said though, this is just a plan right now, I can not verify that it works. If you get around to trying it sooner than me, I'd appreciate it if you let me know your results.
Heya, I can now verify that this works. You need to fill the metafields from search & discovery through the metafields api.
Hey @slf92637, how exactly did you set the product_recommendation.related_products metafield? Is that metafield an array of ids? I can't seem to push any data to it. What am I missing?
Here is my mechanic script for reference.
mutation { productUpdate( input: { id: "gid://shopify/Product/8876709642516" metafields: [ { key: "related_products" namespace: "product_recommendation" value: "gid://shopify/Product/8876709642516" } ] } ) { product { id metafield(namespace: "product_recommendation", key: "related_products") { value } } } }
Result:
{ "data": { "productUpdate": { "product": { "id": "gid://shopify/Product/8876709642516", "metafield": null } } }, "extensions": { "cost": { "requestedQueryCost": 11, "actualQueryCost": 11, "throttleStatus": { "maximumAvailable": 2000, "currentlyAvailable": 1989, "restoreRate": 100 } } } }
I am not super familiar with GraphQL, but looking at your request, the value
"gid://shopify/Product/8876709642516"
seems correct. Maybe try wrapping that inside an array i.e. ["gid://..."]
Other than that, I think your namespace might be off. On my end the namespace is
shopify--discovery--product_recommendation
Thanks for the quick response @slf92637 , it's definitely the namespace, it works now. Where is this said in the documentation? I couldn't find it.
Sadly it seems like this explicit use case "How do I set recommended products in the API" is not documented anywhere. That's how I wound up creating this thread.
I more or less puzzled together how to do this after I noticed:
- You can edit Metafields over the API
- Recommended Products are a Metafield.
As far as to how I figured out the namespace thing: I looked that up the metafield definitions in the Admin Backend:
Do you know why this isnt updating the metafield? It updates other metafields fine, this sends a success code but it doesnt add my desired metafield? Any ideas?
const PRODUCT_UPDATE_MUTATION = `
mutation updateProduct($input: ProductInput!) {
productUpdate(input: $input) {
product {
id
metafield(namespace: "shopify--discovery--product_recommendation", key: "related_products") {
value
type
}
}
}
}
`;
async function updateProductMetafield(productId, metafieldValue, client) {
// Log for debugging
console.log(`Attempting to Update product metafield for ID ${productId}`);
var metaDataList = [
metafieldValue
];
var metaJSON = JSON.stringify(metaDataList);
// GraphQL mutation to update the product metafield
const mutation = {
query: PRODUCT_UPDATE_MUTATION,
variables: {
input: {
id: productId,
metafields: [
{
key: "product_recommendation", // Specify your metafield key
value: metaJSON,
namespace: "shopify--discovery--product_recommendation", // Specify your namespace
type: "list.product_reference"
},
],
},
},
};
Output:
| GraphQL Mutation: {
2024-01-30 23:00:45 | backend | "query": "\n mutation updateProduct($input: ProductInput!) {\n productUpdate(input: $input) {\n product {\n id\n metafield(namespace:
\"shopify--discovery--product_recommendation\", key: \"related_products\") {\n value\n type\n }\n }\n }\n }\n",
2024-01-30 23:00:45 | backend | "variables": {
2024-01-30 23:00:45 | backend | "input": {
2024-01-30 23:00:45 | backend | "id": "gid://shopify/Product/8954136690964",
2024-01-30 23:00:45 | backend | "metafields": [
2024-01-30 23:00:45 | backend | {
2024-01-30 23:00:45 | backend | "key": "product_recommendation",
2024-01-30 23:00:45 | backend | "value": "[\"gid://shopify/Product/8876710691092\"]",
2024-01-30 23:00:45 | backend | "namespace": "shopify--discovery--product_recommendation",
2024-01-30 23:00:45 | backend | "type": "list.product_reference"
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | ]
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | GraphQL Response: {
2024-01-30 23:00:45 | backend | "data": {
2024-01-30 23:00:45 | backend | "productUpdate": {
2024-01-30 23:00:45 | backend | "product": {
2024-01-30 23:00:45 | backend | "id": "gid://shopify/Product/8954136690964",
2024-01-30 23:00:45 | backend | "metafield": {
2024-01-30 23:00:45 | backend | "value": "[\"gid://shopify/Product/8861507551508\"]",
2024-01-30 23:00:45 | backend | "type": "list.product_reference"
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | },
2024-01-30 23:00:45 | backend | "extensions": {
2024-01-30 23:00:45 | backend | "cost": {
2024-01-30 23:00:45 | backend | "requestedQueryCost": 11,
2024-01-30 23:00:45 | backend | "actualQueryCost": 11,
2024-01-30 23:00:45 | backend | "throttleStatus": {
2024-01-30 23:00:45 | backend | "maximumAvailable": 2000,
2024-01-30 23:00:45 | backend | "currentlyAvailable": 1198,
2024-01-30 23:00:45 | backend | "restoreRate": 100
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | }
2024-01-30 23:00:45 | backend | Mutation successful!
2024-01-30 23:00:45 | backend | Updated product ID: gid://shopify/Product/8954136690964
I realized I was using the wrong key, sadly it still doesnt work with the key related_products, not sure why this doesnt work, as it works with every other metafield
Starting a B2B store is a big undertaking that requires careful planning and execution. W...
By JasonH Sep 23, 2024By investing 30 minutes of your time, you can unlock the potential for increased sales,...
By Jacqui Sep 11, 2024We appreciate the diverse ways you participate in and engage with the Shopify Communi...
By JasonH Sep 9, 2024