客户细分指的是在 SHOPLINE Admin 筛选出的满足指定条件客户的分组,客户细分条件即这些条件的集合。例如:商家可以将所有订阅电子邮件营销的客户保存为一个客户细分。
你可以使用 Admin GraphQL API 中的 segmentCreate API 创建客户细分,本文主要介绍客户细分条件的组成以及如何创建 segmentCreate API 中的 query 参数。
客户细分条件组成
客户细分条件由多个条件组组成,条件组之间可以是且、或、除关系。例如,邮箱订阅状态等于已订阅 且 客户状态等于已注册 是一个条件组。
每个条件组由多个条件或条件组组成,条件之间可以是且、或关系。例如,邮箱订阅状态等于已订阅 是一个条件。

条件
SHOPLINE Admin 提供了丰富的条件供商家创建客户细分。

条件组
条件组由多个条件或条件组组成。下图中的 1、2、3 都是条件组。

组合条件
组合条件是包含固定条件和条件关系的条件组。
例如下图中的 购买过指定商品 条件,它的含义是在指定时间段内购买过指定商品的客户,它由 购买过指定商品 和 下单时间 两个条件组成,这两个条件之间是且关系,这种条件我们称为组合条件。
在 组合条件字段详细说明 里列举了所有的组合条件。组合条件的组成规则是固定的,不能自定义组合。

创建客户细分条件
你可以使用 Admin GraphQL API 中的 segmentCreate API 创建客户细分,该 API 中 query 参数可以通过以下方式创建。
条件
数据结构
通过以下 JSON 对象可以创建一个 客户状态 等于 已注册 条件。
{
"type": 0,
"metafield": false,
"mfType": null,
"key": "status",
"value": [
3
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
}

字段说明
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| type | Number | 是 | 固定为 0,表示这是一个条件 |
| metafield | Boolean | 否 | 是否为 元字段 条件,true 表示是元字段条件 |
| mfType | EnumMFType | 否 | 元字段类型,metafield 为 true 时必填 |
| key | String | 是 | 条件唯一标识,可参考 条件字段详细说明 |
| value | Array | 是 | 条件值,可参考 条件字段详细说明 |
| operator | EnumOperator | 是 | 条件查询时的操作符 |
| extInfo | ExtInfo | 是 | 用于控制在 SHOPLINE Admin 页面上展示客户细分的交互 |
extInfo
extInfo 是一个 JSON 字符串,他的作用是让 SHOPLINE Admin 页面根据不同的条件类型展示不同的交互。
例如:邮箱订阅状态 和 上次购买时间 将展示不同的交互效果:
{
"key": "emailSubscribeStatus",
"type": 0,
"operator": "IN",
"value": [
1,
2
],
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}"
}

{
"key": "lastOrderTime",
"type": 0,
"operator": "BETWEEN",
"value": [
1
],
"extInfo": "{\"componentType\":\"DATE\",\"dateType\":\"LAST_7_DAY\"}"
}

每个条件详细的 extInfo 取值可参考 条件字段详细说明。
EnumOperator
每个条件可选的 operator 值可参考 条件字段详细说明。
EnumMFType
| value | 说明 |
|---|---|
| date | 日期&单值 |
| date_time | 时间&单值 |
| number_integer | 整数&单值 |
| number_decimal | 小数&单值 |
| single_line_text_field | 单行文本&单值 |
| multi_line_text_field | 多行文本 |
| color | 颜色&单值 |
| boolean | 布尔值 |
| list.date | 日期&多值 |
| list.date_time | 时间&多值 |
| list.number_integer | 整数&多值 |
| list.number_decimal | 小数&多值 |
| list.single_line_text_field | 单行文本&多值 |
| list.color | 颜色&多值 |
条件组
数据结构
通过以下 JSON 对象可以创建一个条件组。
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "emailDomain",
"value": [
"@gmail.com"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST_PAGE\",\"listSource\":\"emailDomain\",\"label\":[\"@gmail.com\"]}"
},
{
"type": 0,
"blockType": 0,
"key": "language",
"value": [
"en"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST\",\"listSource\":\"language\",\"label\":[\"English\"]}"
}
]
}

字段说明
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| type | Number | 是 | 固定为 1,表示这是一个条件组 |
| blockType | Number | 是 | 需要展示为 组合条件 时传 1,否则传 0 |
| key | String | 否 | blockType 为 1 时必填,取值请参考 组合条件 |
| relation | String | 是 | children 之间的逻辑关系,可选 and 或 or。and 表示 children 之间是且关系,or 表示 children 之间是或关系 |
| children | Array | 是 | 条件或条件组数据集合 |
条件组合逻辑
客户细分条件由满足的条件和不满足的条件两部分组成。
满足的条件
满足的条件由多个条件组组成。对应下图中蓝框部分,在 query 参数中对应 conditions 字段。

