Shopify - Update Customer
n8n-nodes-base.httpRequest
Update an existing customer in your Shopify store. Modify name, email, tags, addresses, and marketing preferences.
π‘ Use Cases
- Update customer information
- Add tags for segmentation
- Sync customer changes from CRM
π API Documentation
Reference documentation for this API endpoint:
π https://shopify.dev/docs/api/admin-rest/2024-01/resources/customer#put-customers-customer-id βπ Node Configuration
{
"nodes": [
{
"parameters": {
"content": "## ποΈ Update Shopify Customer\n\nUpdates an existing customer in your Shopify store.\n\n**Required Input:**\n- `shopDomain`: Your Shopify store domain\n- `customerId`: The customer ID to update\n\n**Optional Fields (only include what you want to change):**\n- `email`: New email address\n- `first_name`: New first name\n- `last_name`: New last name\n- `phone`: New phone number\n- `tags`: New comma-separated tags\n- `note`: New internal note\n- `accepts_marketing`: Marketing opt-in\n\n**Setup:**\n1. Create HTTP Header Auth credential\n2. Set header name: X-Shopify-Access-Token\n3. Set header value: Your Shopify access token\n\n**Output:**\nUpdated customer object",
"height": 238,
"width": 389,
"color": 4
},
"id": "sticky-shopify-update-customer-001",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
96,
332
]
},
{
"parameters": {
"method": "PUT",
"url": "=https://{{ $json.shopDomain }}/admin/api/2024-01/customers/{{ $json.customerId }}.json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Shopify-Access-Token",
"value": "={{ $credentials.accessToken }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"customer\": {\n \"id\": {{ $json.customerId }},\n \"email\": \"{{ $json.email || '' }}\",\n \"first_name\": \"{{ $json.first_name || '' }}\",\n \"last_name\": \"{{ $json.last_name || '' }}\",\n \"phone\": \"{{ $json.phone || '' }}\",\n \"tags\": \"{{ $json.tags || '' }}\",\n \"note\": \"{{ $json.note || '' }}\"\n }\n}",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
}
},
"id": "shopify-update-customer-001",
"name": "Update Customer",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
368,
400
],
"credentials": {
"httpHeaderAuth": {
"id": "Shopify_Private_App",
"name": "Shopify Private App Credentials"
}
}
}
],
"connections": {},
"pinData": {}
}
[
{
"id": "09b411ee-a398-49e9-b55b-9941c77003ad",
"meta": {
"name": "API Call Node",
"id": "api-call",
"icon": {
"svg": " ",
"type": "SVG"
},
"description": "## ποΈ Update Shopify Customer Updates an existing customer in your Shopify store."
},
"label": "Update Customer",
"dependencies": {
"node-fetch": "3.3.2"
},
"script": "import fetch from \"node-fetch\";\nexport default async function apiCall({\n url,\n method,\n contentType,\n authorization,\n body,\n shouldAwait,\n queryParams,\n customHeaders\n}: NodeInputs, {\n logging\n}: NodeScriptOptions) : NodeOutput {\n const headers = {\n \"Content-Type\": contentType,\n ...customHeaders\n };\n if (authorization) headers[\"Authorization\"] = authorization;\n\n let queryParamsString = '';\n if (queryParams) {\n queryParamsString = '?' + new URLSearchParams(queryParams).toString();\n }\n\n const fetchOptions = {\n method,\n headers\n };\n\n if (method !== 'GET') {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const fetchPromise = fetch(url + queryParamsString, fetchOptions);\n\n if (!shouldAwait) {\n return {\n data: null\n };\n }\n\n const response = await fetchPromise;\n const data = await response.json();\n return {\n status: response.status,\n data\n };\n}",
"inputs": {
"properties": {
"method": {
"type": "string",
"description": "The HTTP method to use for the API call",
"enum": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH"
],
"default": "PUT",
"title": "HTTP Method",
"buildship": {
"options": [
{
"label": "GET",
"value": "GET"
},
{
"value": "POST",
"label": "POST"
},
{
"value": "PUT",
"label": "PUT"
},
{
"label": "DELETE",
"value": "DELETE"
},
{
"label": "PATCH",
"value": "PATCH"
}
],
"index": 0,
"sensitive": false
}
},
"url": {
"description": "The URL of the API endpoint",
"title": "URL",
"type": "string",
"buildship": {
"index": 1
}
},
"authorization": {
"description": "The authorization header for the API call, if required (e.g., Bearer or Basic token)",
"type": "string",
"title": "Authorization",
"buildship": {
"sensitive": true,
"index": 2
}
},
"queryParams": {
"default": {},
"description": "The query parameters for the API call",
"type": "object",
"title": "Query Parameters",
"buildship": {
"index": 3,
"sensitive": false
}
},
"body": {
"type": "object",
"buildship": {
"index": 4
},
"description": "The body to send with the API call",
"title": "Body"
},
"contentType": {
"enum": [
"application/json",
"application/x-www-form-urlencoded",
"multipart/form-data",
"text/plain"
],
"description": "The content type of the API call",
"title": "Content Type",
"buildship": {
"index": 5,
"options": [
{
"label": "application/json",
"value": "application/json"
},
{
"value": "application/x-www-form-urlencoded",
"label": "application/x-www-form-urlencoded"
},
{
"label": "multipart/form-data",
"value": "multipart/form-data"
},
{
"label": "text/plain",
"value": "text/plain"
}
]
},
"type": "string"
},
"shouldAwait": {
"description": "Whether to wait for the request to complete or not",
"title": "Await?",
"type": "boolean",
"buildship": {
"sensitive": false,
"index": 6
}
},
"customHeaders": {
"type": "object",
"description": "Additional custom headers for the API call",
"title": "Custom Headers",
"buildship": {
"index": 7,
"sensitive": false
}
}
},
"type": "object",
"required": [
"url",
"shouldAwait",
"method"
]
},
"integrations": [],
"name": "API Call Node",
"output": {
"buildship": {},
"properties": {
"status": {
"buildship": {
"index": 0
},
"type": "number",
"description": "The HTTP status of the API response",
"title": "Status"
},
"data": {
"buildship": {
"index": 1
},
"title": "Data",
"type": "object",
"description": "The data object from the API response"
}
},
"type": "object"
},
"isCollapsed": false,
"type": "script",
"values": {
"method": "PUT",
"url": {
"_$expression_": "`https://${ctx?.[\"root\"]?.[\"inputs\"]?.[\"body\"].shopDomain}/admin/api/2024-01/customers/${ctx?.[\"root\"]?.[\"inputs\"]?.[\"body\"].customerId}.json`",
"type": "javascript",
"hasErrors": false
},
"authorization": {
"_$expression_": "`Bearer ${(await getSecret(\"ANONYMIZED_SECRET\"))}`",
"type": "javascript",
"hasErrors": false
},
"queryParams": {},
"body": {
"_$expression_": "{\n \"customer\": {\n \"id\": ctx?.[\"root\"]?.[\"inputs\"]?.[\"body\"].customerId,\n \"email\": \"{{ $json.email || '' }}\",\n \"first_name\": \"{{ $json.first_name || '' }}\",\n \"last_name\": \"{{ $json.last_name || '' }}\",\n \"phone\": \"{{ $json.phone || '' }}\",\n \"tags\": \"{{ $json.tags || '' }}\",\n \"note\": \"{{ $json.note || '' }}\"\n }\n}",
"type": "javascript",
"hasErrors": false
},
"contentType": "application/json",
"shouldAwait": true,
"customHeaders": {
"X-Shopify-Access-Token": {
"_$expression_": "$credentials.accessToken",
"type": "javascript",
"hasErrors": false
},
"Content-Type": "application/json"
}
}
}
]
{
"subflows": [
{
"flow": [
{
"id": 390,
"module": "http:ActionSendDataBasicAuth",
"version": 3,
"parameters": {
"key": "ANONYMIZED_CREDENTIALS",
"handleErrors": false,
"useNewZLibDeCompress": true
},
"mapper": {
"ca": "",
"qs": [],
"url": "https://{{1.shopDomain}}/admin/api/2024-01/customers/{{1.customerId}}.json",
"data": "{\n \"customer\": {\n \"id\": {{1.customerId}},\n \"email\": \"{{ $json.email || '' }}\",\n \"first_name\": \"{{ $json.first_name || '' }}\",\n \"last_name\": \"{{ $json.last_name || '' }}\",\n \"phone\": \"{{ $json.phone || '' }}\",\n \"tags\": \"{{ $json.tags || '' }}\",\n \"note\": \"{{ $json.note || '' }}\"\n }\n}",
"gzip": true,
"method": "put",
"headers": [
{
"name": "X-Shopify-Access-Token",
"value": "{{ $credentials.accessToken }}"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Authorization",
"value": "Bearer {{ANONYMIZED_TOKEN}}"
}
],
"timeout": "",
"useMtls": false,
"bodyType": "raw",
"contentType": "application/json",
"serializeUrl": false,
"shareCookies": false,
"parseResponse": true,
"followRedirect": true,
"useQuerystring": false,
"followAllRedirects": false,
"rejectUnauthorized": true
},
"metadata": {
"designer": {
"x": 300,
"y": 300,
"name": "Update Shopify Customer"
},
"restore": {
"expect": {
"qs": {
"mode": "chose",
"items": []
},
"method": {
"mode": "chose",
"label": "PUT"
},
"headers": {
"mode": "chose",
"items": [
null,
null,
null
]
},
"bodyType": {
"label": "Raw"
},
"contentType": {
"label": "JSON (application/json)"
}
},
"parameters": {
"key": {
"label": "ANONYMIZED_CREDENTIALS"
}
}
},
"parameters": [
{
"name": "key",
"type": "keychain:basicauth",
"label": "Credentials",
"required": true
},
{
"name": "handleErrors",
"type": "boolean",
"label": "Evaluate all states as errors (except for 2xx and 3xx )",
"required": true
},
{
"name": "useNewZLibDeCompress",
"type": "hidden"
}
],
"expect": [
{
"name": "url",
"type": "url",
"label": "URL",
"required": true
},
{
"name": "serializeUrl",
"type": "boolean",
"label": "Serialize URL",
"required": true
},
{
"name": "method",
"type": "select",
"label": "Method",
"required": true,
"validate": {
"enum": [
"get",
"head",
"post",
"put",
"patch",
"delete",
"options"
]
}
},
{
"name": "headers",
"spec": [
{
"name": "name",
"type": "text",
"label": "Name",
"required": true
},
{
"name": "value",
"type": "text",
"label": "Value"
}
],
"type": "array",
"label": "Headers"
},
{
"name": "qs",
"spec": [
{
"name": "name",
"type": "text",
"label": "Name",
"required": true
},
{
"name": "value",
"type": "text",
"label": "Value"
}
],
"type": "array",
"label": "Query String"
},
{
"name": "bodyType",
"type": "select",
"label": "Body type",
"validate": {
"enum": [
"raw",
"x_www_form_urlencoded",
"multipart_form_data"
]
}
},
{
"name": "parseResponse",
"type": "boolean",
"label": "Parse response",
"required": true
},
{
"name": "contentType",
"type": "select",
"label": "Content type",
"validate": {
"enum": [
"text/plain",
"application/json",
"application/xml",
"text/xml",
"text/html",
"custom"
]
}
},
{
"name": "data",
"type": "buffer",
"label": "Request content"
}
]
}
}
]
}
],
"metadata": {
"version": 1
}
}