GraphQL Metafielddefinitioncreate mutation using VBA

Topic summary

A user is attempting to create Shopify metafield definitions via the GraphQL API using VBA but encountered syntax errors. The initial mutation incorrectly listed arguments directly on metafieldDefinitionCreate instead of wrapping them in a definition input object.

Core Issue:

  • The mutation was missing the required definition argument
  • Individual fields (description, key, name, etc.) were incorrectly passed as direct arguments rather than nested within the definition parameter

Solution Provided:
Shopify Developer Support shared the correct mutation structure:

  • Use a variable ($md: MetafieldDefinitionInput!) to pass the definition object
  • Wrap all metafield properties (key, name, namespace, ownerType, pin, type, visibleToStorefrontApi) inside the definition parameter
  • Include a separate variables JSON object with the actual values

Resolution:
The user successfully implemented the solution in VBA, sharing:

  • The final working payload structure
  • A VBA script (BuildMetaDesc) that constructs the properly formatted mutation using string variables (defKey, defName, defSpace)
  • Content-Type set to Application/json

The discussion is resolved with a working implementation.

Summarized with AI on November 23. AI used: claude-sonnet-4-5-20250929.

Hi. I’m trying to create Metafield definintions using VBA. Over the course of several weeks now, this is the furthest I’ve been able to get (the string now parses). From the error message, it looks like I need to include a lot of other information that would normally be included by default when using a real GraphQL interface.

Any help on this would be much appreciated

When I post the following mutation:

mutation{metafieldDefinitionCreate(description:String, key: String, name:String, namespace:String, ownerType: MetafieldOwnerType, pin: boolean, type: String, validations: {name: String, value: String}, visibleToStorefrontApi: Boolean){metafieldDefinitionCreate(description:"asdfasdf", key:"further_product_information",name:"Further Product Information",namespace:"prod-detail", ownerType: PRODUCT, pin: false, type:"multi_line_text_field", validations:[{name: "", value: ""}],visibleToStorefrontApi: false )MetafieldDefinitionCreatePayload{name,key} usererrors{field,message}}}

I get this as a response:

{"errors":[{"message":"Field 'metafieldDefinitionCreate' is missing required arguments: definition","locations":[{"line":1,"column":10}],"path":["mutation","metafieldDefinitionCreate"],"extensions":{"code":"missingRequiredArguments","className":"Field","name":"metafieldDefinitionCreate","arguments":"definition"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'description'","locations":[{"line":1,"column":36}],"path":["mutation","metafieldDefinitionCreate","description"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"description"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'key'","locations":[{"line":1,"column":56}],"path":["mutation","metafieldDefinitionCreate","key"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"key"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'name'","locations":[{"line":1,"column
":69}],"path":["mutation","metafieldDefinitionCreate","name"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"name"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'namespace'","locations":[{"line":1,"column":82}],"path":["mutation","metafieldDefinitionCreate","namespace"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"namespace"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'ownerType'","locations":[{"line":1,"column":100}],"path":["mutation","metafieldDefinitionCreate","ownerType"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"ownerType"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'pin'","locations":[{"line":1,"column":131}],"path":["mutation","metafieldDefinitionCreate","pin"],"extensions":{"code":"argumentNotAccepted","name":"metafie
ldDefinitionCreate","typeName":"Field","argumentName":"pin"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'type'","locations":[{"line":1,"column":145}],"path":["mutation","metafieldDefinitionCreate","type"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"type"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'validations'","locations":[{"line":1,"column":159}],"path":["mutation","metafieldDefinitionCreate","validations"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"validations"}},{"message":"Field 'metafieldDefinitionCreate' doesn't accept argument 'visibleToStorefrontApi'","locations":[{"line":1,"column":203}],"path":["mutation","metafieldDefinitionCreate","visibleToStorefrontApi"],"extensions":{"code":"argumentNotAccepted","name":"metafieldDefinitionCreate","typeName":"Field","argumentName":"visibleToStorefrontApi"}},{"message"
:"Field 'metafieldDefinitionCreate' doesn't exist on type 'MetafieldDefinitionCreatePayload'","locations":[{"line":1,"column":236}],"path":["mutation","metafieldDefinitionCreate","metafieldDefinitionCreate"],"extensions":{"code":"undefinedField","typeName":"MetafieldDefinitionCreatePayload","fieldName":"metafieldDefinitionCreate"}},{"message":"Field 'MetafieldDefinitionCreatePayload' doesn't exist on type 'MetafieldDefinitionCreatePayload'","locations":[{"line":1,"column":509}],"path":["mutation","metafieldDefinitionCreate","MetafieldDefinitionCreatePayload"],"extensions":{"code":"undefinedField","typeName":"MetafieldDefinitionCreatePayload","fieldName":"MetafieldDefinitionCreatePayload"}},{"message":"Field 'usererrors' doesn't exist on type 'MetafieldDefinitionCreatePayload'","locations":[{"line":1,"column":552}],"path":["mutation","metafieldDefinitionCreate","usererrors"],"extensions":{"code":"undefinedField","typeName":"MetafieldDefinitionCreatePayload","fieldName":"usererrors"}}]}

thank you

Hi @Paul112 :waving_hand:

The metafieldDefinitionCreate mutation be formatted as follows:

Query:

mutation ($md: MetafieldDefinitionInput!) {
    metafieldDefinitionCreate(definition: $md) {
        createdDefinition {
            key
            name
            namespace
            type {
                name
            }
        }
    }
}

With variables:

{
  "md": {
    "key": "foo",
    "name": "bar",
    "namespace": "test",
    "ownerType": "PRODUCT",
    "pin": true,
    "type": "boolean",
    "visibleToStorefrontApi": true
  }
}

The following is an example CURL request that can be extrapolate to your VBA code:

curl -L -X POST 'https://YOUR_STORE_NAME.myshopify.com/admin/api/2023-01/graphql.json' \
-H 'X-Shopify-Access-Token: YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
--data-raw '{"query":"mutation ($md: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $md) {\n createdDefinition {\n key\n name\n namespace\n type {\n name\n }\n }\n }\n}\n","variables":{"md":{"key":"foo","name":"bar","namespace":"test","ownerType":"PRODUCT","pin":true,"type":"boolean","visibleToStorefrontApi":true}}}'

Hope that helps!

1 Like

Thank you support - that was much appreciated.

The final payload for anyone else with a similar issue with VBA was:

{"query":"mutation ($md: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $md) {\n createdDefinition {\n key\n name\n namespace\n type {\n name\n }\n }\n }\n}\n","variables":{"md":{"key":"further_product_information","name":"Further Product Information","namespace":"prod-detail","ownerType":"PRODUCT","pin":true,"type":"multi_line_text_field","visibleToStorefrontApi":true}}}

and content type set to Application/json.

1 Like

Here’s the script I used to generate it:

BuildMetaDesc = "{""query"":""mutation ($md: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $md) {\n createdDefinition {\n key\n name\n namespace\n type {\n name\n }\n }\n }\n}\n"",""variables"":{""md"":{""key"":""" & defKey & """,""name"":""" & DefName & """,""namespace"":""" & defSpace & """,""ownerType"":""PRODUCT"",""pin"":true,""type"":""multi_line_text_field"",""visibleToStorefrontApi"":true}}}"

using string variables: defKey, DefName, defSpace