First-party app
Anchor

Anchor

Manage Anchor proposals, agreements, invoices, payouts, contacts and webhooks.

stable Finance & AccountingCustomer Relationship Management

About

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

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

Overview

Anchor is billing and proposal software for service businesses: you send a client a proposal, they approve and sign it, and it becomes an agreement that bills on a schedule.

This app covers that whole lifecycle through Anchor’s public API: create contacts, clone a proposal template into a draft, publish it to the client, withdraw and republish it for edits, and approve on the client’s behalf. Once an agreement exists you can read it, rename it, add credits and submit one-off or out-of-scope charges to issue an invoice now or on a future date.

For money coming in, read invoices and payouts, including the invoice charges that make up each payout, and filter by status, issue date or QuickBooks and Xero sync state. Webhook subscribe and unsubscribe actions let a workflow react to proposal, agreement, invoice and payout events instead of polling.

Build with Anchor

Three routes to the same 33 actions. The Workflow tab is generated from Anchor'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 Or Create Ad-Hoc Agreement

adhoc-agreement-get-or-create

Return the ad-hoc agreement between you and one client contact, creating it if none exists.

Get Agreement

agreement-get

Fetch a signed agreement (v2 shape): typed billing triggers, pending amendments and signing audit.

List Agreements

agreement-list

Page through signed agreements (v2 list; identical payload to v1).

Rename Agreement

agreement-rename

Change the title of a signed agreement.

Get Active Business

business-get

Return the Anchor business the API key is bound to — its id and display name.

Submit Charges

charges-submit

Submit charges for an agreement to generate an invoice now (bill_now) or on a future date (schedule_bill).

Create Contact

contact-create

Create a client contact. Uniqueness is per (email, company name): the same email under a different company creates a second contact.

Get Contact

contact-get

Fetch one contact: primary person, company name, phone and metadata.

List Contacts

contact-list

Page through client contacts, optionally filtered by search text or accessibility.

Add Credit

credit-add

Add a credit (negative charge) to a client's account under an agreement. It reduces the total due on future invoices.

Get Invoice

invoice-get

Fetch one invoice: line items, payment information, accounting sync status and amount breakdown.

List Invoices

invoice-list

Page through invoices issued by your business, with filters for status, dates and accounting sync.

List Legal Terms

legal-terms-list

Page through your legal-terms documents (terms of service, privacy policy, MSA).

Get Payout

payout-get

Fetch one payout with its fee breakdown and accounting sync status.

List Payout Invoices

payout-invoice-list

List the invoice charges (payments, refunds, disputes) that make up one payout.

List Payouts

payout-list

Page through payouts (transfers to your bank account).

Approve Proposal On Behalf Of Client

proposal-approve-on-behalf

Approve a sent proposal as the service provider, turning it into an agreement. Irreversible.

Cancel Proposal Edit

proposal-cancel-edit

Discard the linked draft's pending edits and restore the proposal. Only valid after Withdraw Proposal For Editing.

Create Proposal Draft From Template

proposal-draft-create-from-template

Clone a proposal template into a new draft, optionally linked to a client contact.

Get Proposal Draft

proposal-draft-get

Fetch one proposal draft in full: services, billing configuration, payment settings and legal terms.

List Proposal Drafts

proposal-draft-list

Page through proposal drafts (work in progress, not yet sent to a client).

Update Proposal Draft

proposal-draft-update

Change a draft's own fields. Only the fields you send change; services, packages and legal terms are not editable here.

Get Proposal

proposal-get

Fetch one proposal in full, including client and service-provider details.

List Proposals

proposal-list

Page through proposals sent to clients (name, status, client, expiration, progress).

Publish Proposal

proposal-publish

Publish a draft as a proposal and send it to the client.

Republish Proposal

proposal-republish

Apply the linked draft's edits and re-send the proposal. Only valid after Withdraw Proposal For Editing.

Get Proposal Template

proposal-template-get

Fetch a proposal template: agreement name, services, packages, payment settings and legal-terms references.

List Proposal Templates

proposal-template-list

Page through saved proposal templates. Returns id and last-updated time only; fetch one for the full structure.

Withdraw Proposal For Editing

proposal-withdraw-for-editing

Withdraw a published proposal so its linked draft becomes editable. Finish with Republish Proposal or Cancel Proposal Edit.

List Service Templates

service-template-list

Page through reusable service templates and bundles (name, billing, pricing).

Subscribe Webhook

webhook-subscribe

Create or update the subscription for a URL; each call REPLACES that URL's event types. The response carries the key for verifying payloads.

List Webhook Subscriptions

webhook-subscription-list

List the active webhook subscriptions: target URL and event types.

Unsubscribe Webhook

webhook-unsubscribe

Remove a webhook subscription; its URL stops receiving events.

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

{
  "manifestVersion": "2",
  "name": "anchor-example",
  "steps": [
    {
      "id": "adhoc-agreement-get-or-create",
      "uses": {
        "app": "io.w6w.anchor",
        "action": "adhoc-agreement-get-or-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "clientContactId": "<clientContactId>"
      }
    }
  ]
}

Here are some of the things you can do

  • Get Or Create Ad-Hoc Agreement

    perform
    adhoc-agreement-get-or-create
  • Get Agreement

    read
    agreement-get
  • List Agreements

    search
    agreement-list
  • Rename Agreement

    perform
    agreement-rename
  • Get Active Business

    read
    business-get

+28 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 Anchor, 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 Anchor. 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: "adhoc-agreement-get-or-create",
  payload: {
    clientContactId: "<value>",
  },
});

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

Give an AI agent Anchor — without giving it Anchor'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.anchor#adhoc-agreement-get-or-create",
    "input": {
      "clientContactId": "<clientContactId>"
    }
  }
}

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

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

Request MCP access

Health checks

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

service

Anchor platform status

quota

API rate-limit headroom

Requests remaining in the current rate-limit window, from GET /me headers.