First-party app
Productive.io

Productive.io

Productive.io project and agency management: projects, tasks, boards, to-dos, comments, people, companies, deals and budgets, time entries, bookings, invoices, Docs pages and webhooks.

stable Project ManagementProductivityFinance & Accounting

About

Productive.io ships in the w6w first-party pack. It declares 57 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.productive
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Project Management · Productivity · Finance & Accounting

Overview

Productive.io is project, resource and financial management for agencies and professional-services teams. This app drives its REST API from a workflow: create and update projects, tasks and task lists, keep to-do checklists and comments, and read people, companies and Docs pages.

It also covers the money side: deals and budgets, the services inside a budget, time entries logged against them, resource bookings, and invoices (read), plus webhooks so a workflow can react to Productive events.

Authentication is a personal API token (X-Auth-Token) together with the numeric organization id (X-Organization-Id). The token acts as its owner, so what a workflow can see and change follows that person’s role. Lists return flattened resources with the vendor’s page metadata and a cursor for the next page.

Build with Productive.io

Three routes to the same 57 actions. The Workflow tab is generated from Productive.io's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Create Board

board-create

Create a board on a project (`POST /boards`).

Get Board

board-get

Get one board by id (`GET /boards/{id}`).

List Boards

board-list

List boards, filtered and paged (`GET /boards`).

Create Booking

booking-create

Book a person's time (`POST /bookings`).

Delete Booking

booking-delete

Delete a booking (`DELETE /bookings/{id}`).

Get Booking

booking-get

Get one booking by id (`GET /bookings/{id}`).

List Bookings

booking-list

List resource bookings, filtered, sorted and paged (`GET /bookings`). Tentative bookings need `draft` and `withDraft` both true.

Update Booking

booking-update

Change a booking (`PATCH /bookings/{id}`). Only the fields you set are sent.

Create Comment

comment-create

Comment on a task, deal, project, discussion, company or invoice (`POST /comments`).

Delete Comment

comment-delete

Delete a comment (`DELETE /comments/{id}`).

List Comments

comment-list

List comments, filtered and paged (`GET /comments`).

Update Comment

comment-update

Edit a comment (`PATCH /comments/{id}`). Only the fields you set are sent.

Create Company

company-create

Create a company (`POST /companies`).

Get Company

company-get

Get one company by id (`GET /companies/{id}`).

List Companies

company-list

List companies (clients, vendors), filtered, sorted and paged (`GET /companies`).

Update Company

company-update

Change a company (`PATCH /companies/{id}`). Only the fields you set are sent.

Create Deal or Budget

deal-create

Create a deal or budget (`POST /deals`).

Get Deal or Budget

deal-get

Get one deal or budget by id (`GET /deals/{id}`).

List Deals and Budgets

deal-list

List deals and budgets (one endpoint, told apart by `budget`), filtered, sorted and paged (`GET /deals`).

List Deal Statuses

deal-status-list

List deal pipeline stages (`GET /deal_statuses`).

Update Deal or Budget

deal-update

Change a deal or budget (`PATCH /deals/{id}`). Only the fields you set are sent. A budget's `delivered_on` can only be set through the vendor's close route, which this app does not cover.

Get Invoice

invoice-get

Get one invoice by id (`GET /invoices/{id}`).

List Invoices

invoice-list

List invoices, filtered, sorted and paged (`GET /invoices`).

Get Docs Page

page-get

Get one Docs page by id (`GET /pages/{id}`).

List Docs Pages

page-list

List Docs pages, filtered, sorted and paged (`GET /pages`).

Get Person

person-get

Get one person by id (`GET /people/{id}`).

List People

person-list

List people, filtered, sorted and paged (`GET /people`).

Archive Project

project-archive

Archive a project (`PATCH /projects/{id}/archive`).

Create Project

project-create

Create a project (`POST /projects`).

Get Project

project-get

Get one project by id (`GET /projects/{id}`).

List Projects

project-list

List projects, filtered, sorted and paged (`GET /projects`).

Restore Project

project-restore

