HubSpot 表單提交觸發器遺失 - 無法使用 webhook

我想從 Relay 改用 n8n。我在 Relay 中設定了 Hubspot OAuth 和 API 服務金鑰,OAuth 連接能夠將第一步設定為 Hubspot 表單提交觸發器。我發現 n8n 尚未提供此功能,但它可以存取完全相同的基礎結構。

功能請求: 既然 Relay 已經實現了 Hubspot 的「表單提交」觸發事件,能否將其新增為 n8n 中的 Hubspot 觸發器?

社群徵詢: 我在 Hubspot 中沒有企業帳戶,無法使用替代的 Webhook 步驟來根據表單提交觸發。由於現有客戶有時會填寫這些 Hubspot 表單,我也無法根據建立的聯絡人來觸發。n8n AI 助手指引我設定另外的 Hubspot Developer API 認證。在 Hubspot 中產生該認證時,我可以獲得 API 權杖,但 n8n 需要應用 ID、用戶端 ID 等資訊,而 Developer API 並未提供這些資訊。如果我在公開市集中建立 Hubspot 應用程式,我可以新增這些用戶端 ID 和應用 ID 屬性,但這似乎不對。我不希望這在任何方面都是公開的。

有任何建議或協助嗎?

對於表單提交,在沒有企業帳戶的情況下,最簡潔的方式是使用 HubSpot 免費版本的 Workflows 自動化工具:建立一個由「表單已提交」觸發的簡單工作流程,然後新增一個 Webhook 動作,指向你的 n8n Webhook 節點 URL。這在 Starter/Pro 層級上都可以運作,不僅限於 Enterprise,並且避免了你在用戶端 ID/應用程式 ID 上遇到的整個 Developer API 應用程式註冊麻煩。你不需要公開市集應用程式,HubSpot 的內部工作流程 webhook 不需要那樣。這完全規避了需要企業 webhook 訂閱功能的問題。

不幸的是,Hubspot 在發佈 Data Hub 後改變了這一點,你無法在 Starter 或 Pro 層級的 Sales Hub 或 Marketing Hub 的工作流程中執行 webhook 操作。也許我遺漏了什麼,但這裡是 Hubspot 明確說明的地方。還有這個頁面的頂部。不過我很希望我在這裡遺漏了什麼 :slight_smile:

「傳送 webhook(Data Hub 專業版企業版專用)

觸發 webhook 至外部應用程式。這允許你的工作流程與該外部應用程式通訊。例如,webhook 可以將 HubSpot 公司的資訊(以 JSON 格式)傳送至外部 CRM。此操作可用於所有工作流程類型。

深入了解**觸發 webhook**。」
1 個讚

好眼力,該動作現在確實需要 Data Hub Pro。既然工作流 webhook 動作已停用,請改為使用輪詢而不是推送:建立具有表單範圍的 HubSpot Private App,然後使用 n8n Schedule Trigger 加上 HTTP Request 節點呼叫 GET https://api.hubapi.com/marketing/v3/forms/{formId}/submissions,並使用 Private App 令牌作為 Bearer 驗證。儲存最後處理的 submittedAt 或 id(可使用 Data Table 甚至簡單的 Set/IF 與前一次執行進行比較),這樣您只會將新提交內容轉發到您的 CRM 步驟。這樣可以避免 Data Hub webhook 的需求和您試圖避免的公開應用程式註冊。先單獨測試 HTTP Request 節點,並確認回應包含具有可篩選的 submittedAt 時間戳記的結果陣列。

謝謝,那是個好主意。我甚至可以把它設定為每15分鐘執行一次,而且只抓取新的項目——那肯定可行。我會試試看。謝謝!

既然你打算試試 15 分鐘輪詢的方式,我建議採用一個有檢查點的小型工作流程,而不是直接的「輪詢 → CRM」流程。這樣一來,重試或部分失敗就不會導致表單提交重複。

