[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718ST97TKPV50AEF7CDV7S0":3,"skill-same:01M718ST97TKPV50AEF7CDV7S0":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M718ST97TKPV50AEF7CDV7S0","canva-creator",null,"Takes an approved content brief and executes a campaign end-to-end: builds the posting calendar, generates Canva designs for social posts, drafts caption and email copy, and stages social sends in HubSpot. Canva is used for social posts only (Instagram, Facebook, X, LinkedIn) — email content is drafted as plain text and surfaced inline for the owner to send from their own tool. Every step requires explicit owner approval. This is the one-shot campaign executor: a finished brief goes in, a complete campaign comes out. Use when the owner hands off an approved brief or points at one — \"run this brief,\" \"execute the campaign,\" \"turn this brief into posts,\" \"build the campaign from the plan we approved.\" For day-to-day posting with no brief — \"I need to post more,\" \"what should we post\" — use social-content-engine instead; it owns the standing calendar.","anthropics\u002Fknowledge-work-plugins","anthropics","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F76263028?v=4","01M697XGDPXJAVQ8391V2BCYTE","Anthropic","01M7188MPC48111TN566QNQE3X",35379,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"canva","creator","canva creator","read","at","calendar","run","inline","plan","text","content brief","when","only","campaign","social","end","send","executor","posts","brief","2026-11-10 10:12:30",false,"---\nname: canva-creator\ndescription: >\n  Takes an approved content brief and executes a campaign end-to-end: builds\n  the posting calendar, generates Canva designs for social posts, drafts\n  caption and email copy, and stages social sends in HubSpot. Canva is used\n  for social posts only (Instagram, Facebook, X, LinkedIn) — email content\n  is drafted as plain text and surfaced inline for the owner to send from\n  their own tool. Every step requires explicit owner approval. This is the\n  one-shot campaign executor: a finished brief goes in, a complete campaign\n  comes out. Use when the owner hands off an approved brief or points at one\n  — \"run this brief,\" \"execute the campaign,\" \"turn this brief into posts,\"\n  \"build the campaign from the plan we approved.\" For day-to-day posting with\n  no brief — \"I need to post more,\" \"what should we post\" — use\n  social-content-engine instead; it owns the standing calendar.\nallowed-tools: Read, WebFetch\n---\n\n# Canva Creator\n\n## Scope\n\nThis skill handles a campaign in five sequential stages, each gated by owner\napproval:\n\n```\nbrief → calendar → asset inventory → Canva designs → copy → HubSpot staging\n```\n\n| Path | Channels | What this skill produces |\n|------|----------|--------------------------|\n| Canva (social) | Instagram, Facebook, X\u002FTwitter, LinkedIn | Canva design + caption + scheduled HubSpot post |\n| Text-only | Email (newsletter, marketing, drip) | Subject + preheader + body, surfaced inline for the owner to send |\n\n**Canva is not used for email rows under any circumstance** — no templates,\nno autofill, no design copies, no asset uploads, no exports. Email\ngraphics are out of scope for this skill because email-template\nautofill produces placeholder graphics when image slots exceed available\nphotos, and variation thumbnails fail to render in chat previews. If the\nowner asks for a Canva email design, see `reference\u002Fgotchas.md` for the\nredirect language.\n\n---\n\n## Pre-flight\n\nBefore Stage 1, confirm:\n\n1. **Brief.** The user has referenced or pasted an approved brief. If not:\n   \"I'll need the content brief before I can build the campaign. Do you\n   have one from the content-strategy skill, or would you like to write\n   one now?\"\n\n2. **Canva tier.** Pro\u002FTeams require manual template selection from the\n   user's library (no autofill API). Enterprise can autofill from brand\n   templates.\n\n3. **HubSpot tier.** Social staging requires Marketing Hub Professional.\n   Starter or Free → skip Stage 5 and export a CSV instead\n   (see [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md)).\n\n4. **Brand assets.** If a storefront is connected (Shopify or Square —\n   peers, `..\u002F..\u002Fshared\u002Fconnector-neutrality.md`), read the product list\n   first: titles, image URLs, and prices for every product the brief names.\n   Read only — nothing is uploaded to Canva until Stage 2 step 5, and then\n   only the images the approved calendar's slots need. That list is the\n   starting photo inventory; ask only about products the store has no\n   image for. The pull rules — which fields, the price-claim rule — are in\n   [..\u002Fsocial-content-engine\u002Freference\u002Fshopify-assets.md](..\u002Fsocial-content-engine\u002Freference\u002Fshopify-assets.md)\n   (written for Shopify; Square's catalog images follow the same steps\n   from the tool inventory). With no storefront,\n   confirm the path to product photos on disk or that the brand kit is\n   live in Canva.\n\n5. **Generation budget.** Estimate the campaign's Canva volume and surface\n   it before Stage 1 begins. Default is 3 candidates per Canva-bound row;\n   each design costs ~5 API calls (autofill + export + polling).\n\n   ```\n   Generation budget for this campaign:\n     Canva (social) rows: 8\n     Candidates per row:  3   (default — say \"single candidate\" to use 1)\n     Total designs:       24\n     API calls (approx):  ~120  (autofill + export + polling)\n\n   Canva limit: 100 requests\u002Fminute. This will take ~2-3 minutes of\n   generation, well within your tier limits. Proceed?\n   ```\n\n   If the projected total designs exceeds 30, recommend single-candidate\n   mode upfront — large campaigns run out of headroom fast. The owner can\n   override the default to 1, 2, or 3 candidates per row before Stage 1\n   starts. Lock the chosen value for the entire session.\n\n---\n\n## Workflow\n\n### Stage 1 — Posting calendar\n\nPull from the brief: content themes, channels, cadence, hard dates\n(launches, sales, holidays).\n\nBuild a calendar table with a `Path` column that routes every row to either\nCanva or text-only drafting:\n\n| Date | Channel | Path | Theme | Asset type | Caption\u002FSubject angle |\n|------|---------|------|-------|------------|-----------------------|\n| Jun 2 | Instagram feed | Canva (social) | Linen launch | Square post | \"finally, a dress…\" |\n| Jun 5 | Email | Text-only | Linen launch | Email body | \"Linen that actually breathes\" |\n\nTag every email-channel row as `Text-only` before presenting. Cap at 30\ndays unless the brief specifies otherwise. Flag scheduling conflicts (two\nposts same day for the same product) up front.\n\n**Checkpoint 1.** Present the calendar. Ask: \"Does this match the plan?\nAny dates to shift, channels to add, or themes to swap?\" Iterate until\napproved, then restate the split out loud — \"N rows go through Canva, M\nrows go through text-only drafting\" — before moving on. Catching a\nmiscategorization here is free; catching it after generating designs\nisn't.\n\n---\n\n### Stage 2 — Asset inventory (Canva rows only)\n\nEmail rows skip this stage entirely. For each `Canva (social)` row, build\na manifest of what the template needs and what's already available.\n\n1. **Enumerate every image slot by name.** Square Instagram posts usually\n   have 1-2 image slots; carousels and product grids can have 5+. List\n   them individually (`Header_Image`, `Product1_Image`, `Product2_Image`,\n   …) — never roll them up as \"product images.\"\n   - Enterprise: read field names from `dataset[].label` on the brand\n     template (`GET \u002Fv1\u002Fbrand-templates\u002F{id}`).\n   - Pro\u002FTeams: count every distinct image rectangle in the template.\n\n2. **Inventory available assets.** Text content from the brief (product\n   names, offer copy, taglines, pricing), product image URLs read from the\n   connected storefront at pre-flight (uploaded in step 5, only for the\n   slots the gap table needs, and recorded by `asset.id` then), product\n   photos already uploaded to Canva (`GET \u002Fv1\u002Fassets`) or on the owner's\n   disk, brand kit colors and fonts (Enterprise). A price in a caption\n   comes from the storefront's returned value or the brief, never from\n   memory.\n\n3. **Build the slot-by-slot gap table.** One row per slot per design — not\n   per design.\n\n   | Date | Slot name | Slot kind | Available asset | Status |\n   |------|-----------|-----------|-----------------|--------|\n   | Jun 2 | Hero_Image | image | bloom_summer.jpg → asset_id pending | upload |\n   | Jun 2 | Headline | text | \"Summer linen, finally\" | ready |\n   | Jun 9 | Product1_Image | image | — | **MISSING** |\n\n4. **Resolve slot\u002Fasset mismatches with the owner.** If the template has\n   more image slots than the brief provides photos, pause and ask:\n\n   ```\n   The \"Summer Carousel\" template has 5 image slots. The brief gave me 1\n   photo (bloom_summer.jpg). How should I fill the other 4?\n\n     1. Reuse the same photo across all 5 slots\n     2. You send me 4 more photos (file paths)\n     3. Pick a simpler template with fewer slots\n   ```\n\n   No generation calls until the owner picks. Generating with empty slots\n   produces designs full of Canva's default landscape placeholders.\n\n5. **Upload missing photos and capture verified asset IDs.** Upload via\n   `POST \u002Fv1\u002Fasset-uploads`, then poll `GET \u002Fv1\u002Fasset-uploads\u002F{job_id}`\n   until `status == \"success\"`. Record `asset.id` from the response — this\n   is the only value that works in an autofill image field. Passing an\n   empty string, a URL, a file path, or a stale ID silently renders\n   Canva's stock landscape graphic instead of the photo.\n\n6. **Confirm the manifest.** Show the owner the completed slot-by-slot\n   table with every slot resolved and every image `asset.id` confirmed.\n   This is the last stop before Canva API calls.\n\n---\n\n### Stage 3 — Canva design generation\n\nBefore any Canva API call, re-read the calendar and drop any row whose\n`Path` is not `Canva (social)`. Email rows do not pass through this\nstage.\n\nGenerate designs **one calendar row at a time**, with 3 candidates per row\n(or the value chosen at pre-flight). Each row follows the same loop:\ngenerate candidates → verify → export → visually check → retry failures\n→ present → wait for owner pick → next row. Pause 30 seconds between\nrows. This caps the burst at 3 generations + 3 exports per ~30s — well\nunder Canva's 100 req\u002Fmin rate limit. Do not parallelize multiple rows;\none row at a time is the protection that keeps the owner from hitting\nquota mid-campaign.\n\n**Polling cadence.** Poll job status every 3-5 seconds, not faster.\nTighter intervals burn quota without speeding up completion.\n\n**Preview URLs — only one type is safe to embed.** Autofill responses\nreturn `design.canva.ai` thumbnails that expire within minutes; embedding\nthem as markdown images produces broken \"Show Image\" placeholders.\nPermanent export URLs (`export-download.canva.com` or the `export-design`\nMCP tool) do not expire. Native Cowork carousels render the autofill\nresult directly using the connector's authenticated session — let them\nrender on their own, don't re-embed.\n\n#### Row loop\n\n1. **Resolve template.** (Once per session — same template across rows\n   unless the calendar mixes asset types.)\n   - Enterprise: `GET \u002Fv1\u002Fbrand-templates` filtered by asset type.\n   - Pro\u002FTeams: `GET \u002Fv1\u002Fdesigns?ownership=any&query={template name}`,\n     surface top 3 to the owner, confirm one before generating.\n\n2. **Generate the row's candidates in parallel.** Fire the row's 3\n   candidates simultaneously (or N from pre-flight).\n   - Enterprise: `POST \u002Fv1\u002Fautofills` per candidate with the template ID\n     and field values. Poll all jobs concurrently.\n   - Pro\u002FTeams: `POST \u002Fv1\u002Fdesigns` to create copies. Describe the text and\n     image edits the owner applies in Canva; collect design IDs back.\n\n3. **Verify job status.** For each candidate, confirm\n   `GET \u002Fautofills\u002F{job_id}` returned `status == \"success\"` and\n   `result.design.id` is present. Handle errors per-design:\n   - `JOB_FAILED` → read `job.error.message`, fix the field values or\n     asset IDs, retry once.\n   - `RATE_LIMIT_EXCEEDED` (first hit this session) → wait 60s, retry\n     that one candidate once. This handles transient spikes.\n   - `RATE_LIMIT_EXCEEDED` (second hit this session) **or** any\n     `quota_exceeded` \u002F daily-cap error → stop generation immediately.\n     Do not retry. Surface progress and ask:\n\n     ```\n     Canva is rate-limiting the campaign. Status so far:\n       ✓ Generated:  Posts 1-4 (12 designs)\n       ⏸ Remaining:  Posts 5-8 (12 designs not yet generated)\n\n     How should I proceed?\n       1. Switch to 1 candidate per remaining row (4 designs total) — finishes now\n       2. Pause campaign — resume in 60 minutes when quota refills\n       3. Stop generation — work with what we have, move to captions\n     ```\n\n     Wait for the owner's choice. Do not loop on retry.\n\n4. **Export each successful candidate to a permanent PNG.** Fire the\n   row's exports in parallel.\n   - REST: `POST \u002Fv1\u002Fexports` with `format.type: \"png\"`, poll\n     `GET \u002Fv1\u002Fexports\u002F{job_id}` until success, capture `urls[0]`.\n   - Canva MCP: `export-design` with the design ID.\n\n   These permanent URLs are what get embedded in previews and attached to\n   the HubSpot post later. The autofill response thumbnail is never used\n   downstream.\n\n5. **Visually verify each export.** Look at the image and reject any of\n   these — they all indicate an unfilled slot or wrong asset:\n   - Generic landscape with clouds and green hills (Canva's default\n     placeholder)\n   - Solid gray rectangles where a photo should be\n   - Lorem-ipsum or template-default text\n   - Subject that doesn't match the brief (wrong product, wrong brand)\n\n   If a candidate fails verification: re-check the manifest for the\n   affected slot, fix the `asset.id`, regenerate that single candidate,\n   re-export, re-verify.\n\n6. **Retry per-candidate on partial failure.** If 1 of N candidates in\n   the row failed at Step 3 or 5, regenerate just that one — don't redo\n   the whole row and don't present a partial broken carousel. If the\n   second attempt also fails:\n\n   ```\n   The third candidate for the Jun 9 post keeps failing — Canva returned\n   [error \u002F rendered placeholder]. How should I proceed?\n\n     1. Skip it — present the other 2 and move on\n     2. Swap to a simpler template for just this candidate\n     3. Try once more with a different photo\n   ```\n\n7. **Present the row's candidates.** Let the native Cowork carousel\n   render the autofill tool result. Below it, add a text prompt:\n\n   ```\n   Jun 9 candidates are ready — scroll through the carousel above.\n   Which one should I use for the Jun 9 post?\n   ```\n\n   If the carousel doesn't render or one position is broken, embed the\n   permanent export PNG URLs from Step 4 instead. Final fallback: link to\n   the design's Canva edit URL (`https:\u002F\u002Fwww.canva.com\u002Fd\u002F{design_id}`).\n   Never re-embed `design.canva.ai` URLs.\n\n8. **Pause 30 seconds, then move to the next row.**\n\n**Checkpoint 2.** Satisfied once the owner has picked one design per\ncalendar row. If they want a regenerate, regenerate only that one\ncandidate.\n\n---\n\n### Stage 4 — Copy drafting\n\nFor each calendar row, draft the copy. Social rows get a caption; email\nrows get a full email.\n\n**Social captions** — Instagram, Facebook, X, LinkedIn:\n\n- Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500\n  recommended; X ≤ 280).\n- Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).\n- Voice: match the brief's tone markers. If the brief says \"casual and\n  friendly,\" don't write corporate copy.\n- No filler. No \"Exciting news!\" or \"We're thrilled to announce.\" Open\n  with the value.\n\n**Email content** — Claude writes the entire email; no Canva:\n\n- Subject: ≤ 50 chars, specific, no clickbait. \"Spring projects are\n  booking up\" beats \"Don't miss out!\"\n- Preheader: ≤ 90 chars, complements the subject without repeating it.\n- Body: plain prose, 100-250 words. Opening line that earns the read →\n  1-2 paragraphs of substance → single clear CTA → sign-off.\n- Voice: same tone markers as social. Owners want their emails to sound\n  like them, not like a templated newsletter.\n- No image references. Don't write \"see image above.\" If the owner wants\n  visuals, they add them in their email tool.\n- One CTA per email. Pick the most important action and lead with it.\n\nPresent captions inline below each social row. Present full emails\ninline below each email row:\n\n```\nSubject: \u003Csubject line>\nPreheader: \u003Cpreheader text>\n\n\u003Cbody text>\n```\n\nFor worked examples, see\n[reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md).\n\n**Checkpoint 3.** \"Any captions or emails to rewrite? Flag the date and\nwhat to change.\" Iterate until approved.\n\n---\n\n### Stage 5 — HubSpot staging + email handoff\n\nStage social posts in HubSpot. Email content is not staged — it's\nsurfaced inline for the owner to copy into their email tool. For API\nfield reference, see\n[reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md).\n\n1. **Create the campaign.** `POST \u002Fmarketing\u002Fv3\u002Fcampaigns` with the\n   campaign name and start\u002Fend dates from the calendar.\n\n2. **Stage each social post.** `POST` to the HubSpot Social API per\n   `Canva (social)` row:\n   - `channel`: map calendar channel to HubSpot account ID\n   - `scheduledAt`: ISO 8601 datetime — confirm it's in the future before\n     calling\n   - `content.body`: approved caption\n   - `attachments`: permanent Canva export PNG URL from Stage 3\n   - `status`: `SCHEDULED` (never `PUBLISHED`)\n\n3. **Confirm the queue.** Call\n   `GET \u002Fmarketing\u002Fv3\u002Fsocial\u002Fposts?status=SCHEDULED`, surface the list,\n   provide a direct link to the HubSpot campaign view.\n\n4. **Surface email content for handoff.** For each email row, present the\n   approved subject + preheader + body inline, grouped by send date. The\n   owner copies these into their email tool (HubSpot Marketing Email,\n   Mailchimp, Gmail or M365).\n\n**Final checkpoint.**\n\n```\nYour social posts are scheduled in HubSpot: [link]\nThey'll go out as scheduled — you can cancel or edit any post in HubSpot.\n\nEmail content is drafted below — copy each into your email tool when\nyou're ready to send:\n\n  Jun 5 — \"Spring projects are booking up\"\n  Jul 15 — \"Summer maintenance windows are filling\"\n\nAnything to change before we're done?\n```\n\nAlongside that summary — never replacing it — render the campaign as an\nHTML artifact per the house style (`..\u002F..\u002Fshared\u002Fartifact-style.md`): the\nposting calendar as a table, a per-channel status pill on each row\n(scheduled \u002F drafted \u002F handoff), and a staged-post panel per row with the\napproved caption or email copy and its export PNG link.\n\n**Closing offer.** One line on what the campaign now contains, then the\nsingle most relevant next step with its trigger phrase — usually \"is my\nmarketing working?\" (`growth-pulse`) once posts start going out. Up to\ntwo others: \"make the content\" (`social-content-engine`) for the standing\ncalendar, or \"my ads\" (`ad-manager`). Max three; never re-offer something\nthe owner declined this session.\n\n---\n\n## Approval gates\n\n- **No Canva calls for email rows.** Re-check the `Path` column before\n  every API call.\n- **No publishing.** Every HubSpot post is staged as `SCHEDULED`; the\n  owner controls go-live.\n- **Always surface the generation budget at pre-flight.** Owner sees the\n  total design count and approves before Stage 1 begins.\n- **One row at a time in Stage 3.** Candidates within a row fire in\n  parallel, but rows are sequential with a 30s gap — this is the quota\n  protection.\n- **On the second quota error, pause and ask.** Never loop on retry.\n- **Always export to a permanent PNG before presenting.** Job success\n  doesn't mean the design rendered correctly.\n- **Never embed `design.canva.ai` URLs in messages.** They expire.\n- **Never regenerate the whole row when one candidate fails.**\n  Per-candidate retry only.\n- **Never auto-select a template for Pro\u002FTeams users.** Always confirm.\n- **Never skip slot-by-slot inventory.** Multi-slot templates render\n  placeholder landscapes when any slot is empty.\n- **Never skip Checkpoint 1.** Generating before the calendar is approved\n  is the largest source of wasted work in this skill.\n\n---\n\n## Reference\n\n- [reference\u002Fcanva-api.md](reference\u002Fcanva-api.md) — Canva Connect API\n  endpoints, asset upload, export formats, MCP equivalents\n- [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md) — HubSpot\n  Social API and CSV fallback for non-Pro tiers\n- [reference\u002Fgotchas.md](reference\u002Fgotchas.md) — Good \u002F Bad patterns for\n  common failure modes\n- [reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md)\n  — full worked examples (single-slot social, multi-slot template)\n\n## Using a tool that isn't listed\n\nThe connectors named in this skill are the tested paths, not a wall. If the owner wants this flow to use a tool that isn't connected or listed, offer `build-connector` — it checks the connector directory first and connects through Zapier otherwise, never hand-building against a raw API. Once the connection exists, the tool joins this skill like any other optional connector, under the same approval gates.\n","# Canva Creator\n\n## Scope\n\nThis skill handles a campaign in five sequential stages, each gated by owner\napproval:\n\n```\nbrief → calendar → asset inventory → Canva designs → copy → HubSpot staging\n```\n\n| Path | Channels | What this skill produces |\n|------|----------|--------------------------|\n| Canva (social) | Instagram, Facebook, X\u002FTwitter, LinkedIn | Canva design + caption + scheduled HubSpot post |\n| Text-only | Email (newsletter, marketing, drip) | Subject + preheader + body, surfaced inline for the owner to send |\n\n**Canva is not used for email rows under any circumstance** — no templates,\nno autofill, no design copies, no asset uploads, no exports. Email\ngraphics are out of scope for this skill because email-template\nautofill produces placeholder graphics when image slots exceed available\nphotos, and variation thumbnails fail to render in chat previews. If the\nowner asks for a Canva email design, see `reference\u002Fgotchas.md` for the\nredirect language.\n\n---\n\n## Pre-flight\n\nBefore Stage 1, confirm:\n\n1. **Brief.** The user has referenced or pasted an approved brief. If not:\n   \"I'll need the content brief before I can build the campaign. Do you\n   have one from the content-strategy skill, or would you like to write\n   one now?\"\n\n2. **Canva tier.** Pro\u002FTeams require manual template selection from the\n   user's library (no autofill API). Enterprise can autofill from brand\n   templates.\n\n3. **HubSpot tier.** Social staging requires Marketing Hub Professional.\n   Starter or Free → skip Stage 5 and export a CSV instead\n   (see [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md)).\n\n4. **Brand assets.** If a storefront is connected (Shopify or Square —\n   peers, `..\u002F..\u002Fshared\u002Fconnector-neutrality.md`), read the product list\n   first: titles, image URLs, and prices for every product the brief names.\n   Read only — nothing is uploaded to Canva until Stage 2 step 5, and then\n   only the images the approved calendar's slots need. That list is the\n   starting photo inventory; ask only about products the store has no\n   image for. The pull rules — which fields, the price-claim rule — are in\n   [..\u002Fsocial-content-engine\u002Freference\u002Fshopify-assets.md](..\u002Fsocial-content-engine\u002Freference\u002Fshopify-assets.md)\n   (written for Shopify; Square's catalog images follow the same steps\n   from the tool inventory). With no storefront,\n   confirm the path to product photos on disk or that the brand kit is\n   live in Canva.\n\n5. **Generation budget.** Estimate the campaign's Canva volume and surface\n   it before Stage 1 begins. Default is 3 candidates per Canva-bound row;\n   each design costs ~5 API calls (autofill + export + polling).\n\n   ```\n   Generation budget for this campaign:\n     Canva (social) rows: 8\n     Candidates per row:  3   (default — say \"single candidate\" to use 1)\n     Total designs:       24\n     API calls (approx):  ~120  (autofill + export + polling)\n\n   Canva limit: 100 requests\u002Fminute. This will take ~2-3 minutes of\n   generation, well within your tier limits. Proceed?\n   ```\n\n   If the projected total designs exceeds 30, recommend single-candidate\n   mode upfront — large campaigns run out of headroom fast. The owner can\n   override the default to 1, 2, or 3 candidates per row before Stage 1\n   starts. Lock the chosen value for the entire session.\n\n---\n\n## Workflow\n\n### Stage 1 — Posting calendar\n\nPull from the brief: content themes, channels, cadence, hard dates\n(launches, sales, holidays).\n\nBuild a calendar table with a `Path` column that routes every row to either\nCanva or text-only drafting:\n\n| Date | Channel | Path | Theme | Asset type | Caption\u002FSubject angle |\n|------|---------|------|-------|------------|-----------------------|\n| Jun 2 | Instagram feed | Canva (social) | Linen launch | Square post | \"finally, a dress…\" |\n| Jun 5 | Email | Text-only | Linen launch | Email body | \"Linen that actually breathes\" |\n\nTag every email-channel row as `Text-only` before presenting. Cap at 30\ndays unless the brief specifies otherwise. Flag scheduling conflicts (two\nposts same day for the same product) up front.\n\n**Checkpoint 1.** Present the calendar. Ask: \"Does this match the plan?\nAny dates to shift, channels to add, or themes to swap?\" Iterate until\napproved, then restate the split out loud — \"N rows go through Canva, M\nrows go through text-only drafting\" — before moving on. Catching a\nmiscategorization here is free; catching it after generating designs\nisn't.\n\n---\n\n### Stage 2 — Asset inventory (Canva rows only)\n\nEmail rows skip this stage entirely. For each `Canva (social)` row, build\na manifest of what the template needs and what's already available.\n\n1. **Enumerate every image slot by name.** Square Instagram posts usually\n   have 1-2 image slots; carousels and product grids can have 5+. List\n   them individually (`Header_Image`, `Product1_Image`, `Product2_Image`,\n   …) — never roll them up as \"product images.\"\n   - Enterprise: read field names from `dataset[].label` on the brand\n     template (`GET \u002Fv1\u002Fbrand-templates\u002F{id}`).\n   - Pro\u002FTeams: count every distinct image rectangle in the template.\n\n2. **Inventory available assets.** Text content from the brief (product\n   names, offer copy, taglines, pricing), product image URLs read from the\n   connected storefront at pre-flight (uploaded in step 5, only for the\n   slots the gap table needs, and recorded by `asset.id` then), product\n   photos already uploaded to Canva (`GET \u002Fv1\u002Fassets`) or on the owner's\n   disk, brand kit colors and fonts (Enterprise). A price in a caption\n   comes from the storefront's returned value or the brief, never from\n   memory.\n\n3. **Build the slot-by-slot gap table.** One row per slot per design — not\n   per design.\n\n   | Date | Slot name | Slot kind | Available asset | Status |\n   |------|-----------|-----------|-----------------|--------|\n   | Jun 2 | Hero_Image | image | bloom_summer.jpg → asset_id pending | upload |\n   | Jun 2 | Headline | text | \"Summer linen, finally\" | ready |\n   | Jun 9 | Product1_Image | image | — | **MISSING** |\n\n4. **Resolve slot\u002Fasset mismatches with the owner.** If the template has\n   more image slots than the brief provides photos, pause and ask:\n\n   ```\n   The \"Summer Carousel\" template has 5 image slots. The brief gave me 1\n   photo (bloom_summer.jpg). How should I fill the other 4?\n\n     1. Reuse the same photo across all 5 slots\n     2. You send me 4 more photos (file paths)\n     3. Pick a simpler template with fewer slots\n   ```\n\n   No generation calls until the owner picks. Generating with empty slots\n   produces designs full of Canva's default landscape placeholders.\n\n5. **Upload missing photos and capture verified asset IDs.** Upload via\n   `POST \u002Fv1\u002Fasset-uploads`, then poll `GET \u002Fv1\u002Fasset-uploads\u002F{job_id}`\n   until `status == \"success\"`. Record `asset.id` from the response — this\n   is the only value that works in an autofill image field. Passing an\n   empty string, a URL, a file path, or a stale ID silently renders\n   Canva's stock landscape graphic instead of the photo.\n\n6. **Confirm the manifest.** Show the owner the completed slot-by-slot\n   table with every slot resolved and every image `asset.id` confirmed.\n   This is the last stop before Canva API calls.\n\n---\n\n### Stage 3 — Canva design generation\n\nBefore any Canva API call, re-read the calendar and drop any row whose\n`Path` is not `Canva (social)`. Email rows do not pass through this\nstage.\n\nGenerate designs **one calendar row at a time**, with 3 candidates per row\n(or the value chosen at pre-flight). Each row follows the same loop:\ngenerate candidates → verify → export → visually check → retry failures\n→ present → wait for owner pick → next row. Pause 30 seconds between\nrows. This caps the burst at 3 generations + 3 exports per ~30s — well\nunder Canva's 100 req\u002Fmin rate limit. Do not parallelize multiple rows;\none row at a time is the protection that keeps the owner from hitting\nquota mid-campaign.\n\n**Polling cadence.** Poll job status every 3-5 seconds, not faster.\nTighter intervals burn quota without speeding up completion.\n\n**Preview URLs — only one type is safe to embed.** Autofill responses\nreturn `design.canva.ai` thumbnails that expire within minutes; embedding\nthem as markdown images produces broken \"Show Image\" placeholders.\nPermanent export URLs (`export-download.canva.com` or the `export-design`\nMCP tool) do not expire. Native Cowork carousels render the autofill\nresult directly using the connector's authenticated session — let them\nrender on their own, don't re-embed.\n\n#### Row loop\n\n1. **Resolve template.** (Once per session — same template across rows\n   unless the calendar mixes asset types.)\n   - Enterprise: `GET \u002Fv1\u002Fbrand-templates` filtered by asset type.\n   - Pro\u002FTeams: `GET \u002Fv1\u002Fdesigns?ownership=any&query={template name}`,\n     surface top 3 to the owner, confirm one before generating.\n\n2. **Generate the row's candidates in parallel.** Fire the row's 3\n   candidates simultaneously (or N from pre-flight).\n   - Enterprise: `POST \u002Fv1\u002Fautofills` per candidate with the template ID\n     and field values. Poll all jobs concurrently.\n   - Pro\u002FTeams: `POST \u002Fv1\u002Fdesigns` to create copies. Describe the text and\n     image edits the owner applies in Canva; collect design IDs back.\n\n3. **Verify job status.** For each candidate, confirm\n   `GET \u002Fautofills\u002F{job_id}` returned `status == \"success\"` and\n   `result.design.id` is present. Handle errors per-design:\n   - `JOB_FAILED` → read `job.error.message`, fix the field values or\n     asset IDs, retry once.\n   - `RATE_LIMIT_EXCEEDED` (first hit this session) → wait 60s, retry\n     that one candidate once. This handles transient spikes.\n   - `RATE_LIMIT_EXCEEDED` (second hit this session) **or** any\n     `quota_exceeded` \u002F daily-cap error → stop generation immediately.\n     Do not retry. Surface progress and ask:\n\n     ```\n     Canva is rate-limiting the campaign. Status so far:\n       ✓ Generated:  Posts 1-4 (12 designs)\n       ⏸ Remaining:  Posts 5-8 (12 designs not yet generated)\n\n     How should I proceed?\n       1. Switch to 1 candidate per remaining row (4 designs total) — finishes now\n       2. Pause campaign — resume in 60 minutes when quota refills\n       3. Stop generation — work with what we have, move to captions\n     ```\n\n     Wait for the owner's choice. Do not loop on retry.\n\n4. **Export each successful candidate to a permanent PNG.** Fire the\n   row's exports in parallel.\n   - REST: `POST \u002Fv1\u002Fexports` with `format.type: \"png\"`, poll\n     `GET \u002Fv1\u002Fexports\u002F{job_id}` until success, capture `urls[0]`.\n   - Canva MCP: `export-design` with the design ID.\n\n   These permanent URLs are what get embedded in previews and attached to\n   the HubSpot post later. The autofill response thumbnail is never used\n   downstream.\n\n5. **Visually verify each export.** Look at the image and reject any of\n   these — they all indicate an unfilled slot or wrong asset:\n   - Generic landscape with clouds and green hills (Canva's default\n     placeholder)\n   - Solid gray rectangles where a photo should be\n   - Lorem-ipsum or template-default text\n   - Subject that doesn't match the brief (wrong product, wrong brand)\n\n   If a candidate fails verification: re-check the manifest for the\n   affected slot, fix the `asset.id`, regenerate that single candidate,\n   re-export, re-verify.\n\n6. **Retry per-candidate on partial failure.** If 1 of N candidates in\n   the row failed at Step 3 or 5, regenerate just that one — don't redo\n   the whole row and don't present a partial broken carousel. If the\n   second attempt also fails:\n\n   ```\n   The third candidate for the Jun 9 post keeps failing — Canva returned\n   [error \u002F rendered placeholder]. How should I proceed?\n\n     1. Skip it — present the other 2 and move on\n     2. Swap to a simpler template for just this candidate\n     3. Try once more with a different photo\n   ```\n\n7. **Present the row's candidates.** Let the native Cowork carousel\n   render the autofill tool result. Below it, add a text prompt:\n\n   ```\n   Jun 9 candidates are ready — scroll through the carousel above.\n   Which one should I use for the Jun 9 post?\n   ```\n\n   If the carousel doesn't render or one position is broken, embed the\n   permanent export PNG URLs from Step 4 instead. Final fallback: link to\n   the design's Canva edit URL (`https:\u002F\u002Fwww.canva.com\u002Fd\u002F{design_id}`).\n   Never re-embed `design.canva.ai` URLs.\n\n8. **Pause 30 seconds, then move to the next row.**\n\n**Checkpoint 2.** Satisfied once the owner has picked one design per\ncalendar row. If they want a regenerate, regenerate only that one\ncandidate.\n\n---\n\n### Stage 4 — Copy drafting\n\nFor each calendar row, draft the copy. Social rows get a caption; email\nrows get a full email.\n\n**Social captions** — Instagram, Facebook, X, LinkedIn:\n\n- Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500\n  recommended; X ≤ 280).\n- Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).\n- Voice: match the brief's tone markers. If the brief says \"casual and\n  friendly,\" don't write corporate copy.\n- No filler. No \"Exciting news!\" or \"We're thrilled to announce.\" Open\n  with the value.\n\n**Email content** — Claude writes the entire email; no Canva:\n\n- Subject: ≤ 50 chars, specific, no clickbait. \"Spring projects are\n  booking up\" beats \"Don't miss out!\"\n- Preheader: ≤ 90 chars, complements the subject without repeating it.\n- Body: plain prose, 100-250 words. Opening line that earns the read →\n  1-2 paragraphs of substance → single clear CTA → sign-off.\n- Voice: same tone markers as social. Owners want their emails to sound\n  like them, not like a templated newsletter.\n- No image references. Don't write \"see image above.\" If the owner wants\n  visuals, they add them in their email tool.\n- One CTA per email. Pick the most important action and lead with it.\n\nPresent captions inline below each social row. Present full emails\ninline below each email row:\n\n```\nSubject: \u003Csubject line>\nPreheader: \u003Cpreheader text>\n\n\u003Cbody text>\n```\n\nFor worked examples, see\n[reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md).\n\n**Checkpoint 3.** \"Any captions or emails to rewrite? Flag the date and\nwhat to change.\" Iterate until approved.\n\n---\n\n### Stage 5 — HubSpot staging + email handoff\n\nStage social posts in HubSpot. Email content is not staged — it's\nsurfaced inline for the owner to copy into their email tool. For API\nfield reference, see\n[reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md).\n\n1. **Create the campaign.** `POST \u002Fmarketing\u002Fv3\u002Fcampaigns` with the\n   campaign name and start\u002Fend dates from the calendar.\n\n2. **Stage each social post.** `POST` to the HubSpot Social API per\n   `Canva (social)` row:\n   - `channel`: map calendar channel to HubSpot account ID\n   - `scheduledAt`: ISO 8601 datetime — confirm it's in the future before\n     calling\n   - `content.body`: approved caption\n   - `attachments`: permanent Canva export PNG URL from Stage 3\n   - `status`: `SCHEDULED` (never `PUBLISHED`)\n\n3. **Confirm the queue.** Call\n   `GET \u002Fmarketing\u002Fv3\u002Fsocial\u002Fposts?status=SCHEDULED`, surface the list,\n   provide a direct link to the HubSpot campaign view.\n\n4. **Surface email content for handoff.** For each email row, present the\n   approved subject + preheader + body inline, grouped by send date. The\n   owner copies these into their email tool (HubSpot Marketing Email,\n   Mailchimp, Gmail or M365).\n\n**Final checkpoint.**\n\n```\nYour social posts are scheduled in HubSpot: [link]\nThey'll go out as scheduled — you can cancel or edit any post in HubSpot.\n\nEmail content is drafted below — copy each into your email tool when\nyou're ready to send:\n\n  Jun 5 — \"Spring projects are booking up\"\n  Jul 15 — \"Summer maintenance windows are filling\"\n\nAnything to change before we're done?\n```\n\nAlongside that summary — never replacing it — render the campaign as an\nHTML artifact per the house style (`..\u002F..\u002Fshared\u002Fartifact-style.md`): the\nposting calendar as a table, a per-channel status pill on each row\n(scheduled \u002F drafted \u002F handoff), and a staged-post panel per row with the\napproved caption or email copy and its export PNG link.\n\n**Closing offer.** One line on what the campaign now contains, then the\nsingle most relevant next step with its trigger phrase — usually \"is my\nmarketing working?\" (`growth-pulse`) once posts start going out. Up to\ntwo others: \"make the content\" (`social-content-engine`) for the standing\ncalendar, or \"my ads\" (`ad-manager`). Max three; never re-offer something\nthe owner declined this session.\n\n---\n\n## Approval gates\n\n- **No Canva calls for email rows.** Re-check the `Path` column before\n  every API call.\n- **No publishing.** Every HubSpot post is staged as `SCHEDULED`; the\n  owner controls go-live.\n- **Always surface the generation budget at pre-flight.** Owner sees the\n  total design count and approves before Stage 1 begins.\n- **One row at a time in Stage 3.** Candidates within a row fire in\n  parallel, but rows are sequential with a 30s gap — this is the quota\n  protection.\n- **On the second quota error, pause and ask.** Never loop on retry.\n- **Always export to a permanent PNG before presenting.** Job success\n  doesn't mean the design rendered correctly.\n- **Never embed `design.canva.ai` URLs in messages.** They expire.\n- **Never regenerate the whole row when one candidate fails.**\n  Per-candidate retry only.\n- **Never auto-select a template for Pro\u002FTeams users.** Always confirm.\n- **Never skip slot-by-slot inventory.** Multi-slot templates render\n  placeholder landscapes when any slot is empty.\n- **Never skip Checkpoint 1.** Generating before the calendar is approved\n  is the largest source of wasted work in this skill.\n\n---\n\n## Reference\n\n- [reference\u002Fcanva-api.md](reference\u002Fcanva-api.md) — Canva Connect API\n  endpoints, asset upload, export formats, MCP equivalents\n- [reference\u002Fhubspot-staging.md](reference\u002Fhubspot-staging.md) — HubSpot\n  Social API and CSV fallback for non-Pro tiers\n- [reference\u002Fgotchas.md](reference\u002Fgotchas.md) — Good \u002F Bad patterns for\n  common failure modes\n- [reference\u002Fexamples\u002Fboutique-brief-campaign.md](reference\u002Fexamples\u002Fboutique-brief-campaign.md)\n  — full worked examples (single-slot social, multi-slot template)\n\n## Using a tool that isn't listed\n\nThe connectors named in this skill are the tested paths, not a wall. If the owner wants this flow to use a tool that isn't connected or listed, offer `build-connector` — it checks the connector directory first and connects through Zapier otherwise, never hand-building against a raw API. Once the connection exists, the tool joins this skill like any other optional connector, under the same approval gates.\n",{"name":5,"description":49,"allowed-tools":50},"Takes an approved content brief and executes a campaign end-to-end: builds the posting calendar, generates Canva designs for social posts, drafts caption and email copy, and stages social sends in HubSpot. Canva is used for social posts only (Instagram, Facebook, X, LinkedIn) — email content is drafted as plain text and surfaced inline for the owner to send from their own tool. Every step requires explicit owner approval. This is the one-shot campaign executor: a finished brief goes in, a complete campaign comes out. Use when the owner hands off an approved brief or points at one — \"run this brief,\" \"execute the campaign,\" \"turn this brief into posts,\" \"build the campaign from the plan we approved.\" For day-to-day posting with no brief — \"I need to post more,\" \"what should we post\" — use social-content-engine instead; it owns the standing calendar.\n","Read, WebFetch","main","e605d8ddbfb688da57dfaaceebd93f12a64ef1d3","small-business\u002Fskills\u002Fcanva-creator",3918,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","https:\u002F\u002Fgithub.com\u002Fanthropics","https:\u002F\u002Fanthropic.com","2026-11-11 11:16:59",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add anthropics\u002Fknowledge-work-plugins --skill canva-creator",{"tool":65,"command":66},"bunx","bunx skills add anthropics\u002Fknowledge-work-plugins --skill canva-creator",{"tool":68,"command":69},"pnpm","pnpm dlx skills add anthropics\u002Fknowledge-work-plugins --skill canva-creator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002FSKILL.md",true,[73,79,83,87],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"reference\u002Fcanva-api.md","REFERENCE","参考文档",6763,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002Freference\u002Fcanva-api.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"reference\u002Fexamples\u002Fboutique-brief-campaign.md",5894,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002Freference\u002Fexamples\u002Fboutique-brief-campaign.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"reference\u002Fgotchas.md",12842,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002Freference\u002Fgotchas.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"reference\u002Fhubspot-staging.md",3630,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fcanva-creator\u002Freference\u002Fhubspot-staging.md",[92,116,138,161,189,210],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":44},"01M718Y97HCGW12Q53PSJDY03W","ticket-deflector","Reads a forwarded customer email or ticket, pulls order and refund status from a payments connector (PayPal, Square, or Stripe) or Shopify, account history from the CRM, and open tickets from a support desk (Zoho Desk), drafts a tone-matched reply in the owner's writing voice, and can issue a refund through the payments connector with explicit owner approval. With Shopify connected it also runs a proactive order-triage mode that surfaces orders needing attention — unfulfilled past the promised window, payment problems, pending refunds, stuck shipments — and drafts the next action for each before the customer has to ask. Use when the user says \"draft a response,\" \"answer this customer,\" \"where's my order,\" \"I want a refund,\" \"check my orders,\" or \"anything about to blow up.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fticket-deflector\u002FSKILL.md",[],[99,100,101,102,103,104,105,35,106,107,108,33,109,110,111,112,113,114,115,27],"ticket","ticket deflector","mode","up","payments","open","writing","workflow","ask","Connector","mail","window","next","customer","support","crm","past",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":44},"01M718Y55HFAN5705ME5VEDZ9K","tax-season-organizer","Prepares tax-season materials for the owner's accountant, not tax advice. US federal tax; a non-US business gets its closed-books packet instead. Two modes: (1) quarterly estimated tax from YTD net income in the ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); (2) year-end 1099 prep, scanning the ledger, PayPal, and Stripe for contractors paid over USD 600 into a 1099-NEC list with missing W-9 flags.\nAny tax request routes first to \u002Ftax-prep, which confirms the books are closed and reconciled before running this skill. Use this skill directly only when the owner says the period's books are already closed: \"books are closed, now do the 1099s,\" \"run the quarterly estimate off the closed numbers,\" or \"just the contractor W-9 list.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-season-organizer\u002FSKILL.md",[],[123,124,125,126,127,128,39,129,36,130,35,131,132,133,30,134,27,135,136,137],"tax season organizer","tax","us federal","which","netsuite","paid","usd","now","books","xero","scanning","request","flags","list","stripe",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":44},"01M718Y13VVPHDD9NTDBVFJ2AZ","tax-prep","Prepares tax materials as a two-link chain — month-end-prep confirms the books are closed and reconciled first, then tax-season-organizer calculates the quarterly estimated payment or builds the year-end 1099-NEC list and accountant packet from those closed numbers. Requires a ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); uses Gusto, PayPal, and Stripe when connected, else CSV upload. US federal tax math; a non-US business gets the closed-books packet. Prep material for a CPA, never tax advice, nothing filed. Trigger on \"quarterly taxes,\" \"estimated tax payment,\" \"how much should I set aside,\" \"1099s,\" \"1099-NEC,\" \"W-9s,\" \"year-end tax prep,\" \"get my books ready for my accountant,\" any phrasing that suggests a tax deadline is coming, or a question about net profit or YTD income that sounds like worry about a tax bill. An owner who says the period's books are already closed routes to tax-season-organizer directly.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-prep\u002FSKILL.md",[],[145,124,146,147,125,148,149,127,150,151,152,153,154,155,156,39,157,158,159,160],"tax prep","prep","SET","as","ready","never","zoho books","get","chain","profit","for","trigger","material","question","paypal","business",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":172,"publishedAt":44},"01M718XWTWQZ01GYSG9T8RW8TW","speed-to-lead","Makes sure no inbound lead goes unanswered. Watches web forms, the shared inbox, and the CRM for new inquiries, qualifies each one against the owner's criteria, drafts a reply in the owner's voice with real meeting times for the owner to approve and send, routes anything hot to a human right away, and logs the whole thing to the CRM. Never sends on its own. Built to run on a schedule so overnight inquiries are drafted and sorted by morning, and works from forwarded or pasted inquiries when no connector is available. Use this whenever the owner is worried about inbound leads or response time — including phrasings like \"leads are going cold,\" \"did anyone answer that inquiry,\" \"I keep missing form submissions,\" \"nothing falls through the cracks,\" \"handle my inbound,\" \"respond to this lead,\" or \"we lose people because nobody gets back fast enough.\" Reach for it for a single unanswered inquiry as readily as for a standing setup.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fspeed-to-lead\u002FSKILL.md",[167],{"categoryNo":168,"categoryName":169,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[173,174,175,176,177,178,150,179,180,40,181,182,183,184,35,185,186,108,187,188],"speed to lead","lead","speed","shared","back","cold","time","inbox","respond","new","web forms","people","schedule","logs","sure","human",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":198,"publishedAt":44},"01M718XQYMN1KY3TPS33967FK0","social-content-engine","Runs the owner's content operation as a standing thing rather than a one-off: keeps a rolling posting calendar, learns the owner's voice, generates on-brand Canva graphics, writes captions that sound like them, repurposes one asset into every channel format, and stages posts for approval instead of publishing on its own. Pulls product photos and prices from Shopify when connected; with no connectors, drafts the calendar and asset briefs for manual posting. Use this whenever the owner talks about posting, content, or social — including \"I need to post more,\" \"we've gone quiet on Instagram,\" \"what should we post this month,\" \"make the content,\" \"give me a month of posts,\" \"write this in my voice,\" \"repurpose this,\" or \"set up our content calendar.\" Reach for it for a single post as readily as for a full quarter. One handoff: a finished, approved campaign brief goes to canva-creator; this skill owns the standing operation.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsocial-content-engine\u002FSKILL.md",[195],{"categoryNo":196,"categoryName":197,"taxonomyType":170,"taxonomyTypeDesc":171},"01JBSEEDCAT000000000000036","内容创作者",[38,199,200,201,202,203,147,43,42,204,205,102,37,35,206,207,29,27,208,209],"social content engine","engine","content engine","social content","content","Captions","prices","me","product","write","drafts",{"skillNo":211,"name":212,"nameZh":6,"description":213,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":214,"categories":215,"keywords":216,"publishedAt":44},"01M718XMPJVH0EVRVP998BVZPC","smb-router","The front door to the Small Business plugin. Listens to what the owner needs right now — vague or specific — and routes them to the best skill or slash command for the moment. Also serves as a guide: explains what's available, suggests what to try next, and adapts recommendations based on stored business context. Trigger whenever the owner asks \"what can you do,\" \"help me with my business,\" \"what should I focus on,\" \"I don't know where to start,\" or any open-ended business request that doesn't clearly match a single skill.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsmb-router\u002FSKILL.md",[],[217,218,219,148,220,155,156,221,104,222,130,160,223,224,225,226,227,206,228,111],"router","smb","smb router","do","front","single","you","vague","can","with","plugin","focus"]