First-party app
Printavo

Printavo

Manage customers, contacts, quotes, invoices, tasks, inquiries and payments in Printavo, the print-shop management system, via its GraphQL API v2.

stable Customer Relationship ManagementFinance & AccountingCommerce & Payments

About

Printavo ships in the w6w first-party pack. It declares 38 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.printavo
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Customer Relationship Management · Finance & Accounting · Commerce & Payments

Overview

Printavo is shop-management software for screen printers, embroiderers and promotional-product shops: customers and contacts, quotes that become invoices, production statuses, tasks, inquiries and payments. This app covers that core over Printavo’s GraphQL API v2 (POST https://www.printavo.com/api/v2, authenticated with your Printavo email and API token): list, read, create, update and delete customers, contacts, quotes, invoices and tasks; move a quote or invoice to a new status; record payments; read inquiries, payment requests and the product catalog.

Build with Printavo

Three routes to the same 38 actions. The Workflow tab is generated from Printavo'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.

Get Account

account-get

The Printavo account (shop) of the current session: company name, contact details, locale.

Create Contact

contact-create

Add a contact to an existing customer (contactCreate; the `id` argument is the customer's ID).

Delete Contact

contact-delete

Delete a contact (contactDelete).

Get Contact

contact-get

Fetch one contact by ID.

List Contacts

contact-list

List contacts with optional search and sorting.

Update Contact

contact-update

Update a contact (contactUpdate); only the fields you set are sent.

Create Customer

customer-create

Create a customer with its required primary contact (customerCreate).

Delete Customer

customer-delete

Permanently delete a customer (customerDelete).

Get Customer

customer-get

Fetch one customer by ID.

List Customers

customer-list

List customers, page by page (cursor pagination). The reference documents no search or sort arguments for customers.

Update Customer

customer-update

Update a customer's company-level fields (customerUpdate); only the fields you set are sent.

Create Inquiry

inquiry-create

Create an inquiry, e.g. from a web form (inquiryCreate).

Get Inquiry

inquiry-get

Fetch one inquiry by ID.

List Inquiries

inquiry-list

List customer inquiries (quote requests).

Delete Invoice

invoice-delete

Delete an invoice (invoiceDelete).

Duplicate Invoice

invoice-duplicate

Create a copy of a invoice (`invoiceDuplicate`). Not idempotent: every call makes another copy.

Get Invoice

invoice-get

Fetch one invoice by ID, with notes, addresses and document URLs.

List Invoices

invoice-list

List invoices with optional status, payment, tag, date and sort filters.

Update Invoice

invoice-update

Update a invoice (`invoiceUpdate`); only the fields you set are sent. Use Set Order Status to change its status.

Get Order (Quote or Invoice)

order-get

Fetch a quote or invoice by ID when you do not know which it is; `__typename` says which.

List Orders (Quotes and Invoices)

order-list

List quotes and invoices together (orders). This connection has no totalNodes in the reference.

Set Order Status

order-status-set

Set the status of a quote or invoice (statusUpdate). The status must be of the matching type; list them with List Statuses.

Record Payment

payment-create

Record a payment against a quote or invoice (transactionPaymentCreate). Not idempotent: each call adds another payment.

List Payment Requests

payment-request-list

List open (or closed/archived) payment requests.

Search Products

product-search

Search the product catalog by term (products; the query is required by the API).

Create Quote

quote-create

Create a quote for a customer contact (quoteCreate). Line item groups, fees and production files are not exposed by this action.

Delete Quote

quote-delete

Delete a quote (quoteDelete).

Duplicate Quote

quote-duplicate

Create a copy of a quote (`quoteDuplicate`). Not idempotent: every call makes another copy.

Get Quote

quote-get

Fetch one quote by ID, with notes, addresses and document URLs.

List Quotes

quote-list

List quotes with optional status, payment, tag, date and sort filters.

Update Quote

quote-update

Update a quote (`quoteUpdate`); only the fields you set are sent. Use Set Order Status to change its status.

List Statuses

status-list

List order statuses, optionally only quote or invoice statuses.

Create Task

task-create

Create a task, optionally attached to a quote, invoice or customer (taskCreate). Name and due date are required by the API.

Delete Task

task-delete

Delete a task (taskDelete).

Get Task

task-get

Fetch one task by ID.

List Tasks

task-list

List tasks, filtered by assignee, completion, due window or the status of the order they hang off.

Update Task

task-update

Update a task, e.g. mark it completed (taskUpdate); only the fields you set are sent.

Get Current User

user-get

The user the credential belongs to, with their account (company) profile.

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 Printavo's real ids.

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

Here are some of the things you can do

  • Create Contact

    perform
    contact-create
  • Get Account

    read
    account-get
  • Get Contact

    read
    contact-get
  • List Contacts

    search
    contact-list
  • Update Contact

    perform
    contact-update

+33 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 Printavo, 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 Printavo. 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: "contact-create",
  payload: {
    customerId: "<value>",
    // firstName: "<value>",
    // lastName: "<value>",
    // email: "<value>",
    // phone: "<value>",
    // fax: "<value>",
  },
});

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

Give an AI agent Printavo — without giving it Printavo'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.printavo#contact-create",
    "input": {
      "customerId": "<customerId>"
    }
  }
}

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 Printavo 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

Printavo'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. Printavo itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

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

service

Printavo platform status

quota

API request headroom