一個可行的 n8n 架構:

  1. Schedule Trigger——每 15 分鐘執行一次。
  2. HTTP Request: list HubSpot form submissions——使用 HubSpot Private App token 作為 Authorization: Bearer ...;呼叫你關心的特定表單的提交端點。
  3. Code: filter only new submissions——將 submittedAt / 提交 id 與已保存的檢查點進行比較。
  4. Split In Batches——逐次處理每個新提交。
  5. CRM / downstream steps——建立/更新你在 Relay 中所做的操作。
  6. Code: save checkpoint only after success——只在 CRM 步驟成功後更新最後處理的時間戳/id,而不是在 CRM 步驟之前。

針對篩選/檢查點的 Code 節點,我會採用這個模式:

const staticData = $getWorkflowStaticData('global');
const lastSubmittedAt = staticData.lastSubmittedAt || '1970-01-01T00:00:00.000Z';

const submissions = $json.results || [];
const fresh = submissions
  .filter((submission) => new Date(submission.submittedAt) > new Date(lastSubmittedAt))
  .sort((a, b) => new Date(a.submittedAt) - new Date(b.submittedAt));

return fresh.map((submission) => ({
  json: {
    hubspotSubmissionId: submission.id || submission.submissionId,
    submittedAt: submission.submittedAt,
    formId: submission.formId,
    fields: submission.values || submission.submittedValues || [],
    raw: submission,
  },
}));

然後在下游 CRM 步驟成功後,新增一個最後的 Code 節點:

const staticData = $getWorkflowStaticData('global');
const newest = $input.all()
  .map((item) => item.json.submittedAt)
  .filter(Boolean)
  .sort()
  .at(-1);

if (newest) staticData.lastSubmittedAt = newest;
return $input.all();

一個需要注意的地方是:工作流程靜態資料在主動觸發執行時會可靠地保存,所以要手動測試 HTTP 節點,但要在工作流程啟用後測試檢查點行為。如果你需要重新處理一個失敗的時間視窗,可以暫時清除 lastSubmittedAt 或將其往回移幾分鐘。

透明說明:我使用 FlowForge AI 建立了這個有檢查點的輪詢藍圖,並根據你的 HubSpot/Data Hub 限制進行了調整。如果你想生成完整的 n8n JSON 版本,建構器在這裡:FlowForge AI — Build Smarter Workflows with AI

1 個讚

如果您的帳戶中 HubSpot 工作流程 webhook 受到限制,我會避免使用公開應用程式路徑。私有應用程式權杖足以用於內部輪詢工作流程。

備用方案是:

  1. 使用最少的 CRM 和表單範圍建立 HubSpot 私有應用程式
  2. 在 n8n 中,使用排程觸發器而不是 HubSpot 觸發器
  3. 使用 HTTP 請求搭配私有應用程式持有人權杖
  4. 查詢最近的表單提交或最近修改的聯絡人
  5. 篩選您關心的特定表單 ID
  6. 儲存游標,以便每次提交只處理一次
  7. 如果可用的話,保留以 form_submission_id 為鍵的重複排除表格,或以 form_id 加上 submitted_at 加上電子郵件/聯絡人 ID 為鍵

重要的部分是將聯絡人建立與表單提交分開。您說得沒錯,聯絡人建立會遺漏現有聯絡人提交新表單的情況。輪詢表單提交,然後按提交身分進行重複排除,是更安全的替代方案,直到 n8n 具有原生 HubSpot 表單提交觸發器為止。

我也會設計第一個版本每 2 到 5 分鐘執行一次,而不是嘗試模擬真正的即時觸發器。對於大多數表單工作流程而言,這已經夠接近了,並且可以避免依賴可能因方案變更而消失的 HubSpot webhook 動作。

建置之前,我會確認:

  1. 哪些確切的 HubSpot 表單應觸發工作流程
  2. 每個表單是否對應至相同的下游動作或不同的分支
  3. 哪個欄位證明提交是新的
  4. 已處理的提交 ID 應儲存在 n8n 的何處

這樣可以讓您擁有私有內部工作流程,而無需建立公開市集應用程式。