本指南說明如何使用 Merchant API 中的會員目標顧客比對服務。這項服務可讓商家和代表商家的第三方會員方案供應商,管理顧客會員資料 (例如使用者 ID 和等級資訊),在 Google 搜尋上提供自然個人化體驗,不需要有效的 Google Ads 帳戶。
總覽
使用會員目標顧客比對服務上傳會員資料,即可在 Google 搜尋上提供自然會員個人化功能,例如顯示會員專屬價格。您可以使用 ManageLoyaltyCustomerMatch 自訂方法,將顧客與會員方案等級建立關聯,以便根據使用者 ID 插入、更新或移除會員狀態。
核心概念
- 統一介面:用於新增、更新或移除顧客會員等級詳細資料的專屬端點。
- 隱私權優先設計:為保護使用者隱私,並防止未經授權的帳戶探查,API 不支援 GET 或 LIST 作業,確保資料管理時不會擷取或稽核。
- 彈性識別:使用至少一項有效 ID (例如電子郵件地址、實際地址或電話號碼) 比對使用者。
- 依據同意聲明處理:只有在使用者向 Google 授予必要同意聲明時,服務才會儲存及使用客戶資料。為保護及防止帳戶存在探測或同意聲明狀態,如果未找到相符項目或未取得同意聲明,服務會傳回靜默成功。
必要條件
如要使用會員目標顧客比對服務,請遵守下列規定:
- 帳戶設定:確認您有有效的 Merchant Center 帳戶 (如果您是第三方會員方案供應商,則須具備商家帳戶的授權存取權)。您不需要建立 Google Ads 帳戶,即可使用會員目標顧客比對服務。
- 會員方案設定:在 Merchant Center 帳戶中啟用會員方案,並確認已定義會員等級。
- 等級順序:請注意在 Merchant Center 使用者介面中定義會員等級的順序。API 會使用這個確切序列進行列舉對應。
方法:ManageLoyaltyCustomerMatch
ManageLoyaltyCustomerMatch 方法是管理顧客忠誠度關聯的核心介面。服務會根據提供的輸入內容,自動判斷是否要插入、更新或移除顧客的會員等級狀態。這項作業是冪等作業:重複執行相同要求的效果與單次執行相同。
下列要求示範如何透過 API 管理顧客會員關聯:
POST https://merchantapi.googleapis.com/{API_VERSION}/accounts/{ACCOUNT_ID}/loyaltyCustomers:manage
這項要求定義了下列必要路徑參數:
API_VERSION:API 版本,例如 v1。ACCOUNT_ID:Merchant Center 帳戶 ID。
在要求主體中加入 loyaltyCustomer 物件。
{
"userIdentifier": {
"emailAddress": "string",
"address": {
"addressLines": ["string"],
"locality": "string",
"administrativeArea": "string",
"postalCode": "string",
"regionCode": "string"
},
"phoneNumber": "string"
},
"loyaltyTier": "LoyaltyTier",
"pointBalance": "integer"
}
loyaltyCustomer 欄位
- userIdentifier:用於比對顧客的一組 ID。userIdentifier 內至少須提供一個有效欄位。
- loyaltyTier:與顧客相關聯的會員等級。對應 Merchant Center 設定中的等級順序。
詳情請參閱「瞭解
loyaltyTier對應」。使用 NON_MEMBER 移除現有關聯。 - pointBalance:顧客目前的點數餘額。
userIdentifier 欄位
請至少提供下列其中一項欄位:
- emailAddress:顧客的電子郵件地址。
- address:顧客的實際地址。必須提供郵遞區號。
- phoneNumber:顧客的電話號碼。建議使用 E.164 格式。
瞭解loyaltyTier對應
API 不會使用自訂名稱。loyaltyTier 列舉值 (TIER1 至 TIER7) 是語意標籤。不會使用你在 Merchant Center 使用者介面中指派的自訂名稱 (例如「Gold Rewards」) 或自訂標籤 (例如「gold_tier」)。而是嚴格對應至你在 Merchant Center 的會員方案設定中,定義等級的順序:
TIER1:對應 Merchant Center 會員方案設定中列出的第一個等級。TIER2:對應 Merchant Center 會員方案設定中列出的第二個等級。TIER3到TIER7:對應 Merchant Center 會員方案設定中列出的第三到第七個等級。
範例:
如果 Merchant Center 會員方案的等級定義順序如下:
- 等級名稱:"Silver Status",等級標籤:"silver"
- 等級名稱:Gold Member,等級標籤:gold
- 等級名稱:"Platinum Elite",等級標籤:"platinum"
接著,在 accounts.loyaltyCustomers.manage API 呼叫中:
- 如要將客戶指派為「銀級狀態」,必須使用
loyaltyTier: TIER1。 - 如要將客戶指派給「黃金會員」,您必須使用
loyaltyTier: TIER2。 - 如要將客戶指派給「Platinum Elite」,則必須使用
loyaltyTier: TIER3。
LoyaltyTier 列舉值
TIER1TIER2TIER3TIER4TIER5TIER6TIER7NON_MEMBER(用於表示移除顧客的會員關聯)
瞭解 ManageLoyaltyCustomerMatch 回應主體
ManageLoyaltyCustomerMatch 方法會傳回 ManageLoyaltyCustomerMatchResponse 物件:
{
"loyaltyCustomer": {
// loyaltyCustomer object from the request
}
}
回覆的重要注意事項
成功 upsert (儲存資料):如要成功儲存或更新顧客的會員等級關聯,請符合下列條件:
- 您比對出 Google 使用者與提供的
userIdentifier - 您將要求中的
loyaltyTier設為NON_MEMBER以外的有效值 - 比對成功的使用者已同意使用會員資料
- 您比對出 Google 使用者與提供的
回應包含要求中的 loyaltyCustomer 物件,表示服務已成功處理並儲存資料:
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"loyaltyTier": "TIER2",
"pointBalance": 1500
}
}
- 成功刪除:如要成功移除客戶與該商家的現有會員關聯,必須符合下列條件:
- 您比對出 Google 使用者,且該使用者與提供的
userIdentifier相符 - 您將要求中的
loyaltyTier設為NON_MEMBER
- 您比對出 Google 使用者,且該使用者與提供的
回應為空白的 JSON 物件:
{}
- 不相符/未同意 (靜默成功):如果提供的
userIdentifier與 Google 帳戶不相符,或相符的使用者未同意使用會員資料,API 會傳回 HTTP 200 OK 狀態,並附上空白 JSON 物件:{}。無論是嘗試 upsert 還是移除,都會發生這種情況。
範例
TIER1 對應第一個定義的級別 (例如「Basic」),TIER2 則對應第二個級別 (例如「Premium」)。
如要將客戶新增至 TIER2,或使用電子郵件地址更新客戶狀態,請傳送下列要求:
POST
"https://merchantapi.googleapis.com/v1/accounts/{ACCOUNT_ID}/loyaltyCustomers:manage"
-d '{
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"loyaltyTier": "TIER2",
"pointBalance": 1500
}'
如果使用者成功比對並同意,API 會傳回下列回應:
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"loyaltyTier": "TIER2",
"pointBalance": 1500
}
}
如果沒有相符項目或使用者未同意,API 會傳回下列回應:
{}
如要使用電話號碼移除顧客的會員關聯,請傳送下列要求:
POST
"https://merchantapi.googleapis.com/v1/accounts/{ACCOUNT_ID}/loyaltyCustomers:manage" \
-d '{
"userIdentifier": {
"phoneNumber": "+18005550132"
},
"loyaltyTier": "NON_MEMBER"
}'
無論記錄是否存在,API 都會傳回下列成功回應:
{}
如要使用多個 ID 新增或更新顧客,請傳送下列要求:
POST
"https://merchantapi.googleapis.com/v1/accounts/{ACCOUNT_ID}/loyaltyCustomers:manage" \
-d '{
"userIdentifier": {
"emailAddress": "user@example.com",
"address": {
"postalCode": "94043",
"regionCode": "US"
}
},
"loyaltyTier": "TIER1"
}'
回應與第一個範例類似,取決於比對和同意聲明。
錯誤處理
API 使用標準 HTTP 代碼。常見的錯誤字串包括:
| HTTP 程式碼 | 錯誤字串 | 說明 |
| 400 | INVALID_ARGUMENT | 缺少 user_identifier 或 loyalty_tier,或 ID 為空白。 |
| 401 | UNAUTHENTICATED | 憑證無效或遺失。 |
| 403 | PERMISSION_DENIED | 已驗證的使用者無法存取指定的 Merchant Center 帳戶。 |
| 404 | NOT_FOUND | 設定中沒有指定的會員等級標籤。 |
| 412 | FAILED_PRECONDITION | 你尚未在帳戶中設定會員方案。 |
| 429 | RESOURCE_EXHAUSTED | 已達配額上限。 |
錯誤範例
404 NOT_FOUND 範例:
對未設定會員方案的帳戶 ID 提出任何有效要求。
API 會傳回下列錯誤回應:
{
"error": {
"code": 404,
"message": "The loyalty program is not found for account: {ACCOUNT_ID}.",
"status": "NOT_FOUND",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "notFound",
"domain": "merchantapi.googleapis.com",
"metadata": {
"ACCOUNT_ID": "{ACCOUNT_ID}",
"REASON": "NOT_FOUND_LOYALTY_PROGRAM"
}
}
]
}
}
原因:路徑中的商家帳戶沒有有效的會員方案。
400 INVALID_ARGUMENT 範例:
如果要求包含無效的 loyaltyTier 欄位值,就會發生錯誤:
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"loyaltyTier": "TIER11",
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "Invalid value at 'loyalty_customer.loyalty_tier' (type.googleapis.com/google.shopping.merchant.loyaltycustomers.v1.LoyaltyCustomer.LoyaltyTier), \"TIER11\"",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "loyalty_customer.loyalty_tier",
"description": "Invalid value at 'loyalty_customer.loyalty_tier' (type.googleapis.com/google.shopping.merchant.loyaltycustomers.v1.LoyaltyCustomer.LoyaltyTier), \"TIER11\""
}
]
}
]
}
}
原因: TIER11 不是 loyaltyTier 的有效列舉值。如果只有一個可用層級,但您嘗試指定 TIER2,也可能發生相同錯誤。
如果要求主體缺少必要的 loyaltyTier 欄位,就會發生錯誤:
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "[loyalty_customer.loyalty_tier] Required field not provided: loyalty_customer.loyalty_tier",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "required",
"domain": "merchantapi.googleapis.com",
"metadata": {
"FIELD_LOCATION": "loyalty_customer.loyalty_tier",
"REASON": "MISSING_REQUIRED_FIELD"
}
}
]
}
}
原因:loyaltyTier 為必填欄位。
如果地址 ID 不完整 (例如缺少 postalCode 欄位),就會發生錯誤:
{
"loyaltyCustomer": {
"userIdentifier": {
"address": {
"locality": "Sunnyvale",
"administrativeArea": "CA",
"regionCode": "US"
}
},
"loyaltyTier": "TIER1",
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "[loyalty_customer.user_identifier] The format of loyalty_customer.user_identifier does not match the expected format ... Value: at least one valid user identifier should be provided.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "invalid",
"domain": "merchantapi.googleapis.com",
"metadata": {
"FIELD_NAME": "loyalty_customer.user_identifier",
"REASON": "INVALID_VALUE"
}
}
]
}
}
原因:您提供了地址,但缺少必要的 postalCode 欄位,因此無法視為有效 ID。
如果要求的級別索引超出設定方案的範圍,就會發生錯誤:
情境:商家在 Merchant Center 中只設定一個級別。
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@example.com"
},
"loyaltyTier": "TIER2",
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "[loyalty_customer.loyalty_tier] The format of loyalty_customer.loyalty_tier does not match the expected format `valid LoyaltyTier`. Value: TIER2.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "invalid",
"domain": "merchantapi.googleapis.com",
"metadata": {
"FIELD_NAME": "loyalty_customer.loyalty_tier",
"PATTERN": "valid LoyaltyTier",
"FIELD_VALUE": "TIER2",
"REASON": "INVALID_VALUE"
}
}
]
}
}
原因:系統要求 TIER2,但與帳戶連結的會員方案未定義第二個等級。
如果要求包含格式錯誤的 emailAddress,就會發生錯誤:
{
"loyaltyCustomer": {
"userIdentifier": {
"emailAddress": "customer@google"
},
"loyaltyTier": "TIER1",
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "[loyalty_customer.user_identifier] The format of loyalty_customer.user_identifier does not match the expected format `email_address: \t \"customer@google\"\n`. Value: at least one valid user identifier should be provided.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "invalid",
"domain": "merchantapi.googleapis.com",
"metadata": {
"FIELD_NAME": "loyalty_customer.user_identifier",
"REASON": "INVALID_VALUE"
}
}
]
}
}
原因:電子郵件地址格式無效。
如果 userIdentifier 物件空白,就會發生錯誤:
{
"loyaltyCustomer": {
"userIdentifier": {},
"loyaltyTier": "TIER1",
"pointBalance": 100
}
}
API 會傳回下列錯誤回應:
{
"error": {
"code": 400,
"message": "[loyalty_customer.user_identifier] Required field not provided: loyalty_customer.user_identifier",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "required",
"domain": "merchantapi.googleapis.com",
"metadata": {
"FIELD_LOCATION": "loyalty_customer.user_identifier",
"REASON": "MISSING_REQUIRED_FIELD"
}
}
]
}
}
原因:userIdentifier 物件存在,但不含實際 ID 欄位。
注意:ID 驗證。
- API 會對 ID 執行基本格式檢查 (例如電子郵件結構、地址中是否有
postalCode)。 - 不過,部分通過初始檢查的 ID 可能與任何 Google 使用者帳戶都不相符,或格式不符合後端比對系統的規定。在這種情況下,您會收到空白回應
{},表示作業成功,HTTP 狀態為200 OK。
最佳做法
請按照下列最佳做法,充分發揮整合效益。
大規模整合:由於 API 是以個別要求為基礎運作,因此需要用戶端平行處理,才能達到大型資料集所需的處理量。請務必設計整合功能,以便管理多項並行要求。如要瞭解如何建構實作,透過平行處理處理大量資料,請參閱如何傳送多個要求指南。
配額管理:預設配額為每天 1,000,000 項要求和每分鐘 10,000 項要求。如要瞭解如何監控及查看配額,請參閱「配額與限制」。
優先提供電子郵件地址:請盡可能在
userIdentifier中加入顧客的emailAddress。一般來說,電子郵件地址是最準確可靠的 ID,可用來比對使用者與其 Google 帳戶。處理空白回應:請將應用程式設計為正確解讀空白
{}回應,並視為成功,瞭解這代表資料因隱私權原因 (不相符或未同意) 而未儲存。請勿重試要求。確認等級順序:請務必在 Merchant Center 使用者介面中確認會員等級順序,確保在 API 呼叫中使用正確的
TIER1到TIER7列舉值。這項對應是根據使用者介面中定義的順序,而非名稱。監控錯誤:記錄並監控 API 回應,留意任何
4xx錯誤,找出整合問題,尤其是404錯誤,這可能表示對等級的理解不一致。