We're moving the community! Starting July 7, the current community will be read-only for approx. 2 weeks. You can browse content, but posting will be temporarily unavailable. Learn more

Any way to the metaobject values into a flow?

Any way to the metaobject values into a flow?

BGalloway
Tourist
5 0 1

I've created a metaobject type called Territory which holds some basic information about which sales territory a customer belongs to. It has the following configuration (truncated to the important bits): 

territory.name,
territory.rep_name,
...
territory.assigned_states // (List of String containing US State names [Alabama, Alaska...])

When an customer is added or updated, my flow will detect if the customer is assigned to a territory and tag associated orders accordingly. If there isn't a territory assigned, it'll attempt to assign one to the customer and then tag any associated orders as usual.

 

I used the new Run Code action type and have manually recreated the important bits in Javascript so I can match the customer's state (province) to the appropriate territory. I've successfully matched customers to my fake territory object, returned the appropriate metaobject ID and used downstream actions to assign the correct metaobject to the customer. While this works, I'd obviously like to avoid managing which states are attached to territories in multiple places. I'd prefer to reference the list of available metaobjects, loop through though and then loop through their associated states. 

 

Here's the Run Code setup:

input: 

query{
  customer{
    defaultAddress {province},
    addresses {province}
  }
}

outputs: 

"The output of Run Code"
type Output {
  "The territory ID linked by the territory Metaobject gid returned by the script"
  territoryId: ID
  "Success boolean"
  success: Boolean!
  "Debug messaging from the runtime"
  debugMessaging: [String]
}

JS:

let messaging = [];
let isSuccess = false;
export default function main(input) {
  return {
    territoryId: getTerritoryId(input.customer),
    success: isSuccess,
    debugMessaging: messaging
  }
}

function getTerritoryId(customer){
  const territoryMapping = [
    {id:"gid://shopify/Metaobject/12345", // Territory 1
       states:[
         "Alabama",
         "Arkansas",
         // ... other states
       ]},
    {id:"gid://shopify/Metaobject/23456", // Territory 2
       states:[
         "Connecticut",
         "Delaware",
         // ... other states
       ]},
    {id:"gid://shopify/Metaobject/34567", // Territory 3
       states:[
         "Alaska",
         "Arizona",
         // ... other states
       ]},
    {id:"gid://shopify/Metaobject/45678", // Default Territory
       states:[
         "National"
       ]}
  ];
  for ( let i = 0;i < territoryMapping.length; i++){
    const territory = territoryMapping[i];
    messaging.push("Found territoryMapping: " + territory.id);
    for ( let j = 0; j < territory.states.length; j++){
      messaging.push("Checking customer state " + customer.defaultAddress.province + " against territory[" + i + "] state " + territory.states[j]);
      if ( customer.defaultAddress.province == territory.states[j] ){
        messaging.push("Found match, returning: " + territory.id);
        isSuccess = true;
        return territory.id;
      }
    }
  }
  messaging.push("No match found...returning blank");
  return "";
}

Has anyone successfully accessed a list of metaobjects usable in the Run Code action object whether referencing from an upstream action or directly in the Run Code action? 

 

Any help is appreciated. Thanks

Replies 8 (8)

paul_n
Shopify Staff
1828 199 435

You currently can't get a metaobject on Flow that is unattached to a resource. We do have a project underway to add improvement Metaobject support. 

 

If the metaobject is attached to a shop, order, customer metafield, then you can get the values. You can also access shop metafields in Flow currently. 

Paul_N | Flow Product Manager @ Shopify
- Finding Flow useful? Leave us a review
- Need Flow help? Check out our help docs.
- Building for Flow? Check out Flow's dev docs.
BGalloway
Tourist
5 0 1
Paul, thanks for the response. Can you share how I'd access the values of the referenced Metaobject? I couldn't get anything besides the reference ID (Ex. gid://shopify/Metaobject/99999999...). Perhaps I'm just going at it the wrong way? Can I assume it'd be via some HTTP request to the API and parsing the JSON or something?
Thanks, Brant
paul_n
Shopify Staff
1828 199 435

If it's a list, the references are on "<resource>.metafields.references.fields"

 

If it's a single value, use "reference" instead

Paul_N | Flow Product Manager @ Shopify
- Finding Flow useful? Leave us a review
- Need Flow help? Check out our help docs.
- Building for Flow? Check out Flow's dev docs.
BGalloway
Tourist
5 0 1

Paul, thanks again. Should I be able to reference this in a liquid code block or in the Run Code action? When I attempt to use what you suggested in the Run Code query section for metaobject references, I get an error. The only thing it lets me return is the type. If you mean use liquid and then a loop action downstream, I can explore that route.  Thanks, Brant

 

metaobject reference.png

paul_n
Shopify Staff
1828 199 435

Either, but the syntax would be different. I forgot you need the typename at that level. So you would input "Metaobject" and then fields.

Paul_N | Flow Product Manager @ Shopify
- Finding Flow useful? Leave us a review
- Need Flow help? Check out our help docs.
- Building for Flow? Check out Flow's dev docs.
paul_n
Shopify Staff
1828 199 435

The syntax is a bit tricky:

query{
  customer {
    metafields {
      references { 
        ...on Metaobject {
          fields {
            key
          }  
        }
      }
    }
  }
}

 

Paul_N | Flow Product Manager @ Shopify
- Finding Flow useful? Leave us a review
- Need Flow help? Check out our help docs.
- Building for Flow? Check out Flow's dev docs.
Abel_Franciscus
Tourist
4 0 0

Hee Paul_n,
Maybe a stupid question but I can not find where I can add a metafield to a shop as you mentioned. I would like my metaobject to be as global as possible (All the products should have the same metaobject). Could you give me a clue in the right direction? Thanks in advance!
Abel

paul_n
Shopify Staff
1828 199 435

There is no UI in Shopify to set shop metafields. It has to be done via an API or app. You can actually do it in Flow too by running a workflow to create a metafield definition and then updating the shop metafield based on that. 

 

But Flow now has the ability to Get metaobjects (one or a list) and metaobjects can be created in the Admin under "Content" and "Settings". 

Paul_N | Flow Product Manager @ Shopify
- Finding Flow useful? Leave us a review
- Need Flow help? Check out our help docs.
- Building for Flow? Check out Flow's dev docs.