Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Handles one-off operations: the request is a concrete effect that happens once — export or copy data somewhere, a migration, a backfill, a cleanup — with no trigger, schedule, or reuse intent. The workflow is the vehicle, not the deliverable. Users rarely say "one-off"; infer it from the task's shape. Load before building for such a request, or when a build-workflow result contains postBuildFlow.reason "direct-one-off-build-succeeded". Do not load for automations the user will run again — that i
.claude/skills/n8n-io-one-off-operations/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 62% | 0% |
Use this skill when the request is a one-off operation: a concrete effect that needs to happen once, where a workflow is only the vehicle to make it happen. Typical shapes: "put this data in a spreadsheet", "copy these rows to X", "migrate/backfill/clean up Y".
These instructions are in English, but user-visible text you write while following them stays in the user's conversation language.
Users rarely label a task "one-off" — infer it from the task's shape, not from explicit phrasing. It is a one-off when the deliverable is a state change, not an automation:
pasted into the chat, sitting in a named node, table, file, or sheet — rather than data that will keep arriving over time.
what's in X", "clean out the duplicates"), with no trigger, schedule, or event vocabulary — no "when", "every", "whenever", "daily", "each time".
is never mentioned as the thing they want, only the outcome is.
Explicit markers ("just this once", "I won't need this again") confirm the classification but are not required — most one-offs arrive without them. Signals against: trigger/schedule vocabulary, "from now on", a named event source, or any hint the user wants the automation itself. When in doubt, treat the request as reusable and follow the normal build flow — a reusable workflow that runs once is harmless; a one-off flow applied to an automation skips verification the user would have wanted.
When the entire effect is one node operation, skip the workflow: execute the node directly with nodes(action="execute"). It runs a single node with real credentials through the regular execution engine and returns its real output items — no workflow to build, set up, verify, or clean up afterwards.
Direct execution is sufficient when ALL of these hold:
the destination may be a second execute call of a read operation.
in the conversation — so you can pass them literally as input items. Parameters must not use expressions referencing other nodes; they cannot resolve (the node runs alone).
main input alone — no required sub-nodeconnections (e.g. an AI Agent needs a language model attached; such nodes need a workflow).
credentials(action="list")); theaction takes resolved { id, name } references. If credentials must be created first, route that through the credentials setup as usual.
The run executes in the current conversation's project, so credentials shared with that project are usable. If it fails because a credential is not accessible there, fall back to the one-off workflow flow below.
Call it with the same shape as a workflow-sdk node — { type, version, config: { parameters, credentials } } plus input items. Read nodes(action="type-definition") first, as you would before configuring any node. Approval works exactly like executions(action="run") — the same run-approval card, admin policy, and session grants — and for a one-off that prompt is the consent gate. The returned output items are real, so the read-back rule below is satisfied by reading what came back — report only from those items (binary content is returned as metadata only).
If the task needs more than that — several chained steps, branching, merges, non-trivial transformations, or data that must flow between nodes — build the workflow and use the flow below.
A one-off that touches external systems is still anchored on n8n nodes (you cannot write to external services directly) — the intent changes the post-build flow, not the anchor.
never published, so an event trigger (webhook, form, schedule) would never fire and only misleads. If the task genuinely needs an event source or a future run time, it is not a one-off — reclassify it as a reusable automation or a scheduled task and use the normal flow. Pass executionIntent: "one-off" to build-workflow. This marks verification as optional in the build outcome — no verification follow-up is scheduled, and the completion criterion becomes a live run whose output you read back.
setup, route it through workflows(action="setup") as usual. A one-off still needs real credentials before it can run live.
executions(action="run"). The run-approval card is theuser's consent gate — for a one-off, the live run IS what the user asked for, so the usual "reserve live runs for explicit user requests" rule is satisfied by the request itself. Do not run before setup is complete.
the effect nodes with executions(action="get-node-output") — the run result data is truncated and not enough for quantitative claims. Check that each write/effect node's input was the intended data (the rows you meant to write), not an upstream node's API response. Report only numbers, columns, and shapes you actually read. If the target system is cheap to read (e.g. a read operation of the same node type), offer a read-back of the destination as final confirmation.
to keep the workflow for future reuse or delete it now that the job is done. Never delete without asking. If the user keeps it, mention it stays unpublished unless they say otherwise. This step is about the workflow: the data a one-off wrote is the deliverable the user asked for, so never offer to undo that. Test data left behind by a test run is the opposite case — see "Cleaning up after a live test" in post-build-flow.
verify-built-workflow is available but not required and never the completion criterion for a one-off. Offer it before the live run only when the wiring is complex (branching, merges, non-trivial transformations) or the user is cautious about touching real data.
When you do run it, present results honestly:
data flowing into simulated write nodes was NOT validated (their output is a fabricated success fixture).
pass alone, and never let it substitute for the live run and read-back.
Do not make quantitative claims ("22 rows written", "columns matched") that you did not read back from actual execution output or the target system. A successful run status alone does not prove the right data was written — read the effect node's real output first. If you could not read it back, say so plainly and name what is unconfirmed.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 6,559 | 9,544 | +46% | 1 | 1 | 0% | 1,101 | 2,364 | +115% | 0 | 0 | — |
case-02 | fail→fail | 14,687 | 8,425 | -43% | 1 | 1 | 0% | 2,441 | 2,270 | -7% | 0 | 0 | — |
case-03 | fail→fail | 10,987 | 11,283 | +3% | 1 | 1 | 0% | 2,027 | 2,403 | +19% | 0 | 0 | — |
case-04 | fail→fail | 8,064 | 16,851 | +109% | 1 | 1 | 0% | 1,330 | 2,497 | +88% | 0 | 0 | — |
case-05 | pass→pass | 10,529 | 4,915 | -53% | 1 | 1 | 0% | 1,683 | 2,473 | +47% | 0 | 0 | — |
case-06 | pass→pass | 12,316 | 4,725 | -62% | 1 | 1 | 0% | 1,798 | 2,488 | +38% | 0 | 0 | — |
case-07 | pass→pass | 7,914 | 4,117 | -48% | 1 | 1 | 0% | 1,197 | 2,229 | +86% | 0 | 0 | — |
case-08 | fail→pass | 11,981 | 2,208 | -82% | 1 | 1 | 0% | 1,888 | 2,003 | +6% | 0 | 0 | — |
case-09 | fail→pass | 12,630 | 3,674 | -71% | 1 | 1 | 0% | 1,930 | 2,257 | +17% | 0 | 0 | — |
case-10 | fail→pass | 9,883 | 3,685 | -63% | 1 | 1 | 0% | 1,438 | 2,285 | +59% | 0 | 0 | — |
case-11 | fail→pass | 9,999 | 3,767 | -62% | 1 | 1 | 0% | 1,423 | 2,158 | +52% | 0 | 0 | — |
case-12 | pass→pass | 6,100 | 5,499 | -10% | 1 | 1 | 0% | 657 | 2,649 | +303% | 0 | 0 | — |
case-13 | pass→pass | 9,875 | 8,773 | -11% | 1 | 1 | 0% | 1,656 | 3,014 | +82% | 0 | 0 | — |
case-14 | pass→pass | 12,129 | 5,853 | -52% | 1 | 1 | 0% | 1,837 | 2,389 | +30% | 0 | 0 | — |
case-15 | pass→pass | 7,231 | 5,224 | -28% | 1 | 1 | 0% | 990 | 2,470 | +149% | 0 | 0 | — |
case-16 | fail→pass | 9,998 | 23,779 | +138% | 1 | 1 | 0% | 1,625 | 2,630 | +62% | 0 | 0 | — |
case-17 | pass→pass | 9,360 | 5,912 | -37% | 1 | 1 | 0% | 1,412 | 2,429 | +72% | 0 | 0 | — |
case-18 | pass→pass | 13,114 | 9,106 | -31% | 1 | 1 | 0% | 2,217 | 2,578 | +16% | 0 | 0 | — |
case-19 | pass→pass | 8,189 | 5,693 | -30% | 1 | 1 | 0% | 1,165 | 2,477 | +113% | 0 | 0 | — |
case-20 | fail→pass | 12,367 | 3,712 | -70% | 1 | 1 | 0% | 1,676 | 2,103 | +25% | 0 | 0 | — |
case-21 | pass→pass | 12,829 | 3,432 | -73% | 1 | 1 | 0% | 1,923 | 2,186 | +14% | 0 | 0 | — |
case-22 | pass→pass | 6,942 | 5,460 | -21% | 1 | 1 | 0% | 963 | 2,409 | +150% | 0 | 0 | — |
case-23 | pass→pass | 8,832 | 5,466 | -38% | 1 | 1 | 0% | 1,292 | 2,638 | +104% | 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. 23 cases were attempted, and 19 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +26 percentage points is the difference between those two pass rates over the 19 comparable cases.
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.