1. 整体流程
目标是在 APAC 租户中找到更值得 Support / Sales 关注的对象。系统先确定租户范围,再补充组织、产品使用和 Billing 信息,最后计算分数与优先级。
流程同时处理两类租户:
- Active candidate:当前满足 APAC 存量口径的租户,执行完整的信息查询和打分。
- New signup:上一 CST 自然日注册的 APAC 租户,先做组织识别并进入评分;不查询集群和 Billing。
Dispatcher 每次运行先尝试同步完整的 HubSpot Company 目标列表,再从 DevOps DB 读取租户并发送到 Monitor SQS。HubSpot 同步逻辑位于独立模块;如果本次同步失败,租户处理不会被阻塞,Worker 会回退到最近一次成功快照。
2. 租户筛选条件
2.1 Active candidate
用于筛选 APAC 存量监控对象,并作为周报中 stock 类指标的范围。条件全部满足才会入选:
status = 'active'
AND kind = 'external'
AND sales_force_region = 'APAC'
AND country NOT IN ('JP')
AND plan NOT IN ('free_trial', 'new_user', 'closing')
| 条件 | 设计含义 |
|---|---|
status = active | 只看当前活跃租户。 |
kind = external | 排除内部租户。 |
sales_force_region = APAC | 存量范围以 Salesforce region 为准;当前不会在该字段为空时回退到 country_region。 |
| 排除 JP | 业务范围包含 CN,但不包含 JP。 |
| 排除三个 plan | free_trial、new_user 和 closing 不进入存量监控范围。 |
2.2 Previous-day new signup
用于发现刚注册的新租户。时间范围是上一 CST 自然日,不是过去 24 小时;数据库时间仍按 UTC 存储,查询使用 CST 零点对应的 UTC 边界:
created_at >= 上一 CST 自然日 00:00 对应的 UTC 时间
AND created_at < 当前 CST 自然日 00:00 对应的 UTC 时间
AND country_region = 'APAC'
AND country NOT IN ('JP')
country_region 判断 APAC,并且不做 status、kind 或 plan 过滤。这样可以先保留上一日所有 APAC 注册,再由后续画像和评分判断价值。2.3 读取的基础租户字段
两类筛选都会读取以下字段,作为统一画像的基础:
id、created_at、updated_at、name、email、country、time_zone、status、kind、plan、alias、country_region、sales_owner_email、custom_id、segmentation、sales_force_region、sales_force_kind、tam_name。
3. Worker 查询哪些信息
3.1 Domain Intelligence
从租户邮箱中提取 domain,补充以下信息:
| 结果 | 说明 |
|---|---|
entity_ai_category | 组织分类:AI 核心公司、AI 相关公司、非 AI 公司、AI 相关机构、非 AI 机构、个人或 unknown。 |
business_description | 组织业务的一句话说明。 |
official_website | 可验证的官方网站。 |
- 空邮箱或无效 domain:记为
unknown。 - Gmail、Outlook、QQ、163 等已知公共邮箱:直接记为
individual,不做网络查询。 - 其他 domain:先读取缓存;缓存默认 30 天有效。
- 缓存不存在或过期:通过 Web Search 识别组织、业务和 AI 属性。
教育机构不会因此停止处理。只要是 Active candidate,Domain Intelligence 完成后仍会继续查询集群和 Billing。
3.2 集群和使用情况
| 查询结果 | 计算方式 |
|---|---|
cluster_count | 拉取 DevOps 集群列表的全部分页,保留准确总数。 |
| Service plan 数量 | 分别统计 starter、essential、premium、dedicated。 |
tenant_avg_qps | 集群少于 10 个时,从 Clinic 查询过去 30 天 QPS,把同一时间点的各集群 QPS 相加,再计算时间样本平均值。 |
cluster_count >= 10 时,仍完整读取所有 DevOps 分页,确保集群总数和 service plan 数量准确;但不再逐集群查询 Clinic,tenant_avg_qps 写为 NULL。如果任意一个集群的 Clinic 查询失败,本轮 QPS 也写为 NULL,避免把不完整结果误认为真实的低 QPS。
3.3 Billing 信息
每次处理 Active candidate 都会刷新 Billing 信号:
| 查询结果 | 说明 |
|---|---|
has_credit_card | 是否存在 funding 类型为 credit 且未过期的信用卡。 |
billing_config_id | 当前可用的 Billing config,用于后续查询。 |
active_total_credits | 所有未关闭 credits 的额度总和。 |
latest_credit_grant_days_ago | 最近一笔 credit 开始时间距本次运行的天数。 |
已有的 billing_config_id 只用于优先定位,不能跳过信用卡验证。如果缓存配置无卡、失效或不存在,会重新扫描该租户的 active Billing configs。
3.4 New signup 的简化路径
New signup 只做 Domain Intelligence,然后按 HubSpot / Sales owner 规则写入对应租户表并触发评分。它不查询集群、QPS、信用卡或 credits。当同一租户后来进入 Active candidate 流程时,这些信息会被完整补齐。
4. 打分模型
total_score = Activity + Fit + Urgency,总分最高 100。三部分分别表示实际使用程度、目标画像匹配度和当前跟进紧迫度。
4.1 Activity,最高 40 分
以下信号累加,最后封顶 40 分:
| 条件 | 分值 |
|---|---|
tenant_avg_qps >= 1 | +25 |
0.001 <= tenant_avg_qps < 1 | +12 |
cluster_count >= 1 | +10 |
cluster_count >= 3 | 额外 +8 |
cluster_count >= 10 | 额外 +5 |
| 有有效信用卡 | +10 |
tenant_avg_qps >= 1 且无信用卡 | +5 |
集群阈值是累加的:1、3、10 个及以上集群分别贡献 10、18、23 分,再受 Activity 40 分上限约束。
4.2 Fit,最高 30 分
Fit 只选择一项,不累加:
| 组织分类及 domain 条件 | 分值 |
|---|---|
company_ai_core | 30 |
company_ai_related | 20 |
company_non_ai,非公共邮箱 domain | 15 |
company_non_ai,公共邮箱 domain | 5 |
institution_ai_related | 15 |
institution_non_ai | 8 |
individual | 0 |
unknown 或其他未匹配情况 | 3 |
空 domain 既不属于企业 domain,也不属于已识别的公共邮箱;例如 company_non_ai 但 domain 为空时会落到 3 分。
4.3 Urgency,最高 30 分
以下信号累加,最后封顶 30 分:
| 条件 | 分值 |
|---|---|
创建不超过 24 小时,且为 company_ai_core | +20 |
创建不超过 48 小时,且为 company_ai_related | +15 |
plan = poc | +15 |
tenant_avg_qps >= 50 | +15 |
| 至少 3 个集群、无信用卡、且为已识别组织 | +12 |
created_at,与 EMEA 当前模型保持一致,不要求 source_type = new_signup。4.4 “已识别组织”的定义
以下五类属于 non-individual / known organization:
company_ai_core、company_ai_related、company_non_ai、institution_ai_related、institution_non_ai。
individual、unknown、空值和未识别分类不满足仅限组织的加急条件。
5. P0 / P1 / P2 优先级规则
优先级不是简单按总分排序。先判断所有 P0 条件;没有命中 P0,再判断 P1;其余为 P2。
5.1 P0:满足任意一项
cluster_count >= 50,不限制组织分类;tenant_avg_qps >= 50;tenant_avg_qps >= 10且为company_ai_core;- 创建不超过 24 小时且为
company_ai_core; plan = poc且为company_ai_core或company_ai_related;total_score >= 75且为已识别组织。
5.2 P1:未命中 P0,并满足任意一项
total_score >= 45;- 创建不超过 48 小时且为
company_ai_related; - 创建不超过 24 小时、为
company_non_ai,且使用非公共邮箱 domain; cluster_count >= 10且为已识别组织;cluster_count >= 3、无信用卡,且为已识别组织。
5.3 P2
没有命中任何 P0 或 P1 条件。
6. 特殊处理与性能取舍
6.1 10 个及以上集群
- DevOps 集群列表仍读取全部分页,集群总数和 service plan 数量必须准确。
- 跳过 Clinic 的逐集群 QPS 查询,QPS 保存为
NULL。 - 评分时
NULLQPS 按数值 0 处理,不获得 QPS 分。 - 10–49 个集群的已识别组织至少为 P1;individual 或 unknown 不会只因达到 10 个集群而升级。
6.2 50 个及以上集群
所有分类直接为 P0,包括 individual 和 unknown。这样即使跳过 QPS,也不会低估超大规模租户。
6.3 三个已知超大租户
以下租户走强制 Sales-owned 快速路径:保留 P0,直接写入 apac_sales_owned_tenants 并从 Active 删除,同时跳过 Domain Intelligence、集群、Clinic、Billing 和后续评分:
137281308920926091913728130892093004441372813089209301246
6.4 HubSpot Target 与 Sales-owned 分流
除三个强制 Sales-owned 租户外,Worker 在完成必要画像后按以下顺序处理;顺序不可交换:
- HubSpot Target 命中:写入
apac_active_tenants,正常计算total_score,最终优先级强制为 P0。 - 否则,
sales_owner_email命中配置的 APAC Sales 邮箱集合:写入apac_sales_owned_tenants,分数和优先级均按普通规则计算。 - 否则:写入
apac_active_tenants,按普通规则评分。
HubSpot 依次尝试 portal ID、account ID、唯一的非个人邮箱根域名和唯一的官网根域名匹配。个人邮箱域名和存在歧义的域名不会自动命中。租户切换分流表时,会在同一事务中从另一张表删除同一 tenant ID,并保留已有评分和人工跟进字段。
APAC_SALES_EMAILS 由部署参数提供。邮箱集合为空时,不会有租户进入 apac_sales_owned_tenants。HubSpot 的优先级高于 Sales owner。6.5 查询失败
Domain、集群和 Billing 失败互相隔离:某一类信息失败时尽量保留数据库中的上一次结果,并继续收集其他信号。错误写入 error_message,但错误本身不参与打分,也不会自动提升优先级。
7. 日报与周报口径
7.1 每日 Summary
日报使用确定性 SQL 统计,不重新调用 Domain Intelligence,也不重新计算分数。日报包含两个租户范围:
| 范围 | 条件 | 用途 |
|---|---|---|
| 当日 Active stock | 满足 Active candidate 条件,并且最近 24 小时内完成处理。 | 反映本轮已刷新的存量租户。 |
| 上一 CST 日 new signup | 满足 APAC signup 条件,且 created_at 位于上一 CST 自然日。 | 反映上一日注册的新租户。 |
P0 和 P1 的总数及明细使用以上两个范围的并集,不是只统计 Active stock。因此,上一 CST 日的 new signup 在完成 Worker 和 Scoring 后,也会进入 P0 / P1 统计。
日报主要内容包括:
- 上一 CST 日 APAC new signups 总数;
- 其中真实 non-individual 数量;
- 其中 AI-related 数量;
- 统一 Summary 范围内的 P0、P1 数量;
- 最近 7 天有成功 import 的租户数和 import event 数。
P0、P1 和 import 明细区每类最多展示前 10 条。tenant_avg_qps = NULL 显示为 N/A,真实测量结果为零时显示 0。
created_at 和 APAC signup 口径重新计算,不依赖可被后续 Active 更新覆盖的 source_type。Non-individual 只包含前述五种已识别公司和机构分类。Dispatcher 与 Summary 使用同一个 CST 日窗口。7.2 Weekly Metrics
周报统计上一完整 CST 周(周日 00:00 到下一周日 00:00)的 new signups,并统计当前 APAC stock、P0 + P1、connected 和 paid 等指标。存量指标与 Active candidate 使用相同范围,signup 指标仍按 created_at 和 country_region 计算。
7.3 报告的数据边界
Summary 和 Weekly 只读取 apac_active_tenants,不会扫描 apac_sales_owned_tenants。最近 24 小时、最近 7 天等滚动窗口仍按实际时间长度计算;CST 只用于“自然日”和“完整周”的边界。
8. 数据结果与职责
| 数据 | 用途 |
|---|---|
apac_active_tenants | 保存普通 APAC 租户和 HubSpot Target 租户的画像、使用信号、评分,以及 HubSpot 匹配证据;日报和周报只读取此表。 |
apac_sales_owned_tenants | 保存已由 APAC Sales 跟进的租户及其正常评分;日报和周报不扫描此表。 |
apac_hubspot_target_accounts | 保存最近一次成功同步的 HubSpot Target Company 完整快照及匹配字段。 |
apac_hubspot_target_sync_state | 保存 HubSpot 同步尝试、最近成功快照和失败状态,支持失败时回退。 |
domain_intelligence | 缓存 domain 分类、业务说明和官网,默认有效期 30 天。 |
apac_tenant_score_snapshots | 按 CST 日保存分数、优先级和当时的 tenant_bucket,供趋势分析使用。 |
apac_tenant_events | 保存 import 等事件;事件由外部生产方写入,本项目只消费统计。 |
当前实现由五个 Lambda 分别负责 Dispatcher、单租户 Worker、Scoring、日报和周报。Dispatcher 的 HubSpot 同步已拆到独立模块。Key Leads 功能、apac_key_leads 表和 key_lead 字段均已彻底移除。