Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Execute the Canva design creation and export pipeline via the Connect API. Use when building design creation workflows, exporting designs programmatically, or integrating Canva's design tools into your application. Trigger with phrases like "canva create design", "canva export", "canva design pipeline", "canva generate content".
.claude/skills/jeremylongshore-canva-core-workflow-a/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 46% | 0% |
Keep design creation, user editing, export submission, job reconciliation, and result delivery as separate recorded operations. Query current supported export formats instead of hard-coding a universal list.
Resolve tenant, user, design purpose, required explicit scopes, content rights, and whether a new design is permitted.
Persist an application operation key before submitting the design request. Store only the returned opaque design reference and approved URLs under policy.
Present the correct view or edit surface only to the authorized user. Do not treat creation as evidence that downstream export is allowed.
Query the design export-formats endpoint when available and validate the requested format/options against that response and current OpenAPI.
Persist the export job ID, poll the existing job with bounded exponential backoff, and stop on success, failed, or the local timeout budget.
Validate content type and destination, keep result URLs out of logs, honor response/provider expiry evidence, and record cleanup or retention.
Canva Connect calls use Bearer access tokens obtained by a backend through OAuth 2.0 Authorization Code with SHA-256 PKCE. Request explicit least-privilege scopes, keep client secrets and tokens out of browser-visible state, and serialize refresh so the replacement single-use refresh token is stored atomically.
Use Read and Grep for discovery and evidence. Use Write or Edit only for the approved artifact, code, configuration, test, or receipt described by this workflow; do not make an unapproved Canva-side change.
A user creates an approved presentation, edits it in Canva, then requests PDF export. The service checks available formats, submits one job, reconciles its ID, and delivers the result through an access-controlled application route.
| Failure | Response | | --- | --- | | Format unavailable | Return the current supported choices without submitting | | Export remains in progress | Stop at the local budget and continue reconciliation asynchronously | | Design ownership changed | Fail closed and require a new authorization decision | | Result URL reaches logs | Revoke access where possible and remediate redaction |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→pass | 18,990 | 13,577 | -29% | 1 | 1 | 0% | 3,869 | 4,980 | +29% | 0 | 0 | — |
case-12 | pass→pass | 9,909 | 4,006 | -60% | 1 | 1 | 0% | 1,708 | 2,573 | +51% | 0 | 0 | — |
case-13 | fail→pass | 7,423 | 2,142 | -71% | 1 | 1 | 0% | 1,238 | 1,977 | +60% | 0 | 0 | — |
case-01 | fail→pass | 13,231 | 7,929 | -40% | 1 | 1 | 0% | 2,681 | 3,427 | +28% | 0 | 0 | — |
case-02 | fail→pass | 16,465 | 11,469 | -30% | 1 | 1 | 0% | 3,351 | 4,174 | +25% | 0 | 0 | — |
case-04 | fail→pass | 8,244 | 2,915 | -65% | 1 | 1 | 0% | 1,590 | 2,323 | +46% | 0 | 0 | — |
case-05 | pass→pass | 8,954 | 2,864 | -68% | 1 | 1 | 0% | 1,620 | 2,329 | +44% | 0 | 0 | — |
case-06 | fail→pass | 12,236 | 6,240 | -49% | 1 | 1 | 0% | 2,466 | 3,005 | +22% | 0 | 0 | — |
case-07 | fail→pass | 13,975 | 3,147 | -77% | 1 | 1 | 0% | 2,304 | 2,260 | -2% | 0 | 0 | — |
case-14 | pass→pass | 6,074 | 2,976 | -51% | 1 | 1 | 0% | 1,049 | 2,198 | +110% | 0 | 0 | — |
case-08 | pass→pass | 9,324 | 4,777 | -49% | 1 | 1 | 0% | 1,655 | 2,697 | +63% | 0 | 0 | — |
case-09 | fail→pass | 7,728 | 2,339 | -70% | 1 | 1 | 0% | 1,183 | 2,152 | +82% | 0 | 0 | — |
case-10 | pass→pass | 8,624 | 2,353 | -73% | 1 | 1 | 0% | 1,444 | 2,179 | +51% | 0 | 0 | — |
case-11 | fail→pass | 27,140 | 8,368 | -69% | 1 | 1 | 0% | 2,542 | 3,536 | +39% | 0 | 0 | — |
case-15 | fail→pass | 9,578 | 2,086 | -78% | 1 | 1 | 0% | 1,646 | 2,106 | +28% | 0 | 0 | — |
case-16 | pass→fail | 2,913 | 1,463 | -50% | 1 | 1 | 0% | 462 | 2,016 | +336% | 0 | 0 | — |
case-17 | fail→pass | 8,657 | 3,588 | -59% | 1 | 1 | 0% | 1,627 | 2,432 | +49% | 0 | 0 | — |
case-18 | pass→pass | 5,755 | 1,346 | -77% | 1 | 1 | 0% | 937 | 1,976 | +111% | 0 | 0 | — |
case-19 | fail→pass | 4,430 | 1,298 | -71% | 1 | 1 | 0% | 570 | 1,977 | +247% | 0 | 0 | — |
case-20 | pass→pass | 13,135 | 8,747 | -33% | 1 | 1 | 0% | 2,631 | 3,538 | +34% | 0 | 0 | — |
case-21 | pass→pass | 15,208 | 13,895 | -9% | 1 | 1 | 0% | 2,540 | 4,465 | +76% | 0 | 0 | — |
case-22 | pass→pass | 11,091 | 12,239 | +10% | 1 | 1 | 0% | 1,710 | 4,420 | +158% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +50 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.