示例:
{
"conditions": {
"type": 1,
"relation": "and",
"blockType": 0,
"children": [
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "emailDomain",
"value": [
"@gmail.com"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST_PAGE\",\"listSource\":\"emailDomain\",\"label\":[\"@gmail.com\"]}",
},
{
"type": 0,
"blockType": 0,
"key": "language",
"value": [
"en"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST\",\"listSource\":\"language\",\"label\":[\"English\"]}",
}
]
},
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "userSource",
"value": [
"1",
"2"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
},
{
"type": 0,
"blockType": 0,
"key": "status",
"value": [
3
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
}
]
}
]
}
}
不满足的条件
不满足的条件也是一个条件组,但它内部只能添加一个条件组。对应下图中蓝框部分,在 query 参数中对应 not 字段。

示例:
{
"not": {
"type": 1,
"relation": "and",
"blockType": 0,
"children": [
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "status",
"value": [
0
],
"operator": "IN",
"relation": null,
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
},
{
"type": 0,
"blockType": 0,
"key": "ageLevel",
"value": [
4
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
}
]
}
]
}
}
完整示例
以下是 segmentCreate API 中 query 参数的完整示例,注意需要将它转换为 JSON string 传入 API。
{
"conditions": {
"type": 1,
"relation": "and",
"blockType": 0,
"children": [
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "emailDomain",
"value": [
"@gmail.com"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST_PAGE\",\"listSource\":\"emailDomain\",\"label\":[\"@gmail.com\"]}",
},
{
"type": 0,
"blockType": 0,
"key": "language",
"value": [
"en"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"LIST\",\"listSource\":\"language\",\"label\":[\"English\"]}",
}
]
},
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "userSource",
"value": [
"1",
"2"
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
},
{
"type": 0,
"blockType": 0,
"key": "status",
"value": [
3
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
}
]
}
]
},
"not": {
"type": 1,
"relation": "and",
"blockType": 0,
"children": [
{
"type": 1,
"blockType": 0,
"relation": "and",
"children": [
{
"type": 0,
"blockType": 0,
"key": "status",
"value": [
0
],
"operator": "IN",
"relation": null,
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
},
{
"type": 0,
"blockType": 0,
"key": "ageLevel",
"value": [
4
],
"operator": "IN",
"extInfo": "{\"operatorType\":\"EQ\",\"componentType\":\"ENUM\"}",
}
]
}
]
}
}

Admin GraphQL 示例
mutation {
segmentCreate(name: "Demo1", query: "{\"conditions\":{\"type\":1,\"relation\":\"and\",\"blockType\":0,\"children\":[{\"type\":1,\"blockType\":0,\"relation\":\"and\",\"children\":[{\"type\":0,\"blockType\":0,\"key\":\"emailDomain\",\"value\":[\"@gmail.com\"],\"operator\":\"IN\",\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"LIST_PAGE\\\",\\\"listSource\\\":\\\"emailDomain\\\",\\\"label\\\":[\\\"@gmail.com\\\"]}\"},{\"type\":0,\"blockType\":0,\"key\":\"language\",\"value\":[\"en\"],\"operator\":\"IN\",\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"LIST\\\",\\\"listSource\\\":\\\"language\\\",\\\"label\\\":[\\\"English\\\"]}\"}]},{\"type\":1,\"blockType\":0,\"relation\":\"and\",\"children\":[{\"type\":0,\"blockType\":0,\"key\":\"userSource\",\"value\":[\"1\",\"2\"],\"operator\":\"IN\",\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"ENUM\\\"}\"},{\"type\":0,\"blockType\":0,\"key\":\"status\",\"value\":[3],\"operator\":\"IN\",\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"ENUM\\\"}\"}]}]},\"not\":{\"type\":1,\"relation\":\"and\",\"blockType\":0,\"children\":[{\"type\":1,\"blockType\":0,\"relation\":\"and\",\"children\":[{\"type\":0,\"blockType\":0,\"key\":\"status\",\"value\":[0],\"operator\":\"IN\",\"relation\":null,\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"ENUM\\\"}\"},{\"type\":0,\"blockType\":0,\"key\":\"ageLevel\",\"value\":[4],\"operator\":\"IN\",\"extInfo\":\"{\\\"operatorType\\\":\\\"EQ\\\",\\\"componentType\\\":\\\"ENUM\\\"}\"}]}]}}") {
segment {
id
name
query
creationDate
lastEditDate
}
userErrors {
code
field
message
}
}
}
字段详细说明
条件字段详细说明
以下将按照不同的条件类型(例如:日期、列表选择、金额输入等),说明每个字段的传值方式:
日期
传入预设区间或者自定义日期区间。
value
自定义日期区间传时间戳数组,例如:[1701705600000, 1702051199999];
预设区间传入枚举,例如 [1]。
| 预设枚举 | 说明 |
|---|---|
| 0 | 今天 |
| 1 | 过去7天 |
| 2 | 过去30天 |
| 3 | 过去90天 |
| 4 | 过去12个月 |
operator
自定义日期区间传 BETWEEN;预设区间传 EQ。
extInfo
| key | value |
|---|---|
| componentType | 固定传 DATE |
| dateType | 自定义区间:CUSTOME,今天:TODAY |