canva-creator
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCanva Creator
Canva Creator
Scope
适用范围
This skill handles a campaign in five sequential stages, each gated by owner
approval:
brief → calendar → asset inventory → Canva designs → copy → HubSpot staging| Path | Channels | What this skill produces |
|---|---|---|
| Canva (social) | Instagram, Facebook, X/Twitter, LinkedIn | Canva design + caption + scheduled HubSpot post |
| Text-only | Email (newsletter, marketing, drip) | Subject + preheader + body, surfaced inline for the owner to send |
Canva is not used for email rows under any circumstance — no templates,
no autofill, no design copies, no asset uploads, no exports. The owner
explicitly descoped Canva from the email path because email-template
autofill produces placeholder graphics when image slots exceed available
photos, and variation thumbnails fail to render in chat previews. If the
owner asks for a Canva email design, see for the
redirect language.
reference/gotchas.md本技能分五个连续阶段处理营销活动,每个阶段都需要用户批准后才能推进:
brief → calendar → asset inventory → Canva designs → copy → HubSpot staging| 路径 | 渠道 | 本技能产出内容 |
|---|---|---|
| Canva (social) | Instagram, Facebook, X/Twitter, LinkedIn | Canva设计 + 文案 + HubSpot排期帖子 |
| Text-only | Email(新闻通讯、营销邮件、 drip邮件) | 主题 + 预标题 + 正文,直接展示供用户自行发送 |
任何情况下都不得将Canva用于邮件环节——不得使用模板、自动填充、设计复制、素材上传或导出。用户明确将Canva排除在邮件流程外,因为邮件模板自动填充在图片插槽数量超过可用照片时会生成占位图,且变体缩略图无法在聊天预览中正常显示。若用户要求制作Canva邮件设计,请查看中的引导话术。
reference/gotchas.mdPre-flight
前期准备
Before Stage 1, confirm:
-
Brief. The user has referenced or pasted an approved brief. If not: "I'll need the content brief before I can build the campaign. Do you have one from the content-strategy skill, or would you like to write one now?"
-
Canva tier. Pro/Teams require manual template selection from the user's library (no autofill API). Enterprise can autofill from brand templates.
-
HubSpot tier. Social staging requires Marketing Hub Professional. Starter or Free → skip Stage 5 and export a CSV instead (see reference/hubspot-staging.md).
-
Brand assets. Confirm the path to product photos on disk or that the brand kit is live in Canva.
-
Generation budget. Estimate the campaign's Canva volume and surface it before Stage 1 begins. Default is 3 candidates per Canva-bound row; each design costs ~5 API calls (autofill + export + polling).
Generation budget for this campaign: Canva (social) rows: 8 Candidates per row: 3 (default — say "single candidate" to use 1) Total designs: 24 API calls (approx): ~120 (autofill + export + polling) Canva limit: 100 requests/minute. This will take ~2-3 minutes of generation, well within your tier limits. Proceed?If the projected total designs exceeds 30, recommend single-candidate mode upfront — large campaigns run out of headroom fast. The owner can override the default to 1, 2, or 3 candidates per row before Stage 1 starts. Lock the chosen value for the entire session.
进入阶段1前,需确认以下事项:
-
内容简报:用户已提及或粘贴已获批的简报。若未提供:“我需要内容简报才能构建营销活动。您是否有来自内容策略技能的简报,或者现在需要撰写一份?”
-
Canva套餐等级:Pro/Teams版需要用户从其库中手动选择模板(无自动填充API)。Enterprise版可从品牌模板自动填充。
-
HubSpot套餐等级:社交排期需要Marketing Hub Professional版。Starter或Free版需跳过阶段5,改为导出CSV文件(详见reference/hubspot-staging.md)。
-
品牌素材:确认产品照片在磁盘上的路径,或品牌套件已在Canva中启用。
-
生成预算:预估活动的Canva生成量,并在阶段1开始前告知用户。默认每行Canva相关内容生成3个候选设计;每个设计约消耗5次API调用(自动填充 + 导出 + 轮询)。
本次活动的生成预算: Canva(社交)行数:8 每行候选数:3(默认——若需1个可告知“single candidate”) 总设计数:24 预估API调用次数:~120次(自动填充 + 导出 + 轮询) Canva限制:每分钟100次请求。本次生成约需2-3分钟,完全在您的套餐限额内。是否继续?若预计总设计数超过30,建议提前启用单候选模式——大型活动会快速耗尽配额。用户可在阶段1开始前将默认值覆盖为1、2或3个候选数,并在整个会话中锁定所选值。
Workflow
工作流程
Stage 1 — Posting calendar
阶段1:发布日历
Pull from the brief: content themes, channels, cadence, hard dates
(launches, sales, holidays).
Build a calendar table with a column that routes every row to either
Canva or text-only drafting:
Path| Date | Channel | Path | Theme | Asset type | Caption/Subject angle |
|---|---|---|---|---|---|
| Jun 2 | Instagram feed | Canva (social) | Linen launch | Square post | "finally, a dress…" |
| Jun 5 | Text-only | Linen launch | Email body | "Linen that actually breathes" |
Tag every email-channel row as before presenting. Cap at 30
days unless the brief specifies otherwise. Flag scheduling conflicts (two
posts same day for the same product) up front.
Text-onlyCheckpoint 1. Present the calendar. Ask: "Does this match the plan?
Any dates to shift, channels to add, or themes to swap?" Iterate until
approved, then restate the split out loud — "N rows go through Canva, M
rows go through text-only drafting" — before moving on. Catching a
miscategorization here is free; catching it after generating designs
isn't.
从简报中提取:内容主题、渠道、发布节奏、硬性日期(发布、促销、节假日)。
构建包含列的日历表格,将每行内容路由至Canva或纯文本撰写流程:
Path| 日期 | 渠道 | 路径 | 主题 | 素材类型 | 文案/邮件主题方向 |
|---|---|---|---|---|---|
| 6月2日 | Instagram feed | Canva (social) | 亚麻系列发布 | 方形帖子 | “终于,一款合适的连衣裙…” |
| 6月5日 | Text-only | 亚麻系列发布 | 邮件正文 | “真正透气的亚麻面料” |
所有邮件渠道的行均标记为后再展示。默认最多覆盖30天,除非简报另有规定。提前标记排期冲突(同一产品同一天发布两篇帖子)。
Text-only检查点1:展示日历并询问:“这是否符合计划?是否需要调整日期、添加渠道或更换主题?”迭代至用户批准后,口头重申拆分情况——“N行将通过Canva处理,M行将通过纯文本撰写流程”——再进入下一阶段。在此阶段发现分类错误无需成本,但若在生成设计后发现则会浪费大量工作。
Stage 2 — Asset inventory (Canva rows only)
阶段2:素材清单(仅Canva行)
Email rows skip this stage entirely. For each row, build
a manifest of what the template needs and what's already available.
Canva (social)-
Enumerate every image slot by name. Square Instagram posts usually have 1-2 image slots; carousels and product grids can have 5+. List them individually (,
Header_Image,Product1_Image, …) — never roll them up as "product images."Product2_Image- Enterprise: read field names from on the brand template (
dataset[].label).GET /v1/brand-templates/{id} - Pro/Teams: count every distinct image rectangle in the template.
- Enterprise: read field names from
-
Inventory available assets. Text content from the brief (product names, offer copy, taglines, pricing), product photos already uploaded to Canva () or on the owner's disk, brand kit colors and fonts (Enterprise).
GET /v1/assets -
Build the slot-by-slot gap table. One row per slot per design — not per design.
Date Slot name Slot kind Available asset Status Jun 2 Hero_Image image bloom_summer.jpg → asset_id pending upload Jun 2 Headline text "Summer linen, finally" ready Jun 9 Product1_Image image — MISSING -
Resolve slot/asset mismatches with the owner. If the template has more image slots than the brief provides photos, pause and ask:
The "Summer Carousel" template has 5 image slots. The brief gave me 1 photo (bloom_summer.jpg). How should I fill the other 4? 1. Reuse the same photo across all 5 slots 2. You send me 4 more photos (file paths) 3. Pick a simpler template with fewer slotsNo generation calls until the owner picks. Generating with empty slots produces designs full of Canva's default landscape placeholders. -
Upload missing photos and capture verified asset IDs. Upload via, then poll
POST /v1/asset-uploadsuntilGET /v1/asset-uploads/{job_id}. Recordstatus == "success"from the response — this is the only value that works in an autofill image field. Passing an empty string, a URL, a file path, or a stale ID silently renders Canva's stock landscape graphic instead of the photo.asset.id -
Confirm the manifest. Show the owner the completed slot-by-slot table with every slot resolved and every imageconfirmed. This is the last stop before Canva API calls.
asset.id
邮件行完全跳过此阶段。针对每个行,构建模板所需内容与已有素材的清单。
Canva (social)-
按名称枚举每个图片插槽:Instagram方形帖子通常有1-2个图片插槽;轮播帖和产品网格帖可能有5个以上。需单独列出每个插槽(、
Header_Image、Product1_Image…)——不得合并为“产品图片”。Product2_Image- Enterprise版:从品牌模板的字段读取插槽名称(
dataset[].label)。GET /v1/brand-templates/{id} - Pro/Teams版:统计模板中所有不同的图片矩形数量。
- Enterprise版:从品牌模板的
-
盘点可用素材:简报中的文本内容(产品名称、促销文案、标语、定价)、已上传至Canva的产品照片()或用户磁盘上的照片、品牌套件的颜色和字体(Enterprise版)。
GET /v1/assets -
构建逐插槽缺口表格:每个设计的每个插槽单独占一行——而非每个设计占一行。
日期 插槽名称 插槽类型 可用素材 状态 6月2日 Hero_Image 图片 bloom_summer.jpg → 待确认asset_id 需上传 6月2日 Headline 文本 “Summer linen, finally” 已就绪 6月9日 Product1_Image 图片 — 缺失 -
与用户解决插槽/素材不匹配问题:若模板的图片插槽数量多于简报提供的照片数量,暂停并询问:
“Summer Carousel”模板有5个图片插槽,但简报仅提供了1张照片(bloom_summer.jpg)。剩余4个插槽应如何填充? 1. 同一照片重复填充所有5个插槽 2. 您提供4张额外照片(文件路径) 3. 更换为插槽更少的简易模板需等待用户选择后再进行生成调用。空插槽生成的设计会充满Canva默认的风景占位图。 -
上传缺失照片并获取验证后的asset ID:通过上传,然后轮询
POST /v1/asset-uploads直至GET /v1/asset-uploads/{job_id}。记录响应中的status == "success"——这是唯一可用于自动填充图片字段的值。传入空字符串、URL、文件路径或过期ID会自动渲染Canva的默认风景图,而非目标照片。asset.id -
确认清单:向用户展示已解决所有插槽问题且所有图片已确认的逐插槽表格。这是调用Canva API前的最后检查环节。
asset.id
Stage 3 — Canva design generation
阶段3:Canva设计生成
Before any Canva API call, re-read the calendar and drop any row whose
is not . Email rows do not pass through this
stage.
PathCanva (social)Generate designs one calendar row at a time, with 3 candidates per row
(or the value chosen at pre-flight). Each row follows the same loop:
generate candidates → verify → export → visually check → retry failures
→ present → wait for owner pick → next row. Pause 30 seconds between
rows. This caps the burst at 3 generations + 3 exports per ~30s — well
under Canva's 100 req/min rate limit. Do not parallelize multiple rows;
one row at a time is the protection that keeps the owner from hitting
quota mid-campaign.
Polling cadence. Poll job status every 3-5 seconds, not faster.
Tighter intervals burn quota without speeding up completion.
Preview URLs — only one type is safe to embed. Autofill responses
return thumbnails that expire within minutes; embedding
them as markdown images produces broken "Show Image" placeholders.
Permanent export URLs ( or the
MCP tool) do not expire. Native Cowork carousels render the autofill
result directly using the connector's authenticated session — let them
render on their own, don't re-embed.
design.canva.aiexport-download.canva.comexport-design在调用任何Canva API前,重新查看日历,剔除所有非的行。邮件行不经过此阶段。
PathCanva (social)逐行生成设计,每行生成3个候选设计(或前期准备阶段选定的数量)。每行遵循相同循环:生成候选设计 → 验证 → 导出 → 视觉检查 → 重试失败设计 → 展示 → 等待用户选择 → 下一行。行与行之间暂停30秒。这将每次突发请求限制为约30秒内3次生成+3次导出——远低于Canva每分钟100次请求的速率限制。不得并行处理多行;逐行处理是避免用户在活动中途触发配额限制的保护机制。
轮询频率:每3-5秒轮询一次任务状态,不得更频繁。过短的间隔会浪费配额且不会加快完成速度。
预览URL——仅有一种类型可安全嵌入:自动填充响应返回的缩略图会在数分钟内过期;将其作为markdown图片嵌入会生成失效的“显示图片”占位符。永久导出URL(或 MCP工具)不会过期。原生Cowork轮播会通过连接器的认证会话直接渲染自动填充结果——无需重新嵌入,让其自行渲染即可。
design.canva.aiexport-download.canva.comexport-designRow loop
行处理循环
-
Resolve template. (Once per session — same template across rows unless the calendar mixes asset types.)
- Enterprise: filtered by asset type.
GET /v1/brand-templates - Pro/Teams: , surface top 3 to the owner, confirm one before generating.
GET /v1/designs?ownership=any&query={template name}
- Enterprise:
-
Generate the row's candidates in parallel. Fire the row's 3 candidates simultaneously (or N from pre-flight).
- Enterprise: per candidate with the template ID and field values. Poll all jobs concurrently.
POST /v1/autofills - Pro/Teams: to create copies. Describe the text and image edits the owner applies in Canva; collect design IDs back.
POST /v1/designs
- Enterprise:
-
Verify job status. For each candidate, confirmreturned
GET /autofills/{job_id}andstatus == "success"is present. Handle errors per-design:result.design.id-
→ read
JOB_FAILED, fix the field values or asset IDs, retry once.job.error.message -
(first hit this session) → wait 60s, retry that one candidate once. This handles transient spikes.
RATE_LIMIT_EXCEEDED -
(second hit this session) or any
RATE_LIMIT_EXCEEDED/ daily-cap error → stop generation immediately. Do not retry. Surface progress and ask:quota_exceededCanva is rate-limiting the campaign. Status so far: ✓ Generated: Posts 1-4 (12 designs) ⏸ Remaining: Posts 5-8 (12 designs not yet generated) How should I proceed? 1. Switch to 1 candidate per remaining row (4 designs total) — finishes now 2. Pause campaign — resume in 60 minutes when quota refills 3. Stop generation — work with what we have, move to captionsWait for the owner's choice. Do not loop on retry.
-
-
Export each successful candidate to a permanent PNG. Fire the row's exports in parallel.
- REST: with
POST /v1/exports, pollformat.type: "png"until success, captureGET /v1/exports/{job_id}.urls[0] - Canva MCP: with the design ID.
export-design
These permanent URLs are what get embedded in previews and attached to the HubSpot post later. The autofill response thumbnail is never used downstream. - REST:
-
Visually verify each export. Look at the image and reject any of these — they all indicate an unfilled slot or wrong asset:
- Generic landscape with clouds and green hills (Canva's default placeholder)
- Solid gray rectangles where a photo should be
- Lorem-ipsum or template-default text
- Subject that doesn't match the brief (wrong product, wrong brand)
If a candidate fails verification: re-check the manifest for the affected slot, fix the, regenerate that single candidate, re-export, re-verify.asset.id -
Retry per-candidate on partial failure. If 1 of N candidates in the row failed at Step 3 or 5, regenerate just that one — don't redo the whole row and don't present a partial broken carousel. If the second attempt also fails:
The third candidate for the Jun 9 post keeps failing — Canva returned [error / rendered placeholder]. How should I proceed? 1. Skip it — present the other 2 and move on 2. Swap to a simpler template for just this candidate 3. Try once more with a different photo -
Present the row's candidates. Let the native Cowork carousel render the autofill tool result. Below it, add a text prompt:
Jun 9 candidates are ready — scroll through the carousel above. Which one should I use for the Jun 9 post?If the carousel doesn't render or one position is broken, embed the permanent export PNG URLs from Step 4 instead. Final fallback: link to the design's Canva edit URL (). Never re-embedhttps://www.canva.com/d/{design_id}URLs.design.canva.ai -
Pause 30 seconds, then move to the next row.
Checkpoint 2. Satisfied once the owner has picked one design per
calendar row. If they want a regenerate, regenerate only that one
candidate.
-
确定模板(会话内仅需一次——除非日历混合了不同素材类型,否则所有行使用同一模板):
- Enterprise版:按素材类型过滤。
GET /v1/brand-templates - Pro/Teams版:调用,向用户展示排名前三的模板,确认后再生成。
GET /v1/designs?ownership=any&query={template name}
- Enterprise版:按素材类型过滤
-
并行生成该行的候选设计:同时触发该行的3个候选设计生成(或前期准备阶段选定的N个)。
- Enterprise版:为每个候选设计调用,传入模板ID和字段值。并行轮询所有任务。
POST /v1/autofills - Pro/Teams版:调用创建副本。描述用户在Canva中应用的文本和图片修改;回收设计ID。
POST /v1/designs
- Enterprise版:为每个候选设计调用
-
验证任务状态:针对每个候选设计,确认返回
GET /autofills/{job_id}且status == "success"存在。按设计处理错误:result.design.id-
→ 读取
JOB_FAILED,修正字段值或asset ID,重试一次。job.error.message -
(会话中首次触发)→ 等待60秒,重试该候选设计一次。这可处理临时峰值。
RATE_LIMIT_EXCEEDED -
(会话中第二次触发)或任何
RATE_LIMIT_EXCEEDED/每日限额错误→立即停止生成。不得重试。展示进度并询问:quota_exceededCanva对本次活动触发了速率限制。当前进度: ✓ 已生成:帖子1-4(12个设计) ⏸ 剩余:帖子5-8(12个设计尚未生成) 应如何继续? 1. 剩余行切换为单候选模式(共4个设计)——立即完成 2. 暂停活动——60分钟后配额重置时恢复 3. 停止生成——基于已有内容继续处理文案等待用户选择。不得循环重试。
-
-
将每个成功的候选设计导出为永久PNG:并行触发该行的导出操作。
- REST:调用,设置
POST /v1/exports,轮询format.type: "png"直至成功,获取GET /v1/exports/{job_id}。urls[0] - Canva MCP:使用设计ID调用。
export-design
这些永久URL将用于预览嵌入和后续附加到HubSpot帖子中。自动填充响应中的缩略图绝不会用于下游环节。 - REST:调用
-
视觉验证每个导出文件:查看图片,若出现以下情况则拒绝——这些均表明插槽未填充或素材错误:
- 带云和青山的通用风景图(Canva默认占位图)
- 照片位置显示纯灰色矩形
- Lorem-ipsum或模板默认文本
- 内容与简报不符(错误产品、错误品牌)
若候选设计验证失败:重新检查对应插槽的清单,修正,重新生成该单个候选设计,重新导出并验证。asset.id -
部分失败时逐候选设计重试:若该行N个候选设计中有1个在步骤3或5失败,仅重新生成该设计——不得重做整行或展示部分失效的轮播。若第二次尝试仍失败:
6月9日帖子的第三个候选设计持续失败——Canva返回[错误信息/占位图]。应如何处理? 1. 跳过——展示另外2个设计并继续 2. 仅为此候选设计更换简易模板 3. 使用不同照片再尝试一次 -
展示该行的候选设计:让原生Cowork轮播渲染自动填充工具结果。在下方添加文本提示:
6月9日的候选设计已准备就绪——请滚动查看上方的轮播内容。 应选择哪一个用于6月9日的帖子?若轮播无法渲染或某个位置失效,改用步骤4中的永久导出PNG URL嵌入。最终备选方案:链接至设计的Canva编辑URL()。绝不要嵌入https://www.canva.com/d/{design_id}URL。design.canva.ai -
暂停30秒,然后处理下一行。
检查点2:用户为每个日历行选定一个设计后即完成此阶段。若用户要求重新生成,仅重新生成该单个候选设计。
Stage 4 — Copy drafting
阶段4:文案撰写
For each calendar row, draft the copy. Social rows get a caption; email
rows get a full email.
Social captions — Instagram, Facebook, X, LinkedIn:
- Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500 recommended; X ≤ 280).
- Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).
- Voice: match the brief's tone markers. If the brief says "casual and friendly," don't write corporate copy.
- No filler. No "Exciting news!" or "We're thrilled to announce." Open with the value.
Email content — Claude writes the entire email; no Canva:
- Subject: ≤ 50 chars, specific, no clickbait. "Spring projects are booking up" beats "Don't miss out!"
- Preheader: ≤ 90 chars, complements the subject without repeating it.
- Body: plain prose, 100-250 words. Opening line that earns the read → 1-2 paragraphs of substance → single clear CTA → sign-off.
- Voice: same tone markers as social. Owners want their emails to sound like them, not like a templated newsletter.
- No image references. Don't write "see image above." If the owner wants visuals, they add them in their email tool.
- One CTA per email. Pick the most important action and lead with it.
Present captions inline below each social row. Present full emails
inline below each email row:
Subject: <subject line>
Preheader: <preheader text>
<body text>For worked examples, see
reference/examples/boutique-brief-campaign.md.
Checkpoint 3. "Any captions or emails to rewrite? Flag the date and
what to change." Iterate until approved.
针对每个日历行撰写文案。社交行撰写帖子文案;邮件行撰写完整邮件。
社交平台文案——Instagram、Facebook、X、LinkedIn:
- 长度:符合渠道要求(Instagram ≤2200字符;Facebook建议≤500字符;X ≤280字符)。
- 结构:钩子 → 一个产品卖点 → 行动号召(CTA) → 3-5个话题标签(而非30个)。
- 语气:匹配简报中的语气标记。若简报要求“轻松友好”,不得撰写正式 corporate 风格文案。
- 无冗余内容。不得使用“激动人心的消息!”或“我们很高兴宣布”等表述。开篇直接点明价值。
邮件内容——由Claude撰写完整邮件;不使用Canva:
- 主题:≤50字符,具体明确,无标题党。“春季项目预约已满”优于“别错过!”。
- 预标题:≤90字符,补充主题内容而非重复。
- 正文:纯散文,100-250词。开篇吸引读者 → 1-2段实质性内容 → 单个明确的行动号召 → 落款。
- 语气:与社交平台文案使用相同的语气标记。用户希望邮件听起来像自己的风格,而非模板化的新闻通讯。
- 无图片引用。不得撰写“见上图”。若用户需要视觉素材,可在其邮件工具中添加。
- 每封邮件仅一个行动号召。选择最重要的行动并突出展示。
在每个社交行下方直接展示文案。在每个邮件行下方直接展示完整邮件:
Subject: <主题行>
Preheader: <预标题文本>
<正文文本>示例可查看reference/examples/boutique-brief-campaign.md。
检查点3:“是否需要重写某些文案或邮件?请标记日期和修改内容。”迭代至用户批准。
Stage 5 — HubSpot staging + email handoff
阶段5:HubSpot排期 + 邮件交付
Stage social posts in HubSpot. Email content is not staged — it's
surfaced inline for the owner to copy into their email tool. For API
field reference, see
reference/hubspot-staging.md.
-
Create the campaign.with the campaign name and start/end dates from the calendar.
POST /marketing/v3/campaigns -
Stage each social post.to the HubSpot Social API per
POSTrow:Canva (social)- : map calendar channel to HubSpot account ID
channel - : ISO 8601 datetime — confirm it's in the future before calling
scheduledAt - : approved caption
content.body - : permanent Canva export PNG URL from Stage 3
attachments - :
status(neverSCHEDULED)PUBLISHED
-
Confirm the queue. Call, surface the list, provide a direct link to the HubSpot campaign view.
GET /marketing/v3/social/posts?status=SCHEDULED -
Surface email content for handoff. For each email row, present the approved subject + preheader + body inline, grouped by send date. The owner copies these into their email tool (HubSpot Marketing Email, Mailchimp, Gmail).
Final checkpoint.
Your social posts are scheduled in HubSpot: [link]
They'll go out as scheduled — you can cancel or edit any post in HubSpot.
Email content is drafted below — copy each into your email tool when
you're ready to send:
Jun 5 — "Spring projects are booking up"
Jul 15 — "Summer maintenance windows are filling"
Anything to change before we're done?在HubSpot中安排社交帖子的排期。邮件内容不进行排期——直接展示供用户复制到其邮件工具中。API字段参考详见reference/hubspot-staging.md。
-
创建活动:调用,传入活动名称和日历中的开始/结束日期。
POST /marketing/v3/campaigns -
安排每个社交帖子:针对每个行调用HubSpot Social API:
Canva (social)- :将日历渠道映射至HubSpot账户ID
channel - :ISO 8601格式时间——调用前确认时间在未来
scheduledAt - :已获批的文案
content.body - :阶段3中获取的Canva永久导出PNG URL
attachments - :
status(绝不要设置为SCHEDULED)PUBLISHED
-
确认排期队列:调用,展示列表,并提供HubSpot活动视图的直接链接。
GET /marketing/v3/social/posts?status=SCHEDULED -
展示邮件内容供交付:针对每个邮件行,按发送日期分组展示已获批的主题+预标题+正文。用户将这些内容复制到其邮件工具(HubSpot Marketing Email、Mailchimp、Gmail)中。
最终检查点:
您的社交帖子已在HubSpot中排期:[链接]
帖子将按排期发布——您可在HubSpot中取消或编辑任何帖子。
邮件内容已撰写如下——准备发送时复制到您的邮件工具即可:
6月5日 — “春季项目预约已满”
7月15日 — “夏季维护时段即将约满”
完成前是否需要修改任何内容?Approval gates
审批规则
- No Canva calls for email rows. Re-check the column before every API call.
Path - No publishing. Every HubSpot post is staged as ; the owner controls go-live.
SCHEDULED - Always surface the generation budget at pre-flight. Owner sees the total design count and approves before Stage 1 begins.
- One row at a time in Stage 3. Candidates within a row fire in parallel, but rows are sequential with a 30s gap — this is the quota protection.
- On the second quota error, pause and ask. Never loop on retry.
- Always export to a permanent PNG before presenting. Job success doesn't mean the design rendered correctly.
- Never embed URLs in messages. They expire.
design.canva.ai - Never regenerate the whole row when one candidate fails. Per-candidate retry only.
- Never auto-select a template for Pro/Teams users. Always confirm.
- Never skip slot-by-slot inventory. Multi-slot templates render placeholder landscapes when any slot is empty.
- Never skip Checkpoint 1. Generating before the calendar is approved is the largest source of wasted work in this skill.
- 不得为邮件行调用Canva:每次API调用前重新检查列。
Path - 不得直接发布:所有HubSpot帖子均设置为状态;用户控制发布时间。
SCHEDULED - 前期准备阶段必须展示生成预算:用户需在阶段1开始前查看总设计数并批准。
- 阶段3必须逐行处理:每行内的候选设计可并行生成,但行与行之间需间隔30秒——这是配额保护机制。
- 第二次触发配额错误时需暂停并询问:不得循环重试。
- 展示前必须导出为永久PNG:任务成功不代表设计渲染正确。
- 绝不要在消息中嵌入URL——这些URL会过期。
design.canva.ai - 单个候选设计失败时不得重新生成整行:仅逐候选设计重试。
- 不得为Pro/Teams用户自动选择模板:必须确认后再使用。
- 不得跳过逐插槽素材盘点:多插槽模板在任何插槽为空时会渲染占位风景图。
- 不得跳过检查点1:日历获批前就开始生成是本技能最大的工作浪费来源。
Reference
参考文档
- reference/canva-api.md — Canva Connect API endpoints, asset upload, export formats, MCP equivalents
- reference/hubspot-staging.md — HubSpot Social API and CSV fallback for non-Pro tiers
- reference/gotchas.md — Good / Bad patterns for every failure mode this skill has hit in production
- reference/examples/boutique-brief-campaign.md — full worked examples (single-slot social, multi-slot template)
- reference/canva-api.md — Canva Connect API端点、素材上传、导出格式、MCP等效操作
- reference/hubspot-staging.md — HubSpot Social API及非Pro版的CSV备选方案
- reference/gotchas.md — 本技能在生产环境中遇到的所有故障模式的正确/错误处理模式
- reference/examples/boutique-brief-campaign.md — 完整示例(单插槽社交帖子、多插槽模板)