Restore an archived project (`PATCH /projects/{id}/restore`).

Update Project

project-update

Change a project's name, type, company, manager or custom fields (`PATCH /projects/{id}`). Only the fields you set are sent.

Get Service

service-get

Get one service by id (`GET /services/{id}`).

List Services

service-list

List budget services, filtered, sorted and paged (`GET /services`).

Create Task

task-create

Create a task (`POST /tasks`).

Delete Task

task-delete

Delete a task (`DELETE /tasks/{id}`).

Get Task

task-get

Get one task by id (`GET /tasks/{id}`).

List Tasks

task-list

List tasks, filtered, sorted and paged (`GET /tasks`).

Update Task

task-update

Change a task, including moving it to another status or assignee (`PATCH /tasks/{id}`). Only the fields you set are sent.

Create Task List

tasklist-create

Create a task list on a project (`POST /task_lists`).

Get Task List

tasklist-get

Get one task list by id (`GET /task_lists/{id}`).

List Task Lists

tasklist-list

List task lists, filtered, sorted and paged (`GET /task_lists`).

Update Task List

tasklist-update

Rename or reposition a task list (`PATCH /task_lists/{id}`). Only the fields you set are sent.

Create Time Entry

time-entry-create

Log time against a service (`POST /time_entries`).

Delete Time Entry

time-entry-delete

Delete a time entry (`DELETE /time_entries/{id}`).

Get Time Entry

time-entry-get

Get one time entry by id (`GET /time_entries/{id}`).

List Time Entries

time-entry-list

List time entries, filtered, sorted and paged (`GET /time_entries`).

Update Time Entry

time-entry-update

Change a time entry (`PATCH /time_entries/{id}`). Only the fields you set are sent.

Create To-do

todo-create

Add a checklist item to a task or deal (`POST /todos`).

List To-dos

todo-list

List to-do checklist items, filtered and paged (`GET /todos`).

Update To-do

todo-update

Edit or complete a checklist item (`PATCH /todos/{id}`). Only the fields you set are sent.

Create Webhook

webhook-create

Create a webhook that calls a URL when an event happens (`POST /webhooks`). The answer omits the signature token and custom headers.

Delete Webhook

webhook-delete

Delete a webhook (`DELETE /webhooks/{id}`).

Get Webhook

webhook-get

Get one webhook by id (`GET /webhooks/{id}`). The signature token and custom headers are removed from the answer.

List Webhooks

webhook-list

List webhooks (`GET /webhooks`). The signature token and custom headers are removed from the answer.

List Workflow Statuses

workflow-status-list

List task workflow statuses (the columns tasks move through), filtered and paged (`GET /workflow_statuses`).

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Productive.io's real ids.

{
  "manifestVersion": "2",
  "name": "productive-example",
  "steps": [
    {
      "id": "board-create",
      "uses": {
        "app": "io.w6w.productive",
        "action": "board-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "name": "<name>",
        "projectId": "<projectId>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create Board

    perform
    board-create
  • Get Board

    read
    board-get
  • List Boards

    search
    board-list
  • Create Booking

    perform
    booking-create
  • Get Booking

    read
    booking-get

+52 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Productive.io, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Productive.io. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "board-create",
  payload: {
    name: "<value>",
    projectId: "<value>",
    // hidden: "<value>",
    // position: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action board-create --payload '{"name":"<value>","projectId":"<value>"}'

Give an AI agent Productive.io — without giving it Productive.io's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.productive#board-create",
    "input": {
      "name": "<name>",
      "projectId": "<projectId>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Productive.io connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Productive.io's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Productive.io itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Productive.io declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Productive platform status

Component status from status.productive.io (Uptime.com page data). The API Requests component decides; Document Exporting, Mailing, Searching, Realtime Notifications, Public Web and the User Interface are reported as detail.

dependency

API reachable

Unauthenticated GET https://api.productive.io/api/v2/projects. A 401 carrying Productive's JSON:API `errors` envelope passes: it proves the API and its auth layer are answering. Credential validity is the derived `auth:*` check's job.

quota

API rate-limit headroom