跳到正文
HA_

← 全部文章

· 阅读约 3 分钟

绝不在客户账户中悄悄操作

为什么 ClickFortify 从不在后台于客户的广告账户中创建任何东西,以及在创建之前,审核步骤必须展示哪些内容。

productarchitectureadtech

机器翻译。 阅读原文

ClickFortify 在别人的系统里工作。为了排除恶意流量,它必须连接到客户的 Google Ads 或 Meta 账户并在其中做出更改。这种访问权限是产品的核心,也是我最谨慎对待的部分。这份谨慎催生了一条规则,如今它影响着每一个类似的情形:我们绝不在客户账户中悄悄操作。

这条规则从何而来

在开发 Meta 连接功能时,有人建议在客户没有 Meta Pixel 时自动为其创建一个。表面上看,这听起来很贴心。客户需要一个 Pixel,我们可以创建,那为什么还要问?

我否决了这个提议。不是因为 Pixel 有危险,而是因为这条捷径背后的假设:我们比客户更清楚他们的账户里应该有什么、该叫什么名字、该放在哪里。我们并不清楚。那是他们的账户。

我们的做法

任何会在客户外部账户中创建资源的流程,都会先展示一个审核步骤。这个步骤包含四个部分:

  • 可编辑的名称。我们给出建议,客户可以修改。
  • 将在哪里创建。清楚说明它会归属于哪个账户或商家。
  • 我们会用它做什么。用一句坦诚的话说明我们为什么需要它。
  • 由客户点击的“创建”按钮。后台不会发生任何事。

默认值没有问题。好的默认值能为客户节省时间,大多数人也会接受。悄悄执行则不行。两者在工作量上差别很小,在意义上差别很大:有默认值时,由客户做决定;没有审核步骤时,就是我们替他们做了决定。

这条规则并不只针对 Pixel。它适用于我们可能在客户账户中创建的任何东西,无论是标签、受众,还是平台上的其他实体。

// Illustrative: a change we propose, but never apply on our own
type ProposedAction = {
  kind: 'create';
  resourceType: string;  // what will be created
  name: string;          // suggested by us, editable by the customer
  parentId: string;      // the account or business it will live under
  purpose: string;       // what we will do with it, in plain words
  confirmedBy?: string;  // empty until the customer presses Create
};

真正有用的是最后一个字段。在有人确认之前,这个操作只是一个提议。

为什么这很重要

命名和归属的控制权留在客户手中。一个广告账户很少只由一个人或一个工具使用。一个名字没人选过、归属的商家也没人挑过的资源,往好了说是杂乱,往坏了说会造成混乱。

信任就是产品本身。连接广告账户的客户,等于把钥匙借给了我们。如果他们发现了我们未经询问就创建的东西,接下来的问题就是我们还做了什么。即使出发点是好的,悄悄创建也会让人觉得我们自作主张。

在别人的系统里制造意外,代价高昂。客户的账户不归我们所有,我们也看不到其中发生的其他一切。从我们这边看无害的更改,可能会与某人的命名规范或报表产生冲突。

这让支持和撤销都更容易。当客户是通过一个说明了用途的界面有意创建某样东西时,他们知道它从何而来。如果想撤销,他们也知道该找什么。而后台操作只会让他们自己去摸索。

不只是创建资源

同样的道理适用于产品在外部系统中所做的任何事,而不仅仅是创建资源。写入广告账户的一条排除规则,同样是对别人配置的更改。我的观点是,这类更改应当可见、可追溯:客户应该能看到做了什么,以及这是我们做的。这是我秉持的原则,而不是对我们每一个界面的描述。

要点

  1. 把客户的外部账户视为他们自己的,即使你拥有写入权限。
  2. 提供默认值,但让每一次创建都经过审核步骤,包括可编辑的名称、所在位置、用途和明确的确认按钮。
  3. 把资源创建建模为一个提议,只有在有人确认后才成为实际操作。
  4. 问问客户以后发现这个更改时是否会感到意外。如果会,就不要悄悄去做。