outreachmagic
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOutreach Magic
Outreach Magic
Your agent goes blind after send. We sync Smartlead, Instantly, HeyReach, and 5 more sequencers into one local SQLite database your agent can query directly.
The full suite: Pair with lead-enrich for Serper-based person research and email-finder for waterfall email enrichment. Both work standalone or together.
你的Agent在发送消息后会失去后续数据视野。我们将Smartlead、Instantly、HeyReach及另外5种序列器的数据同步到本地SQLite数据库,让你的Agent可以直接查询。
完整套件: 搭配基于Serper的人物调研工具lead-enrich,以及瀑布式邮箱富集工具email-finder使用。两者既可以独立运行,也可以配合使用。
CLI convention
CLI 约定
All commands below use the pipeline CLI in this skill's directory (run from the skill root, or use absolute paths from ):
scripts/pipeline.py pathsbash
python3 scripts/pipeline.py <command>Resolve install paths anytime:
bash
python3 scripts/pipeline.py pathsOptional config keys: (share one DB across platforms), , for local development.
data_rootapi_base_urldev_repo以下所有命令均使用本skill的目录中的pipeline CLI(从skill根目录运行,或使用返回的绝对路径):
scripts/pipeline.py pathsbash
python3 scripts/pipeline.py <command>随时查看安装路径:
bash
python3 scripts/pipeline.py paths可选配置项:(跨平台共享一个数据库)、、用于本地开发的。
data_rootapi_base_urldev_repoPlatform install
平台安装
Install from outreachmagic/outreachmagic — pin a release tag; download and verify SHA256 before running locally:
bash
OM_VERSION=v1.1.0
INSTALL_DIR=$(mktemp -d)
curl -fsSL "https://github.com/outreachmagic/outreachmagic/releases/download/${OM_VERSION}/install.sh" -o "${INSTALL_DIR}/install.sh"
curl -fsSL "https://github.com/outreachmagic/outreachmagic/releases/download/${OM_VERSION}/SHA256SUMS" -o "${INSTALL_DIR}/SHA256SUMS"
grep ' install.sh$' "${INSTALL_DIR}/SHA256SUMS" | (cd "${INSTALL_DIR}" && shasum -a 256 --check)
bash "${INSTALL_DIR}/install.sh" --platform hermes --tag "${OM_VERSION}"Installs outreachmagic, lead-enrich, and email-finder. Agent guide: AGENTS-INSTALL.md.
Use or for other agents. Setup: https://app.outreachmagic.io/onboarding
--platform cursor--platform claude从outreachmagic/outreachmagic安装——固定一个版本标签;在本地运行前下载并验证SHA256:
bash
OM_VERSION=v1.1.0
INSTALL_DIR=$(mktemp -d)
curl -fsSL "https://github.com/outreachmagic/outreachmagic/releases/download/${OM_VERSION}/install.sh" -o "${INSTALL_DIR}/install.sh"
curl -fsSL "https://github.com/outreachmagic/outreachmagic/releases/download/${OM_VERSION}/SHA256SUMS" -o "${INSTALL_DIR}/SHA256SUMS"
grep ' install.sh$' "${INSTALL_DIR}/SHA256SUMS" | (cd "${INSTALL_DIR}" && shasum -a 256 --check)
bash "${INSTALL_DIR}/install.sh" --platform hermes --tag "${OM_VERSION}"安装outreachmagic、lead-enrich和email-finder。Agent指南:AGENTS-INSTALL.md。
Hermes profiles
Hermes 配置文件
- Real install: — profiles symlink only (
~/.hermes/skills/)../../../skills/<skill> - Verify:
pipeline.py paths - New profile:
bash install.sh --platform hermes --profile <name> - Update: writes the global install; all profiles pick it up via symlink
pipeline.py update
- 正式安装路径: ——仅创建配置文件符号链接(
~/.hermes/skills/)../../../skills/<skill> - 验证:
pipeline.py paths - 新建配置文件:
bash install.sh --platform hermes --profile <name> - 更新: 会写入全局安装包;所有配置文件会通过符号链接自动获取更新
pipeline.py update
Cursor
Cursor
Install to . Invoke with or ask about your pipeline in plain English.
~/.cursor/skills/outreachmagic//outreachmagic安装到。通过调用,或用自然语言询问你的流水线状态。
~/.cursor/skills/outreachmagic//outreachmagicClaude Code
Claude Code
Install to . SKILL.md is the source of truth.
~/.claude/skills/outreachmagic/Environment variable: — overrides the config file . Set via , shell profile, or CI/CD.
OUTREACHMAGIC_AGENT_KEYagent_key.env安装到。SKILL.md为权威文档。
~/.claude/skills/outreachmagic/环境变量: ——覆盖配置文件中的。可通过、Shell配置文件或CI/CD设置。
OUTREACHMAGIC_AGENT_KEYagent_key.envFirst-Time Setup (read this first)
首次设置(请先阅读)
On startup, always check if the agent is already connected by running:
bash
python3 scripts/pipeline.py versionThen check whether an agent key exists in the config:
bash
python3 scripts/pipeline.py pullIf returns an error like "No agent key or token configured", the user needs to set up.
pullWhen setup is needed, run — a browser opens on the user's machine for sign-in. Tell the user: "I'm opening Outreach Magic sign-in — come back when you're done and I'll continue." Never paste secrets into chat.
pipeline.py loginIf the skill is not installed yet, point them to https://app.outreachmagic.io/onboarding or https://app.outreachmagic.io/agent, then connect.
Account access error: If login fails with an account error ( in CLI/API), tell the user there was a sign-in problem and direct them to support@outreachmagic.io for help.
account_revoked启动时,务必通过以下命令检查Agent是否已连接:
bash
python3 scripts/pipeline.py version然后检查配置中是否存在Agent密钥:
bash
python3 scripts/pipeline.py pull如果返回类似"No agent key or token configured"的错误,用户需要进行设置。
pull需要设置时,运行 ——用户设备上会打开浏览器用于登录。告知用户:"我正在打开Outreach Magic登录页面——完成后请返回,我会继续操作。" 切勿在聊天中粘贴密钥。
pipeline.py login如果skill尚未安装,请引导用户访问**https://app.outreachmagic.io/onboarding**或**https://app.outreachmagic.io/agent**,然后进行连接。
账户访问错误: 如果登录时出现账户错误(CLI/API中显示),告知用户登录出现问题,并引导他们联系support@outreachmagic.io寻求帮助。
account_revokedCommon workflows (plain English)
常见工作流(自然语言对应)
| User says | You do |
|---|---|
| "Show my pipeline" | |
| "Import my Sales Nav / Vayne CSV" | |
| "Find emails for these leads" | import if needed → |
| "Export to Google Sheets" | |
| "Connect Smartlead / Instantly" | |
pipeline.py whoami --jsoninit<skill_home>/databases/<skill_home>/config/agent_secrets.envoutreachmagic_config.jsonoutreachmagic/imports/outreachmagic/exports/"project_root"pipeline.py pathsbatches/sheets/archive/logs/If returns auth errors after a revoked key, ask Outreach Magic to log in again.
pullThat's it. Don't list other commands, don't offer alternatives. Just connect via login, done.
When setup is already done (pull succeeds or returns events), skip setup and go straight to showing data:
bash
python3 scripts/pipeline.py pull
python3 scripts/pipeline.py show| 用户提问 | 你执行的操作 |
|---|---|
| "展示我的流水线" | |
| "导入我的Sales Nav / Vayne CSV" | 先执行 |
| "为这些线索查找邮箱" | 如需导入则先导入 → |
| "导出到Google Sheets" | |
| "连接Smartlead / Instantly" | |
pipeline.py whoami --jsoninit<skill_home>/databases/<skill_home>/config/agent_secrets.envoutreachmagic_config.jsonoutreachmagic/imports/outreachmagic/exports/"project_root"pipeline.py pathsbatches/sheets/archive/logs/如果密钥失效后返回认证错误,请让用户重新登录Outreach Magic。
pull操作到此为止。不要列出其他命令,不要提供替代方案。只需通过登录完成连接即可。
当已完成设置时(成功或返回事件),跳过设置步骤直接展示数据:
pullbash
python3 scripts/pipeline.py pull
python3 scripts/pipeline.py showNetwork & privacy (Hermes / hub review)
网络与隐私(Hermes / hub 审核)
- Default: All lead and pipeline data stays in local SQLite.
- Inbound only: imports webhook/agent events from
pull(user- or cron-initiated).api.outreachmagic.io - Outbound upload: Only when the user (or agent following user instruction) runs . Import and local edits never auto-upload.
pipeline.py sync - Update check: The CLI may query GitHub for a newer release tag (read-only, no lead data; at most once per hour). See SECURITY.md.
- 默认规则: 所有线索和流水线数据都存储在本地SQLite中。
- 仅入站: 从
pull导入webhook/Agent事件(由用户或定时任务触发)。api.outreachmagic.io - 仅出站上传: 仅当用户(或Agent遵循用户指令)运行****时才会上传。导入和本地编辑不会自动上传。
pipeline.py sync - 版本检查: CLI可能会查询GitHub获取更新版本标签(只读,不涉及线索数据;每小时最多一次)。详见SECURITY.md。
Version
版本
One version for the whole skill. To see what is installed, always run:
bash
python3 scripts/pipeline.py versionThe line in this file is synced from on install/update. If unsure, use the command above.
version:scripts/VERSIONUpdates are user-triggered. The CLI may print an update notice (at most once per hour) when a newer GitHub release exists. It never downloads or replaces scripts automatically. Install updates with:
bash
python3 scripts/pipeline.py update整个skill使用统一版本。要查看已安装的版本,请始终运行:
bash
python3 scripts/pipeline.py version本文件中的行在安装/更新时会从同步。如有疑问,请使用上述命令查询。
version:scripts/VERSION更新由用户触发。当GitHub上存在更新的正式版本时,CLI可能会打印更新通知(每小时最多一次)。它不会自动下载或替换脚本。使用以下命令安装更新:
bash
python3 scripts/pipeline.py updateor
或
hermes skills update
Check without installing: `pipeline.py update --check`. Install a specific release: `pipeline.py update --tag v1.1.0`.
Install commands for each platform are in **Platform install** above. After install, run `python3 scripts/pipeline.py login`.hermes skills update
仅检查更新不安装:`pipeline.py update --check`。安装特定版本:`pipeline.py update --tag v1.1.0`。
各平台的安装命令见上文**平台安装**部分。安装后,运行`python3 scripts/pipeline.py login`。When to Use
使用场景
- You are about to send outreach (email, LinkedIn message, WhatsApp, etc.)
- You are researching a prospect and want to track them
- The user asks "show me my pipeline" or "how is outreach going"
- The user says "track this" followed by outreach details
- The user wants to connect a sequencer (paid — requires token)
- The user asks for campaign breakdowns or counts by campaign name
- The user asks for workspace inventory (counts by tag, LinkedIn connection accepted by sender)
- The user asks about connection status, webhook URLs, or platform health (,
status)connections - The user wants to add or remove a platform connection (,
connect-platform)disconnect-platform
- 你即将发送拓展消息(邮件、LinkedIn消息、WhatsApp等)
- 你正在调研潜在客户并想要跟踪他们
- 用户询问"展示我的流水线"或"拓展进展如何"
- 用户说"跟踪这个"并附上拓展细节
- 用户想要连接序列器(付费功能——需要令牌)
- 用户询问活动细分或按活动名称统计数量
- 用户询问工作区清单(按标签统计数量、按发送者统计LinkedIn通过的请求数量)
- 用户询问连接状态、webhook URL或平台健康状况(使用、
status命令)connections - 用户想要添加或移除平台连接(使用、
connect-platform命令)disconnect-platform
Agent Behavior Rules (Important)
Agent行为规则(重要)
- For bulk enrichment (CSV, spreadsheet export, Apollo/Clay dump): use , not repeated
import-profiles.add-lead - Reads (analytics, counts, time windows): use presets first — one query, max two attempts. See references/query-guide.md. Do not tour
pipeline.py querywhen the question is relay volume (useworkspace_lead_events).events - Writes: only mutation commands (
pipeline.py,add-lead,import-profiles,log-event, personalize, tags, etc.). Neversync/INSERT/UPDATEvia ad-hoc scripts.DELETE - After any , explicitly report the exact number of new records imported.
pull - When the user asks about version, run (authoritative).
pipeline.py version - When the user asks for message content, use on the specific lead.
history - For copy-performance analysis (full subject/body on positive leads + winner), use .
copy-insights - For all-time campaign totals (no time window), use or
campaigns. For last N hours/days by campaign, usestatsorquery engagement— notquery replies.campaigns - For tag counts or LinkedIn connection counts by sender, use . On large workspaces (>2,000 leads), add
workspace summary --workspace <slug> --jsonfor faster tag rollups. Do not use--tags-onlyor custom Python to aggregate.export - Tags () and LinkedIn connection state (
workspace_lead_tags,workspace_lead_linkedin_statusper sender) are different.is_connected - When the user asks about connections, webhook URLs, or platform health, use or
status.connections - When the user wants to connect a new platform, use .
connect-platform --platform <id> - If the user reports slowness, disk use, or pipeline oddities: run first (local, no network).
db-health - Never run unless the user asked. Never run
syncwithout explicit confirmation afterarchive --purge.--dry-run - Before adding platforms or debugging vendor event types, run .
pipeline.py platform-map --json - Answer format for analytics: (1) human table, (2) preset name or SQL used, (3) freshness note (local DB; offer if they need latest relay data).
pull
- 对于批量富集(CSV、电子表格导出、Apollo/Clay数据):使用****,不要重复调用
import-profiles。add-lead - 读取操作(分析、统计、时间窗口): 优先使用**预设——一次查询,最多尝试两次。详见references/query-guide.md。当问题涉及消息量时,不要遍历
pipeline.py query(使用workspace_lead_events**命令)。events - 写入操作: 仅使用的变更命令(
pipeline.py、add-lead、import-profiles、log-event、个性化设置、标签等)。切勿通过临时脚本执行sync/INSERT/UPDATE操作。DELETE - 任何操作后,明确报告导入的新记录的确切数量。
pull - 当用户询问版本时,运行****(权威来源)。
pipeline.py version - 当用户询问消息内容时,对特定线索使用命令。
history - 对于文案效果分析(获取有意向线索的完整主题/正文及最优模板),使用命令。
copy-insights - 对于全时段活动总计(无时间窗口),使用或
campaigns命令。对于最近N小时/天的活动统计,使用**stats或query engagement**——不要使用query replies。campaigns - 对于标签统计或按发送者统计LinkedIn连接数量,使用**。对于大型工作区(>2000条线索),添加
workspace summary --workspace <slug> --json**以加快标签汇总速度。不要使用--tags-only或自定义Python脚本进行聚合。export - 标签()和LinkedIn连接状态(
workspace_lead_tags、每个发送者的workspace_lead_linkedin_status)是不同的概念。is_connected - 当用户询问连接状态、webhook URL或平台健康状况时,使用或
status命令。connections - 当用户想要连接新平台时,使用命令。
connect-platform --platform <id> - 如果用户报告速度慢、磁盘占用高或流水线异常:首先运行****(本地操作,无需网络)。
db-health - 除非用户要求,否则切勿运行。除非在
sync后得到明确确认,否则切勿运行--dry-run。archive --purge - 在添加平台或调试供应商事件类型之前,运行。
pipeline.py platform-map --json - 分析结果的回复格式: (1) 人性化表格,(2) 使用的预设名称或SQL,(3) 数据新鲜度说明(本地数据库;如果用户需要最新的中继数据,可提供操作)。
pull
Which table? (read path)
选择哪个表?(读取路径)
| User intent | Use |
|---|---|
| Replies / engagement / campaign breakdowns (time window) | |
| Lead list with stage/sentiment | |
| Tag counts, LinkedIn connected-by-sender | |
| Message bodies / copy winners | |
| Workspace ingest audit (rare) | |
workspace_lead_eventsevents| 用户意图 | 使用命令/表 |
|---|---|
| 回复/互动/活动细分(带时间窗口) | |
| 带阶段/情感的线索列表 | |
| 标签统计、按发送者统计LinkedIn连接数量 | |
| 消息正文/最优文案 | |
| 工作区导入审计(罕见场景) | |
workspace_lead_eventseventsFast analytics (preferred)
快速分析(推荐)
bash
python3 scripts/pipeline.py query engagement --workspace <slug> --since 48h --json
python3 scripts/pipeline.py query replies --workspace <slug> --since 7d --json
python3 scripts/pipeline.py query interested --workspace <slug> --since 48h --jsonAdvanced: (read-only).
pipeline.py query --sql 'SELECT …' --params '["popcam |%"]' --jsonRead commands print data freshness on stderr (and / in ). If data is a few minutes old, tell the user before running unless they asked for up-to-the-minute.
last_pullstale_minutes--jsonpull| User intent | Command |
|---|---|
| Reply/engagement counts in a time window | |
| Lead rows / pipeline detail | |
| All-time totals | |
| Fresh webhook events | |
bash
python3 scripts/pipeline.py query engagement --workspace <slug> --since 48h --json
python3 scripts/pipeline.py query replies --workspace <slug> --since 7d --json
python3 scripts/pipeline.py query interested --workspace <slug> --since 48h --json高级用法:(只读)。
pipeline.py query --sql 'SELECT …' --params '["popcam |%"]' --json读取命令会在stderr中打印数据新鲜度(格式中会包含 / )。如果数据已过时几分钟,在运行前告知用户,除非用户明确要求实时数据。
--jsonlast_pullstale_minutespull| 用户意图 | 命令 |
|---|---|
| 时间窗口内的回复/互动统计 | |
| 线索行/流水线详情 | |
| 全时段总计 | |
| 最新webhook事件 | |
Pull policy (when to refresh)
Pull策略(何时刷新)
Do not run before local time-window analytics (, , engagement by campaign) unless the user asks for latest/refresh or you need relay catch-up.
pulllast 48hsince todayRun first when showing live pipeline activity the user expects to be current (, for “what just happened”), or when they say sync/refresh/latest.
pullshowhistorybash
python3 scripts/pipeline.py pull
python3 scripts/pipeline.py pull --if-stale 5m # skip when last_pull is within 5 minutes
python3 scripts/pipeline.py pull --force # always network (ignore --if-stale)If routing sync times out but you only need webhook events, use:
bash
python3 scripts/pipeline.py pull --skip-routing-syncThis fetches the latest events from the relay. Skip for offline/local analytics; use for fresh activity timelines.
Relay sync progress (stdout): When interpreting / output or , use the log legend in docs/relay-sync-progress.md. Short version:
pullsyncoutreachmagic/logs/batch_sync.log- ↓ pull / ↑ push — cloud → local vs local → cloud
- Event, Lead, Workspace, Company — four streams (Lead = org lead core; Workspace = per-workspace lead overlay, not routing config)
- Pending banner: on counts/page estimate once per stream start, e.g.
~[02:10] ↓ Event : ~12,400 pending (~13p @ 1000/p) ... - Per page: (pull, no
[02:11] ↓ Event : p13/62 — 1,000 this page, 13,000/62,400 (20%) ...)ok - : backlog only (
pull --probe/stream, no ingest) — use before a large catch-up pulllimit=1 - : webhook events only (recommended after events catch-up; avoids slow snapshot phase)
pull --skip-snapshots - : zero snapshot cursors before pull (after DB delete or hung pull left config ahead of local leads)
pull --reset-snapshot-cursors - : same as
pull --kind eventswhen you only need the event cursor advanced--skip-snapshots - Push page: then
[03:56] ↑ Event : p2/13 — ok 7.9s, 5,000 this page (10,000/62,093 (16%))done — N in Mp (Xs) - : outer
batch_sync.log= lead-id walk; innerbatch 1/46= HTTP pages inside onepN/M. Do not confuse them.sync
Relay sync limits: Same endpoints always — and . No separate bulk URLs.
POST /pushGET /pull- (upload): When local
syncsnapshots ≥ 2500, uses 5000 entries percloud_pending; otherwise routine batch size (default 200, max 500 per request)./push - (download): 1000 rows/page for events and all snapshots (D1 + local ingest). Progress shows
pullandp2/118after a one-time pending probe per snapshot kind. Use% remainingif snapshots are already synced.pull --kind events - Filter downloaded data locally (, workspace queries) — the relay does not filter by date or workspace.
show --since
在进行本地时间窗口分析前(如、、按活动统计互动),不要运行,除非用户要求最新/刷新数据,或你需要补集中继数据。
最近48小时今日以来pull当展示用户预期为实时的流水线活动时(如、查询“刚刚发生了什么”的),或用户提到同步/刷新/最新时,先运行。
showhistorypullbash
python3 scripts/pipeline.py pull
python3 scripts/pipeline.py pull --if-stale 5m # 当最后一次pull在5分钟内时跳过
python3 scripts/pipeline.py pull --force # 始终进行网络请求(忽略--if-stale)如果路由同步超时但你只需要webhook事件,使用:
bash
python3 scripts/pipeline.py pull --skip-routing-sync这会从中继获取最新事件。离线/本地分析时跳过;用于获取新鲜活动时间线时使用。
中继同步进度(标准输出): 解读 / 输出或时,请参考docs/relay-sync-progress.md中的日志图例。简化版本:
pullsyncoutreachmagic/logs/batch_sync.log- ↓ pull / ↑ push —— 云端→本地 与 本地→云端
- Event, Lead, Workspace, Company —— 四个数据流(Lead = 组织核心线索;Workspace = 每个工作区的线索覆盖层,不是路由配置)
- Pending提示: 每个数据流启动时,计数/页数估算前会显示,例如
~[02:10] ↓ Event : ~12,400 pending (~13p @ 1000/p) ... - 每页进度: (pull操作,无
[02:11] ↓ Event : p13/62 — 1,000 this page, 13,000/62,400 (20%) ...标记)ok - : 仅查看积压数据(每个数据流
pull --probe,不导入)——在大型补全pull前使用limit=1 - : 仅获取webhook事件(建议在事件补全后使用;避免缓慢的快照阶段)
pull --skip-snapshots - : 在pull前重置快照游标(在删除数据库或pull挂起导致配置超前于本地线索时使用)
pull --reset-snapshot-cursors - : 与
pull --kind events作用相同,当你只需要推进事件游标时使用--skip-snapshots - Push页进度: 然后显示
[03:56] ↑ Event : p2/13 — ok 7.9s, 5,000 this page (10,000/62,093 (16%))done — N in Mp (Xs) - : 外层
batch_sync.log= 线索ID遍历;内层batch 1/46= 单次pN/M中的HTTP分页。不要混淆两者。sync
中继同步限制: 始终使用相同的端点——和。没有单独的批量URL。
POST /pushGET /pull- (上传): 当本地
sync快照≥2500时,每次cloud_pending请求发送5000条数据;否则使用常规批量大小(默认200,最大500条/请求)。/push - (下载): 事件和所有快照(D1 + 本地导入)每页1000行。进度会在每个快照类型的一次性pending探测后显示
pull和p2/118。如果快照已同步,使用剩余百分比。pull --kind events - 本地过滤下载的数据(、工作区查询)——中继不支持按日期或工作区过滤。
show --since
Workspace inventory
工作区清单
workspace summarypullbash
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py workspace summary --workspace <slug> --json --tags-onlyExample JSON keys: , , (, ), (, , ), . With , LinkedIn keys are empty arrays/zero.
lead_countlast_pulltagstaglead_countlinkedin_senderssender_slugconnectedpendinglinkedin_connected_leads--tags-onlyCompanion attempt tags: (lead-enrich), / (email-finder), (MillionVerifier bulk — verification status still in ). Found email is represented by , , and — not a separate tag.
serper_attemptedtrykitt_attemptedicypeas_attemptedmv_attemptedemail_verification_statusleads.emaillatest_sourceemail_verification_statusTag-only (same tag data as summary): .
pipeline.py tag list --workspace <slug>****仅读取本地SQLite(速度快,可离线使用)。当用户询问按标签或LinkedIn发送者连接状态统计数量时使用。如果用户需要最新同步的标签/连接数据,可先执行。
workspace summarypullbash
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py workspace summary --workspace <slug> --json --tags-only示例JSON键:、、(、)、(、、)、。使用时,LinkedIn相关键为空数组/零值。
lead_countlast_pulltagstaglead_countlinkedin_senderssender_slugconnectedpendinglinkedin_connected_leads--tags-only配套尝试标签:(lead-enrich)、 / (email-finder)、(MillionVerifier批量验证——验证状态仍存储在中)。找到的邮箱通过、和表示——不是单独的标签。
serper_attemptedtrykitt_attemptedicypeas_attemptedmv_attemptedemail_verification_statusleads.emaillatest_sourceemail_verification_status仅查看标签(与summary中的标签数据相同):。
pipeline.py tag list --workspace <slug>Free Tier
免费版
- Unlimited local tracking, enrichment, queries, and exports
- 1,000 webhook events / period (sequencer webhooks + cloud sync)
- 1 sequencer connection, single workspace
- 无限制本地跟踪、富集、查询和导出
- 每个周期1000条webhook事件(序列器webhook + 云端同步)
- 1个序列器连接,单个工作区
Pro Tier ($9/mo)
专业版($9/月)
- 50,000 webhook and sync events / month
- All sequencers, multi-workspace routing
- 每月50,000条webhook和同步事件
- 支持所有序列器,多工作区路由
Agency Tier ($29/mo)
企业版($29/月)
- 250,000 webhook and sync events / month
- All sequencers, unlimited workspaces, priority support
- 每月250,000条webhook和同步事件
- 支持所有序列器,无限制工作区,优先支持
What counts
计费规则
Only webhook and sync traffic: sequencer webhooks and uploads to the cloud (one event per sync batch, not per lead). Local tracking (, ), enrichment dedup, email finding, queries, and exports do not count.
pipeline.py synclog-eventadd-lead仅对webhook和同步流量计费:序列器webhook和上传到云端的流量(每个同步批次计为一个事件,而非每条线索)。本地跟踪(、)、富集去重、邮箱查找、查询和导出不计费。
pipeline.py synclog-eventadd-leadOver limit
超出限额
Sequencer webhooks are always accepted. Over-quota events are buffered and delivered on your next or when the quota resets. Events are only rejected if the buffer cap is reached. Check status with .
pullpipeline.py statusSign up at https://outreachmagic.io
序列器webhook始终会被接收。超出配额的事件会被缓冲,并在下次或配额重置时交付。仅当缓冲区上限达到时才会拒绝事件。使用查看状态。
pullpipeline.py statusQuick Start
快速开始
bash
python3 scripts/pipeline.py version
python3 scripts/pipeline.py query engagement --workspace <slug> --since 48h --json
python3 scripts/pipeline.py show
python3 scripts/pipeline.py history --id 1
python3 scripts/pipeline.py history --email j@acme.com
python3 scripts/pipeline.py stats
python3 scripts/pipeline.py campaigns
python3 scripts/pipeline.py platform-map --json
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py copy-insights --lead-status interested --json
python3 scripts/pipeline.py import-profiles --file leads.csv
python3 scripts/pipeline.py agent-changes
python3 scripts/pipeline.py agent-changes --file changes.csvbash
python3 scripts/pipeline.py version
python3 scripts/pipeline.py query engagement --workspace <slug> --since 48h --json
python3 scripts/pipeline.py show
python3 scripts/pipeline.py history --id 1
python3 scripts/pipeline.py history --email j@acme.com
python3 scripts/pipeline.py stats
python3 scripts/pipeline.py campaigns
python3 scripts/pipeline.py platform-map --json
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py copy-insights --lead-status interested --json
python3 scripts/pipeline.py import-profiles --file leads.csv
python3 scripts/pipeline.py agent-changes
python3 scripts/pipeline.py agent-changes --file changes.csvStatus and connection management
状态与连接管理
Dashboard-style status, connection management, and webhook URL generation — all from the CLI. These commands talk to the app API and do not require a local database.
bash
undefined通过CLI实现仪表盘式状态查看、连接管理和webhook URL生成——所有操作都无需本地数据库。
bash
undefinedDashboard overview: plan, usage, per-platform health, routing
仪表盘概览:套餐、使用情况、各平台健康状况、路由
python3 scripts/pipeline.py status
python3 scripts/pipeline.py status
List all connections with webhook URLs and 30-day event counts
列出所有连接,包含webhook URL和30天事件统计
python3 scripts/pipeline.py connections
python3 scripts/pipeline.py connections --json
python3 scripts/pipeline.py connections
python3 scripts/pipeline.py connections --json
Generate a webhook URL for a new platform
为新平台生成webhook URL
python3 scripts/pipeline.py connect-platform --platform smartlead
python3 scripts/pipeline.py connect-platform --platform smartlead
Remove a platform connection (webhook URL stops working)
移除平台连接(webhook URL将失效)
python3 scripts/pipeline.py disconnect-platform --platform smartlead
python3 scripts/pipeline.py disconnect-platform --platform smartlead --yes
undefinedpython3 scripts/pipeline.py disconnect-platform --platform smartlead
python3 scripts/pipeline.py disconnect-platform --platform smartlead --yes
undefinedAgent-created changes (cross-platform sync)
Agent创建的变更(跨平台同步)
Show locally-created leads and events (not from relay) as JSON or CSV. Useful for transferring data between platforms (Cursor, Hermes, Claude Code).
bash
undefined以JSON或CSV格式展示本地创建的线索和事件(非来自中继)。适用于在平台间传输数据(Cursor、Hermes、Claude Code)。
bash
undefinedJSON to stdout (pipe to relay push or save to file)
输出JSON到标准输出(可管道到中继推送或保存到文件)
python3 scripts/pipeline.py agent-changes
python3 scripts/pipeline.py agent-changes
CSV file (import-profiles compatible)
输出到CSV文件(与import-profiles兼容)
python3 scripts/pipeline.py agent-changes --file local_changes.csv
python3 scripts/pipeline.py agent-changes --file local_changes.csv
Filter to a specific workspace
过滤特定工作区
python3 scripts/pipeline.py agent-changes --workspace leadgenph
python3 scripts/pipeline.py agent-changes --workspace leadgenph
Include all leads (not just locally-created)
包含所有线索(不仅是本地创建的)
python3 scripts/pipeline.py agent-changes --all
**Push to relay for cross-platform sync:**
```bash
python3 scripts/pipeline.py syncsyncexternal_idcompany_domainskipassign/pushsync --no-health-reportpull --fullpython3 scripts/pipeline.py agent-changes --all
**推送到中继以实现跨平台同步:**
```bash
python3 scripts/pipeline.py syncsyncexternal_idcompany_domainskipassign/pushsync --no-health-reportpull --fullQuarantine (multi-workspace)
隔离区(多工作区)
Unmapped webhook events land in . Resolve locally, then so other machines and stay consistent.
unmapped_campaign_queuesyncpull --fullNo campaign id/name: New webhook events are quarantined automatically. Legacy rows in with are backfilled on into quarantine and auto-skipped (no workspace mapping possible). Use to inspect event details if needed. Manual: .
eventscampaign_id IS NULLinithistoryquarantine backfill-no-campaignbash
python3 scripts/pipeline.py quarantine list [--json] [--status all]
python3 scripts/pipeline.py quarantine skip --id QUEUE_ID
python3 scripts/pipeline.py quarantine skip --campaign-id CAMPAIGN_ID
python3 scripts/pipeline.py quarantine skip --reason REASON
python3 scripts/pipeline.py quarantine assign --id QUEUE_ID --workspace WORKSPACE_SLUG
python3 scripts/pipeline.py quarantine replay
python3 scripts/pipeline.py sync- — ignore junk/test events on the relay (permanent after sync).
skip - — route future pulls to a workspace (ingested on next
assign, not immediately).pull - — bulk re-ingest pending rows locally after adding
replayrules (no relay resolution).campaign-map
Relay stores resolutions in D1 (). The first event page of each requests them (); later pages reuse the in-memory map.
queue_resolutionspullinclude_queue_resolutions=1sync --statusrecommended_modebulkcloud_pending_leadspushrelay_untracked_leadscloud_pending_leadssynclocal_agent_events未映射的webhook事件会进入。在本地解决后,运行以确保其他机器和保持一致。
unmapped_campaign_queuesyncpull --full无活动ID/名称: 新的webhook事件会自动进入隔离区。中的旧行会在时回填到隔离区并自动跳过(无法进行工作区映射)。如有需要,使用查看事件详情。手动操作:。
eventscampaign_id IS NULLinithistoryquarantine backfill-no-campaignbash
python3 scripts/pipeline.py quarantine list [--json] [--status all]
python3 scripts/pipeline.py quarantine skip --id QUEUE_ID
python3 scripts/pipeline.py quarantine skip --campaign-id CAMPAIGN_ID
python3 scripts/pipeline.py quarantine skip --reason REASON
python3 scripts/pipeline.py quarantine assign --id QUEUE_ID --workspace WORKSPACE_SLUG
python3 scripts/pipeline.py quarantine replay
python3 scripts/pipeline.py sync- —— 忽略中继上的垃圾/测试事件(同步后永久生效)。
skip - —— 将未来的pull路由到指定工作区(在下次pull时导入,不会立即导入)。
assign - —— 添加
replay规则后,批量重新导入本地待处理行(不涉及中继解决)。campaign-map
中继将解决方案存储在D1()中。每次的第一页事件会请求这些解决方案();后续页面会复用内存中的映射。
queue_resolutionspullinclude_queue_resolutions=1sync --statuscloud_pending_leadsrecommended_modebulkpushrelay_untracked_leadscloud_pending_leadssynclocal_agent_eventsLocal database health
本地数据库健康
bash
python3 scripts/pipeline.py db-health
python3 scripts/pipeline.py db-health --json
python3 scripts/pipeline.py db-health --fullRead , (each has a ), , and . Cloud copy: → after user has run .
healthStatusrulesTriggeredhintrowCountstableBreakdownGET /api/agent/statuslocalDbsyncbash
python3 scripts/pipeline.py db-health
python3 scripts/pipeline.py db-health --json
python3 scripts/pipeline.py db-health --full查看、(每个都有)、和。云端副本:用户运行后, → 。
healthStatusrulesTriggeredhintrowCountstableBreakdownsyncGET /api/agent/statuslocalDbArchive a workspace (local only)
归档工作区(仅本地)
bash
python3 scripts/pipeline.py archive --workspace acme_corp --dry-run
python3 scripts/pipeline.py archive --workspace acme_corp --output ~/archives/acme_corp.db
python3 scripts/pipeline.py archive --workspace acme_corp --output ~/archives/acme_corp.db --purgeFresh DB + full CSV round-trip:
bash
pipeline.py import-profiles --file nace.csv --workspace acme_corp --import-batch-id nace-2026
pipeline.py syncbash
python3 scripts/pipeline.py archive --workspace acme_corp --dry-run
python3 scripts/pipeline.py archive --workspace acme_corp --output ~/archives/acme_corp.db
python3 scripts/pipeline.py archive --workspace acme_corp --output ~/archives/acme_corp.db --purge全新数据库 + 完整CSV往返:
bash
pipeline.py import-profiles --file nace.csv --workspace acme_corp --import-batch-id nace-2026
pipeline.py syncnew machine:
新机器:
pipeline.py init && pipeline.py pull --full
**File-based transfer (no server):**
```bashpipeline.py init && pipeline.py pull --full
**基于文件的传输(无需服务器):**
```bashMachine A: export
机器A:导出
pipeline.py agent-changes --file changes.csv
pipeline.py agent-changes --file changes.csv
Machine B: import
机器B:导入
pipeline.py import-profiles --file changes.csv --overwrite
undefinedpipeline.py import-profiles --file changes.csv --overwrite
undefinedWorkspace inventory
工作区清单
Counts by tag and LinkedIn connection accepted/pending per sender. Local DB only — no relay call; in output shows data freshness.
last_pullbash
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py workspace summary --workspace <slug>
python3 scripts/pipeline.py tag list --workspace <slug>按标签和LinkedIn连接通过/待处理状态(按发送者)统计数量。仅本地数据库——无需调用中继;输出中的显示数据新鲜度。
last_pullbash
python3 scripts/pipeline.py workspace summary --workspace <slug> --json
python3 scripts/pipeline.py workspace summary --workspace <slug>
python3 scripts/pipeline.py tag list --workspace <slug>Campaign breakdown
活动细分
Relay imports auto-populate campaign names from webhook payloads (Smartlead, PlusVibe, etc.).
bash
python3 scripts/pipeline.py campaigns
python3 scripts/pipeline.py campaigns --jsonstatscampaigns中继导入会自动从webhook负载中填充活动名称(Smartlead、PlusVibe等)。
bash
python3 scripts/pipeline.py campaigns
python3 scripts/pipeline.py campaigns --jsonstatscampaignsPlusVibe webhooks (status + sentiment)
PlusVibe webhooks(状态 + 情感)
Point PlusVibe webhooks at your relay URL (). Select all event types and category labels in PlusVibe — including any custom categories in the user’s instance. Standard ones to verify:
…/plusvibe/{token}- ,
EMAIL_SENT,ALL_EMAIL_REPLIESBOUNCED_EMAIL - ,
LEAD_MARKED_AS_INTERESTED,LEAD_MARKED_AS_NOT_INTERESTED,LEAD_MARKED_AS_OUT_OF_OFFICELEAD_MARKED_AS_AUTOMATIC_REPLY - ,
LEAD_MARKED_AS_MEETING_BOOKED,LEAD_MARKED_AS_MEETING_COMPLETED,LEAD_MARKED_AS_WRONG_PERSONLEAD_MARKED_AS_CLOSED
Do not enable (duplicates ) or (subset of ). Leave “Skip out of office replies” and “Skip autoreplies” unchecked.
ALL_POSITIVE_REPLIESALL_EMAIL_REPLIESFIRST_EMAIL_REPLIESALL_EMAIL_REPLIESEach webhook is stored as an event. Interested / not interested / sentiment come from label webhooks, not from reply webhooks alone. OOO is classified as auto-reply (metadata flag, query with ). Bounces set event sentiment but do not auto-move the lead to stage (use to find them).
--auto-reply trueinvalidlost--sentiment invalid将PlusVibe webhook指向你的中继URL()。在PlusVibe中选择所有事件类型和类别标签——包括用户实例中的任何自定义类别。需验证的标准类型:
…/plusvibe/{token}- ,
EMAIL_SENT,ALL_EMAIL_REPLIESBOUNCED_EMAIL - ,
LEAD_MARKED_AS_INTERESTED,LEAD_MARKED_AS_NOT_INTERESTED,LEAD_MARKED_AS_OUT_OF_OFFICELEAD_MARKED_AS_AUTOMATIC_REPLY - ,
LEAD_MARKED_AS_MEETING_BOOKED,LEAD_MARKED_AS_MEETING_COMPLETED,LEAD_MARKED_AS_WRONG_PERSONLEAD_MARKED_AS_CLOSED
不要启用(与重复)或(的子集)。取消勾选“跳过外出回复”和“跳过自动回复”。
ALL_POSITIVE_REPLIESALL_EMAIL_REPLIESFIRST_EMAIL_REPLIESALL_EMAIL_REPLIES每个webhook都会存储为一个事件。感兴趣/不感兴趣/情感来自标签webhook,而非仅来自回复webhook。外出回复被归类为自动回复(元数据标记,使用查询)。退信会将事件情感设置为但不会自动将线索移至阶段(使用查找此类线索)。
--auto-reply trueinvalidlost--sentiment invalidEmailBison webhooks
EmailBison webhooks
Point EmailBison webhooks at your relay URL (). In EmailBison, go to Settings → Webhook, paste the URL, and toggle the events below. Enable all seven:
…/emailbison/{token}- — sent from sender to lead
email.sent - — delivery failure (hard and soft bounces)
email.bounced - — lead replied to an email
lead.replied - — lead marked as interested (replies with positive intent)
lead.interested - — lead unsubscribed from the campaign
lead.unsubscribed - — a tag was added to the lead
tag.attached - — a tag was removed from the lead
tag.removed
All event types are accepted and stored. lead.interested sets stage to locally. lead.replied sets stage to . Bounces are recorded in the bounce events table with EmailBison-specific bounce field paths (, , ). Tags are stored as / event types with their raw vendor type preserved.
interestedreplieddata.bounce.typedata.bounce.reasondata.lead.mx_providertag_attachedtag_removedCampaign id/name are extracted from / in the payload.
data.campaign.iddata.campaign.nameAfter , filter the pipeline by current status (latest status-bearing event per lead):
pullbash
python3 scripts/pipeline.py show --sentiment positive
python3 scripts/pipeline.py show --sentiment invalid
python3 scripts/pipeline.py show --auto-reply true
python3 scripts/pipeline.py show --lead-status interested --jsonFilter by date (created or updated on/after a date):
bash
python3 scripts/pipeline.py show --since today
python3 scripts/pipeline.py show --since 2026-05-26 --json
python3 scripts/pipeline.py lead-table --workspace acme_corp --since today --jsonThen open full timeline for any lead (all events, not just the status event):
bash
python3 scripts/pipeline.py history --id 1Native copy-performance analysis (full message bodies + best template):
bash
python3 scripts/pipeline.py copy-insights --lead-status interested
python3 scripts/pipeline.py copy-insights --lead-status interested --jsonshow --jsonlead-table --json{"leads": [...], "data": [...], ...}personalizationtagslatest_sender将EmailBison webhook指向你的中继URL()。在EmailBison中,进入设置→Webhook,粘贴URL,然后启用以下七个事件:
…/emailbison/{token}- —— 从发送者发送给线索
email.sent - —— 投递失败(硬退信和软退信)
email.bounced - —— 线索回复邮件
lead.replied - —— 线索被标记为感兴趣(带有积极意图的回复)
lead.interested - —— 线索取消订阅活动
lead.unsubscribed - —— 为线索添加标签
tag.attached - —— 移除线索的标签
tag.removed
所有事件类型都会被接受并存储。lead.interested会将本地阶段设置为。lead.replied会将阶段设置为。退信会记录在退信事件表中,包含EmailBison特定的退信字段路径(, , )。标签会以 / 事件类型存储,并保留其原始供应商类型。
interestedreplieddata.bounce.typedata.bounce.reasondata.lead.mx_providertag_attachedtag_removed活动ID/名称从负载中的 / 提取。
data.campaign.iddata.campaign.namepullbash
python3 scripts/pipeline.py show --sentiment positive
python3 scripts/pipeline.py show --sentiment invalid
python3 scripts/pipeline.py show --auto-reply true
python3 scripts/pipeline.py show --lead-status interested --json按日期过滤(在指定日期或之后创建/更新):
bash
python3 scripts/pipeline.py show --since today
python3 scripts/pipeline.py show --since 2026-05-26 --json
python3 scripts/pipeline.py lead-table --workspace acme_corp --since today --json然后查看任意线索的完整时间线(所有事件,不仅是状态事件):
bash
python3 scripts/pipeline.py history --id 1原生文案效果分析(完整消息正文 + 最优模板):
bash
python3 scripts/pipeline.py copy-insights --lead-status interested
python3 scripts/pipeline.py copy-insights --lead-status interested --jsonshow --jsonlead-table --json{"leads": [...], "data": [...], ...}personalizationtagslatest_senderExport full profiles (CSV / JSON)
导出完整资料(CSV / JSON)
bash
python3 scripts/pipeline.py export --workspace acme_corp --tag nace --format csv
python3 scripts/pipeline.py export --workspace acme_corp --since today --format jsonWrites to under your workspace by default. CSV uses , , plus lead fields, tags, HQ, and .
outreachmagic/exports/personalized_first_namepersonalized_company_namelatest_senderNot for Google Sheets — writes local files only. For a hosted Google Sheet, use or (below).
exportsheets exportreview exportbash
python3 scripts/pipeline.py export --workspace acme_corp --tag nace --format csv
python3 scripts/pipeline.py export --workspace acme_corp --since today --format json默认写入工作区下的目录。CSV使用、以及线索字段、标签、总部信息和。
outreachmagic/exports/personalized_first_namepersonalized_company_namelatest_sender不适用于Google Sheets —— 仅写入本地文件。如需托管在Google Sheets,使用或(见下文)。
exportsheets exportreview exportReset local database (schema upgrade)
重置本地数据库(架构升级)
Prefer the guarded refresh command (syncs first, backs up, then rebuilds):
bash
python3 scripts/pipeline.py refresh --yesPreview tag fixes without writing:
bash
python3 scripts/pipeline.py tag repair --dry-run
python3 scripts/pipeline.py tag repairManual equivalent (no pre-sync backup):
bash
rm <skill_home>/databases/outreachmagic.db # see pipeline.py paths
python3 scripts/pipeline.py init
python3 scripts/pipeline.py pull --fullTell your agent (rare): “Run to back up, sync local changes to the relay, wipe the local DB, and re-import from the cloud. Do not use alone — it skips already-imported rows.”
pipeline.py refresh --yespull --fullpull --fullrelay_ingestedrefreshLinkedIn IDs (v1.17): Public profiles are stored in as (no ). Sales Nav () and member IDs () are stored as identity aliases and used for matching when the public slug arrives later.
linkedin_urllinkedin.com/in/handlehttps://ACwAA…urn:li:member:…优先使用受保护的刷新命令(先同步,备份,然后重建):
bash
python3 scripts/pipeline.py refresh --yes预览标签修复而不写入:
bash
python3 scripts/pipeline.py tag repair --dry-run
python3 scripts/pipeline.py tag repair手动等效操作(无预同步备份):
bash
rm <skill_home>/databases/outreachmagic.db # 查看pipeline.py paths
python3 scripts/pipeline.py init
python3 scripts/pipeline.py pull --full告知你的Agent(罕见场景): “运行以备份、将本地变更同步到中继、清空本地数据库并从云端重新导入。不要单独使用——它会跳过已导入的行。”
pipeline.py refresh --yespull --fullpull --fullrelay_ingestedrefreshLinkedIn ID(v1.17): 公开资料存储在中,格式为(无)。Sales Nav()和会员ID()存储为身份别名,当公开slug稍后到达时用于匹配。
linkedin_urllinkedin.com/in/handlehttps://ACwAA…urn:li:member:…Core Workflow
核心工作流
View a lead's full timeline
查看线索的完整时间线
bash
python3 scripts/pipeline.py history --id 1
python3 scripts/pipeline.py history --email jane@acme.com
python3 scripts/pipeline.py history --name "Jane Doe"
python3 scripts/pipeline.py history --id 1 --jsonOutputs lead info + numbered event timeline with direction arrows (← inbound, → outbound),
human-readable timestamps, and event details.
bash
python3 scripts/pipeline.py history --id 1
python3 scripts/pipeline.py history --email jane@acme.com
python3 scripts/pipeline.py history --name "Jane Doe"
python3 scripts/pipeline.py history --id 1 --json输出线索信息 + 带方向箭头的编号事件时间线(← 入站,→ 出站)、人性化时间戳和事件详情。
Add leads when researching prospects
调研潜在客户时添加线索
bash
python3 scripts/pipeline.py add-lead \
--name "Jane Doe" --company "Acme Corp" --title "VP Marketing" \
--industry "Martech" --headcount "50-200" \
--email "jane@acme.com" \
--channel email --stage prospectingTo also associate the lead with a workspace at creation time:
bash
python3 scripts/pipeline.py add-lead \
--name "Jane Doe" --email "jane@acme.com" --company "Acme Corp" \
--workspace thesystemsmethod --stage contacted--workspaceadd-leadIf lead exists by email, LinkedIn, or (when both are missing) case-insensitive , returns .
name+company{"status": "exists", "id": N}bash
python3 scripts/pipeline.py add-lead \
--name "Jane Doe" --company "Acme Corp" --title "VP Marketing" \
--industry "Martech" --headcount "50-200" \
--email "jane@acme.com" \
--channel email --stage prospecting创建线索时同时关联到工作区:
bash
python3 scripts/pipeline.py add-lead \
--name "Jane Doe" --email "jane@acme.com" --company "Acme Corp" \
--workspace thesystemsmethod --stage contacted--workspaceadd-lead如果线索已通过邮箱、LinkedIn或(当两者都缺失时)不区分大小写的存在,返回。
name+company{"status": "exists", "id": N}Bulk import / enrich (CSV, JSON, research dumps)
批量导入 / 富集(CSV、JSON、调研数据)
Use for spreadsheets, enriched exports, or batched research — not repeated calls. Matching uses tiered identities (strongest first): → email → LinkedIn → phone → name+domain → name+company → (name-only rows). CSV columns / are accepted as aliases and stored as . Fills empty fields only (same as relay/PlusVibe); use to replace existing values.
import-profilesadd-leadexternal_idimport_keyunified_lead_idsource_idexternal_id--overwritebash
python3 scripts/pipeline.py import-profiles \
--file outreachmagic/imports/contacts_enriched.csv
python3 scripts/pipeline.py import-profiles \
--file leads.json
python3 scripts/pipeline.py import-profiles \
--json '[{"email":"j@acme.com","name":"Jane","job_title":"VP Marketing","industry":"Martech","headcount":"11-50","company":"Acme"}]'
python3 scripts/pipeline.py import-profiles \
--file contacts.csv --dry-run对于电子表格、富集约或批量调研数据,使用——不要重复调用。匹配使用分层身份(优先级从高到低): → 邮箱 → LinkedIn → 电话 → name+domain → name+company → (仅含名称的行)。CSV列 / 会被视为别名并存储为。仅填充空字段(与中继/PlusVibe相同);使用替换现有值。
import-profilesadd-leadexternal_idimport_keyunified_lead_idsource_idexternal_id--overwritebash
python3 scripts/pipeline.py import-profiles \
--file outreachmagic/imports/contacts_enriched.csv
python3 scripts/pipeline.py import-profiles \
--file leads.json
python3 scripts/pipeline.py import-profiles \
--json '[{"email":"j@acme.com","name":"Jane","job_title":"VP Marketing","industry":"Martech","headcount":"11-50","company":"Acme"}]'
python3 scripts/pipeline.py import-profiles \
--file contacts.csv --dry-runWith workspace association, tags, and LinkedIn status tracking
关联工作区、添加标签并跟踪LinkedIn状态
python3 scripts/pipeline.py import-profiles
--file contacts.csv --workspace default --sender-profile "https://linkedin.com/in/myprofile"
--source csv_import --source-detail "Q2 Apollo list" --import-batch-id "nace-2026-05"
--file contacts.csv --workspace default --sender-profile "https://linkedin.com/in/myprofile"
--source csv_import --source-detail "Q2 Apollo list" --import-batch-id "nace-2026-05"
python3 scripts/pipeline.py import-profiles
--file sales_nav_export.csv --source sales_navigator --source-detail "Q2 Sales Nav list"
--file sales_nav_export.csv --source sales_navigator --source-detail "Q2 Sales Nav list"
python3 scripts/pipeline.py import-profiles
--file contacts.csv --workspace default --sender-profile "https://linkedin.com/in/myprofile"
--source csv_import --source-detail "Q2 Apollo list" --import-batch-id "nace-2026-05"
--file contacts.csv --workspace default --sender-profile "https://linkedin.com/in/myprofile"
--source csv_import --source-detail "Q2 Apollo list" --import-batch-id "nace-2026-05"
python3 scripts/pipeline.py import-profiles
--file sales_nav_export.csv --source sales_navigator --source-detail "Q2 Sales Nav list"
--file sales_nav_export.csv --source sales_navigator --source-detail "Q2 Sales Nav list"
Rows with only name + company_domain + unified_lead_id (no email/LinkedIn)
仅含名称 + company_domain + unified_lead_id的行(无邮箱/LinkedIn)
python3 scripts/pipeline.py import-profiles
--file nace.csv --workspace acme_corp --import-batch-id nace-2026-05
--file nace.csv --workspace acme_corp --import-batch-id nace-2026-05
**`verify-email`:** Records LEV rows locally and sets `cloud_pending` — run `sync` to push verification fields to the relay (same as other lead mutations).
**Email-finder batch save (known `lead_id` on every row):** email-finder calls `apply-email-find-results` — updates email, workspace tags, and provider verification in one pass. Requires `--workspace`. Run `sync` after batch-find when COMPLETE shows pending snapshots. Manual recovery:
```bash
python3 scripts/pipeline.py apply-email-find-results \
--workspace your_workspace --source trykitt --source-detail "email-finder/batch" \
--file import.jsonUse when rows lack / need tiered matching or CSV-only fields (personalization columns, , etc.).
import-profileslead_idimport_batch_idCore profile fields (column aliases — first non-empty wins):
| Canonical field | Aliases | Required |
|---|---|---|
| | No (see identity tiers below) |
| | No |
| | No |
| | No |
| | No |
| — | No |
| | No |
| | No |
| | No |
| | No |
Headcount normalization: is stored as-is (text) plus a computed (integer midpoint). Ranges like become , becomes , exact numbers pass through. Both leads and companies get the numeric column for sorting/filtering ().
headcountheadcount_numeric"11-50"30"500+"500WHERE headcount_numeric BETWEEN 10 AND 100Extra fields (auto-detected from CSV columns):
| Column | Effect |
|---|---|
| Stored in |
| Company HQ location, stored on |
| Auto-populated as |
| Auto-populated as |
| Attribution + namespace for |
| CRM/list ID in |
| Import aliases → same as |
| Stable dedupe for name-only rows via |
| Requires |
| Requires |
| Requires |
| Requires |
| Requires |
| Requires |
Normalization rules:
- Tags: lowercased, whitespace collapsed — and
"VIP"are the same tag"vip" - Status/sentiment: lowercased, underscores to spaces — becomes
"Not_Interested""not interested" - Headcount: range string preserved + numeric midpoint computed (→ 30)
"11-50" - Location: stored as-is (city/state/country text)
Attribution is automatic: every import sets (immutable first touch) and (updates each time) on the lead, following the Salesforce/HubSpot model. Use for the machine-readable channel (, , , , …). Use or / columns for list/campaign labels. Per-row overrides the CLI default when present.
original_sourcelatest_source--sourcesales_navigatortrykittlead_enrichcsv_import--source-detailimport_namelist_sourcelist_source--sourcepython3 scripts/pipeline.py import-profiles
--file nace.csv --workspace acme_corp --import-batch-id nace-2026-05
--file nace.csv --workspace acme_corp --import-batch-id nace-2026-05
**`verify-email`:** 在本地记录LEV行并设置`cloud_pending`——运行`sync`以将验证字段推送到中继(与其他线索变更操作相同)。
**Email-finder批量保存(每行都有已知`lead_id`):** email-finder调用`apply-email-find-results`——一次性更新邮箱、工作区标签和供应商验证信息。需要`--workspace`。当COMPLETE显示待处理快照时,在batch-find后运行`sync`。手动恢复:
```bash
python3 scripts/pipeline.py apply-email-find-results \
--workspace your_workspace --source trykitt --source-detail "email-finder/batch" \
--file import.json当行缺少 / 需要分层匹配或仅CSV字段(个性化列、等)时,使用。
lead_idimport_batch_idimport-profiles核心资料字段(列别名——第一个非空值优先):
| 标准字段 | 别名 | 必填 |
|---|---|---|
| | 否(见下文身份分层) |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| — | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
员工人数标准化: 按原样存储(文本),同时计算出(整数中点)。范围如会变为,变为,精确数字直接保留。线索和公司都会获得该数字列用于排序/过滤()。
headcountheadcount_numeric"11-50"30"500+"500WHERE headcount_numeric BETWEEN 10 AND 100额外字段(从CSV列自动检测):
| 列名 | 效果 |
|---|---|
| 存储在 |
| 公司总部位置,存储在 |
| 自动填充到personalization表的 |
| 自动填充到personalization表的 |
| 当值不含 |
| CRM/列表ID,存储在 |
| 导入别名 → 与 |
| 通过批次内的 |
| 需要 |
| 需要 |
| 需要 |
| 需要 |
| 需要 |
| 需要 |
标准化规则:
- 标签: 小写,合并空格 —— 和
"VIP"视为同一标签"vip" - 状态/情感: 小写,下划线替换为空格 —— 变为
"Not_Interested""not interested" - 员工人数: 保留范围字符串 + 计算数字中点(→ 30)
"11-50" - 位置: 按原样存储(城市/州/国家文本)
归属自动设置: 每次导入都会在线索上设置(不可变的首次接触来源)和(每次更新),遵循Salesforce/HubSpot模型。使用**指定机器可读渠道(、、、等)。使用**或/列指定列表/活动标签。当存在每行的时,会覆盖CLI默认的。
original_sourcelatest_source--sourcesales_navigatortrykittlead_enrichcsv_import--source-detailimport_namelist_sourcelist_source--sourcePersonalization (mail-merge)
个性化设置(邮件合并)
Lead fields (, contact-specific lines): per lead. Company fields (, ): org-wide, one write per account.
first_namecompany_namecompany_*| Raw field | Mail-merge field | Scope |
|---|---|---|
| | lead |
| | company |
bash
undefined线索字段(、特定联系人信息):每条线索单独设置。公司字段(、):组织级设置,每个账户仅需设置一次。
first_namecompany_namecompany_*| 原始字段 | 邮件合并字段 | 范围 |
|---|---|---|
| | 线索 |
| | 公司 |
bash
undefinedLead
线索
python3 .../pipeline.py personalize-pending --fields first_name --json
python3 .../pipeline.py personalize-set --lead-id 5 --field first_name --value "Jane"
python3 .../pipeline.py personalize-set --lead-id 5 --field upcoming_event --value "SaaStr talk" --date 2026-09-10
python3 .../pipeline.py personalize-pending --fields first_name --json
python3 .../pipeline.py personalize-set --lead-id 5 --field first_name --value "Jane"
python3 .../pipeline.py personalize-set --lead-id 5 --field upcoming_event --value "SaaStr talk" --date 2026-09-10
Company (org-wide)
公司(组织级)
python3 .../pipeline.py company-personalize-pending --fields company_name,company_icebreaker --json
python3 .../pipeline.py company-personalize-set --domain acme.com --field company_name --value "Acme"
python3 .../pipeline.py company-personalize-set --domain acme.com --field company_icebreaker --value "..."
python3 .../pipeline.py company-personalize-pending --fields company_name,company_icebreaker --json
python3 .../pipeline.py company-personalize-set --domain acme.com --field company_name --value "Acme"
python3 .../pipeline.py company-personalize-set --domain acme.com --field company_icebreaker --value "..."
Read merged (export uses same shape: personalized_* columns)
读取合并后的数据(导出使用相同格式:personalized_*列)
python3 .../pipeline.py personalize-get --lead-id 5 --json
Import: `mailmerge_first_name` → lead; `mailmerge_company_name`, `mailmerge_company_*` → company. Sync pushes lead and company snapshots separately; merge is local.python3 .../pipeline.py personalize-get --lead-id 5 --json
导入时:`mailmerge_first_name` → 线索;`mailmerge_company_name`, `mailmerge_company_*` → 公司。同步会分别推送线索和公司快照;合并操作在本地完成。Email verification tracking (org-wide)
邮箱验证跟踪(组织级)
Record verification results from tools like ZeroBounce, NeverBounce, etc. Results are org-wide (not workspace-scoped). Platform bounces from Smartlead, Instantly, etc. are auto-recorded during relay sync.
bash
undefined记录来自ZeroBounce、NeverBounce等工具的验证结果。结果是组织级的(非工作区范围)。来自Smartlead、Instantly等平台的退信会在中继同步时自动记录。
bash
undefinedRecord a verification result
记录验证结果
python3 scripts/pipeline.py verify-email
--lead-id 5 --status valid --source zerobounce
--lead-id 5 --status valid --source zerobounce
python3 scripts/pipeline.py verify-email
--lead-id 5 --status valid --source zerobounce
--lead-id 5 --status valid --source zerobounce
Batch verify from JSON
从JSON批量验证
python3 scripts/pipeline.py verify-email --batch
--json '[{"lead_id":5,"status":"valid","source":"zerobounce"}]'
--json '[{"lead_id":5,"status":"valid","source":"zerobounce"}]'
python3 scripts/pipeline.py verify-email --batch
--json '[{"lead_id":5,"status":"valid","source":"zerobounce"}]'
--json '[{"lead_id":5,"status":"valid","source":"zerobounce"}]'
Check verification status for a lead
检查线索的验证状态
python3 scripts/pipeline.py verify-status --lead-id 5
python3 scripts/pipeline.py verify-status --email j@acme.com
python3 scripts/pipeline.py verify-status --lead-id 5
python3 scripts/pipeline.py verify-status --email j@acme.com
List leads needing verification
列出需要验证的线索
python3 scripts/pipeline.py verify-pending --limit 50 --json
**Verification status values:** `valid`, `invalid`, `catch-all`, `unknown`, `spamtrap`, `abuse`, `do_not_mail`, `risky`, `bounced`, `soft_bounce`
**Bounce handling:** Platform bounces (from relay sync) are auto-recorded in `lead_email_verification` with `source="platform_bounce"`. Hard bounces override soft bounces. Tool verifications (ZeroBounce, etc.) take precedence over platform bounces — a tool "valid" result is only overridden by a hard bounce that came after the verification. The consolidated status is materialized on `leads.email_verification_status` for fast filtering.python3 scripts/pipeline.py verify-pending --limit 50 --json
**验证状态值:** `valid`, `invalid`, `catch-all`, `unknown`, `spamtrap`, `abuse`, `do_not_mail`, `risky`, `bounced`, `soft_bounce`
**退信处理:** 平台退信(来自中继同步)会自动记录在`lead_email_verification`中,`source="platform_bounce"`。硬退信覆盖软退信。工具验证(ZeroBounce等)优先级高于平台退信——工具的"valid"结果仅会被之后的硬退信覆盖。合并后的状态会在`leads.email_verification_status`中具体化,以便快速过滤。Companies and unified lead identity
公司与统一线索身份
- table — canonical company name, domain, industry, headcount (text + numeric midpoint), HQ location (city, state, country). Leads link via
companies(business email domain or company name on ingest).company_id - Match by email and/or LinkedIn — a lead can have email only, LinkedIn only, or both. Relay ingest resolves identity from webhook payload + envelope field.
lead - Merge duplicates when email and LinkedIn history were separate rows:
- Auto: ingest with both identifiers matching two leads merges them (keeps row with more events).
- Manual:
bash
python3 scripts/pipeline.py merge-leads --keep 12 --merge 34
python3 scripts/pipeline.py merge-leads \
--email j@acme.com --linkedin linkedin.com/in/janedoe- 表 —— 标准公司名称、域名、行业、员工人数(文本 + 数字中点)、总部位置(城市、州、国家)。线索通过
companies关联(导入时通过商务邮箱域名或公司名称匹配)。company_id - 通过邮箱和/或LinkedIn匹配 —— 线索可以仅含邮箱、仅含LinkedIn,或两者都有。中继导入会从webhook负载 + 信封字段解析身份。
lead - 合并重复项当邮箱和LinkedIn历史属于不同行时:
- 自动合并: 导入时同时匹配两个线索的标识符会合并它们(保留事件更多的行)。
- 手动合并:
bash
python3 scripts/pipeline.py merge-leads --keep 12 --merge 34
python3 scripts/pipeline.py merge-leads \
--email j@acme.com --linkedin linkedin.com/in/janedoeDedup (batch duplicate find + merge)
去重(批量查找重复项 + 合并)
bash
python3 scripts/pipeline.py dedup find --workspace popcam --tag campaign --output outreachmagic/exports/candidates.json
python3 scripts/pipeline.py dedup merge --candidates outreachmagic/exports/candidates.json # dry-run
python3 scripts/pipeline.py dedup merge --candidates outreachmagic/exports/candidates.json --commit # applybash
python3 scripts/pipeline.py dedup find --workspace popcam --tag campaign --output outreachmagic/exports/candidates.json
python3 scripts/pipeline.py dedup merge --candidates outreachmagic/exports/candidates.json # 试运行
python3 scripts/pipeline.py dedup merge --candidates outreachmagic/exports/candidates.json --commit # 应用Google Sheets export (lead review)
Google Sheets导出(线索审核)
To export leads to an editable Google Sheet (two-way sync), use or — not .
sheets exportreview exportexport --format csvRequires . Sheets are created on (no local Google credentials).
pipeline.py loginapp.outreachmagic.iobash
python3 scripts/pipeline.py sheets export --workspace popcam --title "NACE Leads"要将线索导出到可编辑的Google Sheets(双向同步),使用**或**——不要使用。
sheets exportreview exportexport --format csv需要。表格会在创建(无需本地Google凭据)。
pipeline.py loginapp.outreachmagic.iobash
python3 scripts/pipeline.py sheets export --workspace popcam --title "NACE Leads"equivalent:
等效命令:
python3 scripts/pipeline.py review export --template lead-review --workspace popcam
--tag nace --detail standard --title "NACE Leads"
--tag nace --detail standard --title "NACE Leads"
See **Lead review sheet** below for sync-back workflow.python3 scripts/pipeline.py review export --template lead-review --workspace popcam
--tag nace --detail standard --title "NACE Leads"
--tag nace --detail standard --title "NACE Leads"
见下文**线索审核表格**了解同步回传工作流。Dedup review (hosted Google Sheets)
去重审核(托管Google Sheets)
Requires . Sheets are created on and shared to your org owner email (or ). Check Merge? in the sheet, then sync.
pipeline.py loginapp.outreachmagic.io--share-emailbash
python3 scripts/pipeline.py review export --input outreachmagic/exports/candidates.json --title "Popcam Dedup"
python3 scripts/pipeline.py review sync --sheet-id SHEET_ID --dry-run
python3 scripts/pipeline.py review sync --sheet-id SHEET_ID --commit需要。表格会在创建并共享给你的组织所有者邮箱(或指定的邮箱)。在表格中勾选Merge?,然后同步。
pipeline.py loginapp.outreachmagic.io--share-emailbash
python3 scripts/pipeline.py review export --input outreachmagic/exports/candidates.json --title "Popcam Dedup"
python3 scripts/pipeline.py review sync --sheet-id SHEET_ID --dry-run
python3 scripts/pipeline.py review sync --sheet-id SHEET_ID --commitLead review sheet (export → edit → sync)
线索审核表格(导出 → 编辑 → 同步)
Requires login. Sheets are created on with edit/lock header icons (no column colors). All usage notes live in the header cell note; freeze row and dropdowns apply before the export URL is returned. Detail levels: . Use for the current column catalog (full adds , , , keys). Dropdowns: , . Export prints row progress and API timing to stderr.
app.outreachmagic.iolead_id--detail basic|standard|full|customreview presetslev_*be_*latest_source*linkedin_sender_<handle>workspace_stagelead_sentimentbash
python3 scripts/pipeline.py review presets --template lead-review
python3 scripts/pipeline.py review export-payload --workspace popcam --tag nace --detail standard
python3 scripts/pipeline.py review export --template lead-review --workspace popcam \
--tag nace --detail standard --title "NACE Review"
python3 scripts/pipeline.py review sync --template lead-review --workspace popcam \
--sheet-id SHEET_ID --detail standard --dry-run
python3 scripts/pipeline.py review sync --template lead-review --workspace popcam \
--sheet-id SHEET_ID --detail standard --commit需要登录。表格会在创建,带有编辑/锁定表头图标(无列颜色)。所有使用说明都在表头单元格的备注中;在返回导出URL前会应用冻结行和下拉菜单。详情级别:。使用查看当前列目录(full会添加, , , 键)。下拉菜单:, 。导出时会在stderr中打印行进度和API耗时。
app.outreachmagic.iolead_id--detail basic|standard|full|customreview presetslev_*be_*latest_source*linkedin_sender_<handle>workspace_stagelead_sentimentbash
python3 scripts/pipeline.py review presets --template lead-review
python3 scripts/pipeline.py review export-payload --workspace popcam --tag nace --detail standard
python3 scripts/pipeline.py review export --template lead-review --workspace popcam \
--tag nace --detail standard --title "NACE Review"
python3 scripts/pipeline.py review sync --template lead-review --workspace popcam \
--sheet-id SHEET_ID --detail standard --dry-run
python3 scripts/pipeline.py review sync --template lead-review --workspace popcam \
--sheet-id SHEET_ID --detail standard --commitEmail-finder candidates (safe domain export)
Email-finder候选线索(安全域名导出)
Never use — use this command to emit batch-find JSON with real only:
COALESCE(domain, company)companies.domainbash
python3 scripts/pipeline.py email-finder-candidates --workspace popcam --tag nace \
--no-email --require-domain --never-contacted切勿使用——使用此命令仅输出含真实的batch-find JSON:
COALESCE(domain, company)companies.domainbash
python3 scripts/pipeline.py email-finder-candidates --workspace popcam --tag nace \
--no-email --require-domain --never-contactedScope to a CSV batch (returns scanned / skipped_has_email / candidates)
限定CSV批次范围(返回扫描数 / 已含邮箱的跳过数 / 候选线索数)
python3 scripts/pipeline.py email-finder-candidates --workspace popcam --file outreachmagic/batches/find-batch.json
`export` also supports `--never-contacted`, `--no-email`, and `--require-domain`. Force large relay snapshot pages with `sync --bulk` (or `sync --no-bulk` for routine sizes).
```bash
python3 scripts/pipeline.py history --linkedin linkedin.com/in/janedoeAfter , use for per-campaign event and lead counts (unchanged).
pullcampaignspython3 scripts/pipeline.py email-finder-candidates --workspace popcam --file outreachmagic/batches/find-batch.json
`export`也支持`--never-contacted`, `--no-email`, 和`--require-domain`。使用`sync --bulk`强制获取大型中继快照页面(或`sync --no-bulk`使用常规大小)。
```bash
python3 scripts/pipeline.py history --linkedin linkedin.com/in/janedoepullcampaignsLog every outreach send
记录每一次拓展消息发送
bash
python3 scripts/pipeline.py log-event \
--lead-id 1 --type email_sent --direction outbound \
--subject "Quick intro" --workspace thesystemsmethod--workspacebash
python3 scripts/pipeline.py log-event \
--lead-id 1 --type email_sent --direction outbound \
--subject "Quick intro" --workspace thesystemsmethod在多工作区模式下,是必填项。拓展事件是工作区范围的——它们属于特定流水线。在单工作区模式下会回退到默认工作区。
--workspaceUpdate stage and log replies
更新阶段并记录回复
bash
python3 scripts/pipeline.py update-stage \
--id 1 --stage replied --next-action "Send case study" --workspace thesystemsmethod--workspaceStages: -> -> -> -> -> |
prospectingcontactedrepliedinterestedproposalwonlostbash
python3 scripts/pipeline.py update-stage \
--id 1 --stage replied --next-action "Send case study" --workspace thesystemsmethod在多工作区模式下,是必填项。阶段是工作区范围的——一条线索在一个工作区中可能处于"contacted"阶段,在另一个工作区中处于"interested"阶段。
--workspace阶段流程: -> -> -> -> -> |
prospectingcontactedrepliedinterestedproposalwonlostConnect sequencers (paid)
连接序列器(付费)
If the user already has a key, skip the browser flow:
bash
python3 scripts/pipeline.py loginGenerate webhook URLs for platforms directly from the CLI (requires agent key):
bash
python3 scripts/pipeline.py connect-platform --platform smartlead
python3 scripts/pipeline.py connect-platform --platform instantly
python3 scripts/pipeline.py connections如果用户已有密钥,跳过浏览器流程:
bash
python3 scripts/pipeline.py login直接从CLI为平台生成webhook URL(需要Agent密钥):
bash
python3 scripts/pipeline.py connect-platform --platform smartlead
python3 scripts/pipeline.py connect-platform --platform instantly
python3 scripts/pipeline.py connectionsUpdate skill scripts
更新skill脚本
bash
python3 scripts/pipeline.py updatebash
python3 scripts/pipeline.py updateLead Fields Reference
线索字段参考
| Field | CLI flag | Notes |
|---|---|---|
| name | | Required |
| company | | |
| title | | Job title |
| industry | | e.g. Martech, Fintech, Healthcare |
| headcount | | Size band, e.g. 1-10, 50-200, 1000+ |
| Dedup key — unique per lead | |
| LinkedIn profile URL | |
| channel | | email, linkedin, whatsapp (default: email) |
| stage | | Pipeline stage (default: prospecting) |
| notes | | Free-form |
| tags | | JSON array string like '["vip","enterprise"]' |
| workspace | | Optional on |
| 字段 | CLI标志 | 说明 |
|---|---|---|
| name | | 必填 |
| company | | |
| title | | 职位 |
| industry | | 例如:Martech、Fintech、Healthcare |
| headcount | | 规模区间,例如:1-10、50-200、1000+ |
| 去重键——每条线索唯一 | |
| LinkedIn资料URL | |
| channel | | email、linkedin、whatsapp(默认:email) |
| stage | | 流水线阶段(默认:prospecting) |
| notes | | 自由文本 |
| tags | | JSON数组字符串,如'["vip","enterprise"]' |
| workspace | | |
Privacy & Security
隐私与安全
- Local-first data. Pipeline leads, events, and campaign stats live in local SQLite (→
pipeline.py paths).database - Relay pass-through. Webhooks hit ; the CLI imports them locally via
api.outreachmagic.io. We store tokens and usage on our side, not a searchable cloud copy of your outreach archive.pull - Portal API. handles tokens, billing, and optional workspace routing sync when connected.
app.outreachmagic.io - Credentials. Store relay tokens in only. Never hardcode tokens in SKILL.md or commit them to git.
config/outreachmagic_config.json - Read before connect. See SECURITY.md for full data boundaries and vulnerability reporting.
- 本地优先数据。流水线线索、事件和活动统计存储在本地SQLite中(→
pipeline.py paths)。database - 中继中转。Webhook命中;CLI通过
api.outreachmagic.io将其导入本地。我们在服务器端存储令牌和使用情况,而非你的拓展存档的可搜索云端副本。pull - 门户API。处理令牌、计费和连接时的可选工作区路由同步。
app.outreachmagic.io - 凭据。仅在中存储中继令牌。切勿在SKILL.md中硬编码令牌或提交到git。
config/outreachmagic_config.json - 连接前阅读。详见SECURITY.md了解完整的数据边界和漏洞报告流程。
Common Pitfalls
常见陷阱
- Time-window analytics: use (no pull). Latest activity: pull before
query engagement/show.history - Forgetting add-lead before log-event
- Not updating stage after reply
- Setup/auth errors (including 401 Unauthorized) should run in terminal.
python3 scripts/pipeline.py login - Version: run — do not guess from SKILL.md frontmatter alone.
pipeline.py version - Relay archive stays on api.outreachmagic.io; dedupes locally. Use
pullfor a true rebuild (sync + backup + wipe +refresh --yes).pull --fullalone only helps after deleting the DB manually.pull --full - Tags: plain names (,
nace) — not JSON list strings likevip. Run['nace']for bracket-form tags.tag repair - on an existing email does not enrich — use
add-leador rely on relayimport-profilesfor fill-if-empty updates.pull - — run
ModuleNotFoundError: data_freshness.pipeline.py update - Large batches — chunked 200 rows; if save times out, re-run with
import-profileson your export JSON/CSV.--file
- 时间窗口分析: 使用(无需pull)。最新活动: 在
query engagement/show前执行pull。history - 在log-event前忘记add-lead
- 回复后未更新阶段
- 设置/认证错误(包括401 Unauthorized)应在终端运行。
python3 scripts/pipeline.py login - 版本: 运行——不要仅从SKILL.md前置内容猜测。
pipeline.py version - 中继存档保留在api.outreachmagic.io;在本地去重。使用
pull进行真正的重建(同步 + 备份 + 清空 +refresh --yes)。单独使用pull --full仅在手动删除数据库后有用。pull --full - 标签: 使用纯名称(,
nace)——不要使用JSON列表字符串如vip。运行['nace']修复括号格式的标签。tag repair - 对已有邮箱执行add-lead不会富集数据——使用或依赖中继
import-profiles进行空字段填充更新。pull - ——运行
ModuleNotFoundError: data_freshness。pipeline.py update - 大型批次——按200行分块;如果保存超时,重新运行并指定导出的JSON/CSV文件。
import-profiles
Pull Troubleshooting Runbook
Pull故障排查手册
When relay flow appears stale, diagnose before using destructive reset commands:
bash
python3 scripts/pipeline.py pull --diagnose
python3 scripts/pipeline.py pull --full --diagnoseDiagnostic verdicts:
- — no events returned for the current cursor window.
relay empty - — relay returned events already recorded in local
relay has events but deduped.relay_ingested - — event cursor moved forward (
cursor advancedincreased).last_max_id - — relay returned a full page but cursor did not advance; inspect relay pagination.
cursor stalled - Pull uses id cursors only: (webhooks) and per-table snapshot cursors (
last_max_id,last_snapshot_core_after_id,last_snapshot_workspace_after_id). Nolast_snapshot_company_after_idon relay pull.since
If events were ingested but still seem missing, inspect a specific lead timeline:
bash
python3 scripts/pipeline.py history --email "<lead_email>" --json当中继流程似乎停滞时,在使用破坏性重置命令前先诊断:
bash
python3 scripts/pipeline.py pull --diagnose
python3 scripts/pipeline.py pull --full --diagnose诊断结论:
- —— 当前游标窗口无事件返回。
relay empty - —— 中继返回的事件已记录在本地
relay has events but deduped中。relay_ingested - —— 事件游标已推进(
cursor advanced增加)。last_max_id - —— 中继返回完整页面但游标未推进;检查中继分页。
cursor stalled - Pull仅使用ID游标:(webhooks)和每个表的快照游标(
last_max_id,last_snapshot_core_after_id,last_snapshot_workspace_after_id)。中继pull不支持last_snapshot_company_after_id参数。since
如果事件已导入但仍显示缺失,查看特定线索的时间线:
bash
python3 scripts/pipeline.py history --email "<lead_email>" --json