Clockify ACTION
Update Invoice
Updates an existing invoice in a Clockify workspace. Clockify's update endpoint replaces the entire invoice, so this action first fetches the current invoice and merges your changes into it — fields you don't set are left unchanged, including the invoice's tax and discount percentages, which this action preserves but cannot edit.
Status is applied through a separate endpoint, so it is sent as a second request after the field changes are saved, and setting it alone skips the replace entirely. Clockify offers no transaction across the two endpoints: if the status request fails, the field changes have already been applied. Line items and imported time cannot be set through Clockify's public API. Use List Invoices to find the ID of the invoice to update. See the documentation and the status endpoint- Action
- Writes data
- API key
- SDK
- MCP
IMPLEMENTATION
Call this tool
Connect a user's Clockify account once, then configure and run Update Invoice from your backend or agent.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "clockify-update-invoice",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
clockify: { authProvisionId: "apn_xxxxxxx" },
workspaceId: "Workspace",
invoiceId: "Invoice ID",
},
})
console.log(result)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "clockify-update-invoice",
"configured_props": {
"clockify": { "authProvisionId": "apn_xxxxxxx" },
"workspaceId": "Workspace",
"invoiceId": "Invoice ID"
}
}'// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "clockify",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
name: "clockify-update-invoice",
arguments: {
workspaceId: "Workspace",
invoiceId: "Invoice ID",
},
})SCHEMA
Inputs
Pipedream supplies the connected account. Your application provides the operation-specific values below. Dynamic inputs are resolved against that user's account.
| Property | Type | Description |
|---|---|---|
workspaceId Workspace | string | Identifier of a workspace Required Dynamic |
invoiceId Invoice ID | string | Identifier of an invoice. Use the List Invoices action to find it, and pass the id field from that response — e.g. 6a72db27a231b34fe8361aeb — not the human-readable invoice number such as INV-001. Passing the invoice number fails with a misleading Invoice doesn't belong to Workspace error. Required |
clientId Client | string | Identifier of a client Optional Dynamic |
number Number | string | New invoice number. Example: INV-001 Optional |
issuedDate Issue Date | string | New issue date of the invoice, in ISO 8601 format. Example: 2026-08-05T00:00:00Z Optional |
dueDate Due Date | string | New due date of the invoice, in ISO 8601 format. Example: 2026-09-05T00:00:00Z Optional |
currency Currency | string | New currency of the invoice. Example: USD Optional |
subject Subject | string | New subject line for the invoice. Example: Consulting services, August 2026 Optional |
note Note | string | New note for the invoice, e.g. a summary of the billing period or hours covered. Set to an empty string to clear the existing note Optional |
status Status | string | New status of the invoice. Clockify applies this through a dedicated status endpoint rather than the update endpoint, so it is sent as a separate request after the other field changes are saved. If it fails, those field changes have already been applied Optional |
REFERENCE
Tool details
Behavior hints are published with the component in the Pipedream registry and surface as MCP tool annotations, so an agent can reason about a tool before it calls it.
- Registry key
- clockify-update-invoice
- Version
- 0.0.2
- App
- Clockify
- Authentication
- API key
- Read-only
- No
- Destructive
- No
- Open world
- Yes
- Source
- View on GitHub ↗