Read and write customers, products, draft and booked invoices, and read orders, suppliers, accounts and bookkeeping entries in Visma e-conomic accounting.
e-conomic ships in the w6w first-party pack. It declares 29 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.economice-conomic (Visma e-conomic) is a cloud accounting system for small and mid-sized businesses, used mostly in Denmark and the Nordics. This app connects a workflow to an agreement’s books through the e-conomic REST API, with the two tokens e-conomic issues: the App Secret Token that identifies the integration and the Agreement Grant Token granted by the customer.
A workflow can list and read customers and create or delete them, and do the same for products; list customer groups, product groups, payment terms, VAT zones, layouts, units and employees (the reference data a new customer, product or invoice needs); create a draft invoice with its lines, delete a draft, book it (optionally sending it by email or EAN e-invoice), and list or read draft and booked invoices. It can also list draft orders, suppliers, the chart of accounts, accounting years and the bookkeeping entries of a year, and read the connected agreement.
Every list takes e-conomic’s filter and sort expressions and returns the page with a total and the page to ask for next. Health checks read e-conomic’s status page for its dedicated REST API component, probe the API’s reachability, and verify the tokens against the agreement.
Three routes to the same 29 actions. The Workflow tab is generated from e-conomic'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.
customer-create Create a customer. Name, currency, customer group, payment terms and VAT zone are required by e-conomic; list them with the matching List actions.
customer-delete Delete a customer (HTTP 204). e-conomic refuses it while the customer has booked documents.
customer-group-list List customer groups; a customer's group number is required to create one.
entry-list List the finance entries (bookkeeping lines) of one accounting year.
invoice-book Book a draft invoice, making it a booked (final, numbered) invoice, and optionally send it to the recipient. Not reversible through the API.
invoice-booked-list List booked invoices; filter by date, customer or remainder.
invoice-draft-create Create a draft invoice (it is not booked; use Book Invoice for that). e-conomic requires customer, date, currency, payment terms, layout and the recipient's name and VAT zone; Get Customer Invoice Template returns a pre-filled draft for a customer to copy those from.
invoice-draft-delete Delete a draft invoice. Booked invoices cannot be deleted.
invoice-template-get Return a draft-invoice body pre-filled from a customer's defaults (payment terms, layout, recipient, VAT zone, currency). Read-only; nothing is created.
payment-terms-list List payment terms; one is required on customers and invoices.
product-create Create a product. Product number (your own string), name and product group are required by e-conomic.
product-group-list List product groups; a product's group number is required to create one.
self-get Read the connected e-conomic agreement: company, base currency, default payment term and enabled modules. Returns a curated subset (the raw response also names the integration's app).
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 e-conomic's real ids.
{
"manifestVersion": "2",
"name": "economic-example",
"steps": [
{
"id": "customer-create",
"uses": {
"app": "io.w6w.economic",
"action": "customer-create",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"name": "<name>",
"currency": "<currency>",
"customerGroupNumber": "<customerGroupNumber>"
}
}
]
}customer-create account-list accounting-year-list customer-get customer-group-list +24 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 e-conomic, 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 e-conomic. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { 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: "customer-create",
payload: {
name: "<value>",
currency: "<value>",
customerGroupNumber: "<value>",
paymentTermsNumber: "<value>",
vatZoneNumber: "<value>",
// customerNumber: "<value>",
// address: "<value>",
// zip: "<value>",
// city: "<value>",
// country: "<value>",
// email: "<value>",
// telephoneAndFaxNumber: "<value>",
// website: "<value>",
// corporateIdentificationNumber: "<value>",
// vatNumber: "<value>",
// ean: "<value>",
// publicEntryNumber: "<value>",
// creditLimit: "<value>",
// salesPersonNumber: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action customer-create --payload '{"name":"<value>","currency":"<value>","customerGroupNumber":"<value>","paymentTermsNumber":"<value>","vatZoneNumber":"<value>"}' Give an AI agent e-conomic — without giving it e-conomic'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.economic#customer-create",
"input": {
"name": "<name>",
"currency": "<currency>",
"customerGroupNumber": "<customerGroupNumber>"
}
}
}
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 e-conomic connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
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.
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.
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.
e-conomic'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. e-conomic itself is MIT, and the runtime that executes it is source-available (FSL).
e-conomic declares its own checks, so its health is a property of the app rather than something the host guesses at.
Atlassian Statuspage component 'REST API' at status.e-conomic.com. Unauthenticated and unsigned; the page's whole-product indicator is deliberately ignored.
Unauthenticated GET of /self. e-conomic's documented 401 JSON error is the expected healthy answer; token validity is the `auth:api-key` check's job.