First-party app
Upsales

Upsales

Manage Upsales CRM data: contacts, companies, opportunities and orders, activities, appointments, products, tickets and more.

stable Customer Relationship ManagementMarketing

About

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

App id
io.w6w.upsales
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Customer Relationship Management · Marketing

Overview

Upsales is a Nordic sales and marketing CRM. This app covers its core CRM objects over the Upsales API v2: contacts, companies, opportunities and orders, activities (to-dos and phone calls), appointments, campaigns, products and product categories, price lists, order stages, comments, support tickets, subscriptions and users, plus read-only lookups for activity types, appointment types, currencies and custom-field definitions.

Every list action pages with limit and offset and accepts Upsales’ own filter syntax (attribute=comparison:value, for example probability=gte:1), so a workflow can pull exactly the slice it needs without paging the whole account. Writes take the common fields as typed parameters and any other field, including custom fields, through a JSON escape hatch.

Authentication is an Upsales API key, which the platform attaches to each request as the token query parameter. Health checks track Upsales’ public status page, the reachability of the API host, and the API key’s own rate-limit headroom.

Build with Upsales

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

activity-create

Create a activity (to-do or phone call).

Delete Activity

activity-delete

Delete a activity (to-do or phone call).

Get Activity

activity-get

Fetch one activity (to-do or phone call) by ID.

List Activities

activity-list

List activities (to-dos and phone calls) in Upsales.

List Activity Types

activity-type-list

List activity types (the to-do and phone-call types an activity can have).

Update Activity

activity-update

Update a activity (to-do or phone call).

Create Appointment

appointment-create

Create a appointment.

Delete Appointment

appointment-delete

Delete a appointment.

List Appointments

appointment-list

List appointments in Upsales.

List Appointment Types

appointment-type-list

List appointment types.

Update Appointment

appointment-update

Update a appointment.

Create Campaign

campaign-create

Create a campaign.

Delete Campaign

campaign-delete

Delete a campaign.

Get Campaign

campaign-get

Fetch one campaign by ID.

List Campaigns

campaign-list

List campaigns (projects) in Upsales.

Update Campaign

campaign-update

Update a campaign.

Create Comment

comment-create

Create a comment.

Delete Comment

comment-delete

Delete a comment.

Get Comment

comment-get

Fetch one comment by ID.

List Comments

comment-list

List comments in Upsales. Filter by company with the client.id filter.

Update Comment

comment-update

Update a comment.

Create Company

company-create

Create a company.

Delete Company

company-delete

Delete a company.

Get Company

company-get

Fetch one company by ID.

List Companies

company-list

List companies (accounts) in Upsales.

Update Company

company-update

Update a company.

Create Contact

contact-create

Create a contact.

Delete Contact

contact-delete

Delete a contact.

Get Contact

contact-get

Fetch one contact by ID.

List Contacts

contact-list

List contacts in Upsales.

Update Contact

contact-update

Update a contact.

List Currencies

currency-list

List the currencies enabled in the account, with exchange rates.

List Custom Fields

custom-field-list

List the custom-field definitions for one Upsales object type.

Create Order or Opportunity

order-create

Create a order or opportunity.

Delete Order or Opportunity

order-delete

Delete a order or opportunity.

Get Order or Opportunity

order-get

Fetch one order or opportunity by ID.

List Orders and Opportunities

order-list

List orders and opportunities. Both live on /orders and differ only by probability.

Create Order Stage

order-stage-create

Create a order or opportunity stage.

Delete Order Stage

order-stage-delete

Delete a order or opportunity stage.

Get Order Stage

order-stage-get

Fetch one order or opportunity stage by ID.

List Order Stages

order-stage-list

List order or opportunity stages in Upsales.

Update Order Stage

order-stage-update

Update a order or opportunity stage.

Update Order or Opportunity

order-update

Update a order or opportunity.

Create Price List

price-list-create

Create a price list.

Get Price List

price-list-get

Fetch one price list by ID.

List Price Lists

price-list-list

List price lists in Upsales.

Update Price List

price-list-update

Update a price list.

Create Product Category

product-category-create

Create a product category.

Delete Product Category

product-category-delete

Delete a product category.

Get Product Category

product-category-get

Fetch one product category by ID.

List Product Categories

product-category-list

List product categorys in Upsales.

Update Product Category

product-category-update

Update a product category.

Create Product

product-create

Create a product.

Get Product

product-get

Fetch one product by ID.

List Products

product-list

List products in Upsales.

Update Product

product-update

Update a product.

Get Current User

self-get

Fetch the user and account the API key belongs to.

Delete Subscription

subscription-delete

Delete a subscription.

Get Subscription

subscription-get

Fetch one subscription by ID.

List Subscriptions

subscription-list

List subscriptions (recurring revenue agreements) in Upsales.

Add Ticket Comment

ticket-comment-add

Add a comment to a support ticket.

Create Ticket

ticket-create

Create a support ticket.

Delete Ticket

ticket-delete

Delete a support ticket.

Get Ticket

ticket-get

Fetch one support ticket by ID.

List Tickets

ticket-list

List support tickets in Upsales.

Update Ticket

ticket-update

Update a support ticket.

Get User

user-get

Fetch one user by ID (documented under /master/users).

List Users

user-list

List users in the Upsales account.

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

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

Here are some of the things you can do

  • Create Activity

    perform
    activity-create
  • Get Activity

    read
    activity-get
  • List Activities

    search
    activity-list
  • List Activity Types

    search
    activity-type-list
  • Update Activity

    perform
    activity-update

+63 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 Upsales, 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 Upsales. 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: "activity-create",
  payload: {
    description: "<value>",
    // date: "<value>",
    // closeDate: "<value>",
    // notes: "<value>",
    // clientId: "<value>",
    // contactIds: "<value>",
    // userIds: "<value>",
    // activityTypeId: "<value>",
    // priority: "<value>",
    // fields: "<value>",
  },
});

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

Give an AI agent Upsales — without giving it Upsales'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.upsales#activity-create",
    "input": {
      "description": "<description>"
    }
  }
}

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

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

Request MCP access

Health checks

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

service

Upsales platform status

Component status from status.upsales.com (Upsales App, email, integrations, file service and more). The page has no API-specific component; see the `api` check for reachability of the API host itself.

service

Upsales API reachable

Unsigned GET /api/v2/self: the API answering 401 Unauthorized proves the host and its auth layer are up.

quota

API rate-limit headroom

Remaining requests in the tightest rate-limit window for this key, read from the X-RateLimit-* headers.