weclapp Integration Research

Date: 2026-04-14 Status: Research Complete — Some hands-on items deferred (sandbox testing, webhook signature verification)


Table of Contents

  1. Summary
  2. Capability Matrix
  3. System Overview
  4. Integration Intermediaries & Middleware
  5. Authentication & Connectivity
  6. Invoice/Document Submission
  7. Master Data Access
  8. Historical Bookings / Journal Entries
  9. Status & Feedback
  10. Unresolved Questions
  11. Suggested Hands-On Testing Plan
  12. Dead Ends
  13. Sources
  14. Retractions

Summary

weclapp is a German cloud ERP (SaaS) for small and medium-sized businesses, founded in 2008, based in Marburg/Karlsruhe, certified ISO 27001 and GoBD-conform, with all data hosted in Frankfurt. weclapp SE was acquired by Exact in October 2022. It exposes a comprehensive REST API (v2 is the current major version, v1 still available) covering ~150 resources, including a first-class /purchaseInvoice endpoint suitable for AP automation.

The native API offers two distinct paths for AP invoice submission: (1) structured POST to /purchaseInvoice with full line-item, ledger-account, cost-center, and tax detail; or (2) document upload to /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload, which routes PDFs/images through Klippa-powered OCR and XML/ZUGFERD/FATTURAPA files through e-invoice detection — both produce a purchase invoice in INVOICE_RECEIVED status. PDF documents can also be attached to a structured invoice after creation via POST /document/upload.

Master data is well-covered natively: /party (suppliers and customers as boolean flags on a unified party entity), /ledgerAccount (full CRUD), /costCenter, /costType, /tax, /termOfPayment, /financialYear. Historical bookings are available via /accountingTransaction (read-only via GET; writeable only via the /accountingTransaction/batchBooking impersonal-booking action), and /purchaseOpenItem gives read access to outstanding payables. Webhooks support created / updated / deleted events on any entity, with a minimal payload {entityId, entityName, type} and a built-in retry ladder (1m → 5m → 30m → 5h → 1d → deactivation).

Maesn provides a weclapp connector but covers a narrower surface than the native API: customers, suppliers, and invoices are fully supported; bills, journal entries, ledger accounts, and purchase orders are flagged as "not supported by weclapp" in the Maesn dev docs (this phrasing is misleading — those resources do exist natively, they are just outside Maesn's connector scope). Make.com has two community apps; the richer "Maxmel Tech" variant exposes purchase invoice and supplier CRUD plus document upload. Zapier, Chift, Celigo, n8n, and Tray.io do not currently ship a weclapp connector.

Capability Matrix

Capability Available? Method Confidence Notes
AP Invoice Submission (structured) Yes, natively POST /purchaseInvoice with full schema (supplierId, items, dates, costCenter, costType, taxes, ledger account per item) High OpenAPI spec confirms POST/PUT/DELETE on the resource
AP Invoice Submission (document + OCR) Yes, natively POST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload High Spec quote: "supported file types are XML, PDF (with or without embedded XML) and images (PNG, JPEG, GIF, TIFF)". Async background job. OCR via Klippa requires admin consent in UI
AP Invoice Submission (e-invoice formats) Yes Same multipart endpoint; also documentType enum includes PURCHASE_INVOICE_ZUGFERD, PURCHASE_INVOICE_FATTURAPA High Spec quote: "XML files and PDF files with embedded XML will be processed using e-invoice detection"
Attach PDF to existing invoice Yes POST /document/upload?entityName=PurchaseInvoice&entityId={id}&name=...&documentType=PURCHASE_INVOICE High Generic document upload accepts any entity reference
AP Invoice Submission via Maesn Limited Maesn Invoices endpoint supports Read+Create; Bills is "on demand only" Medium Bills/Invoices terminology overlap is unclear in Maesn docs; native API is the cleaner path
Suppliers (read/write) Yes, natively /party resource with supplier: true flag (full CRUD) High Same entity also serves as customer (customer: true)
Ledger Accounts / Chart of Accounts Yes, full CRUD /ledgerAccount (GET, POST, PUT, DELETE) High Schema: accountNumber, parentAccountId, type (CARRY_FORWARD/IMPERSONAL/PERSONAL_ACCOUNT), balanceSheetItem
Cost Centers (read/write) Yes, full CRUD /costCenter, /costCenterGroup High Schema: costCenterNumber, costCenterType, description
Cost Types Yes, full CRUD /costType High
Taxes Yes, full CRUD; lookup helper /tax, /tax/findPurchaseTax, /tax/findSalesTax High findPurchaseTax accepts country code, taxRateType, partyType, date — useful for tax determination
Financial Year Yes /financialYear (CRUD); status enum CLOSED/CURRENT/PLANNED/PRELIMINARY_CLOSED High
Historical Bookings (Read) Yes GET /accountingTransaction, GET /accountingTransaction/id/{id}, GET /accountingTransaction/count High Bookings have transactionDetails (debit/credit, accountId, amount, taxId, costCenterId), bookingType (INCOMING_INVOICE, OUTGOING_INVOICE, IMPERSONAL, etc.)
Manual Journal Entry (Write) Yes (constrained) POST /accountingTransaction/batchBooking (creates "impersonal" type only) High Spec: "Creates an accounting transaction of type 'impersonal'". No POST/PUT on the resource itself
Open Items (AP) Yes, read-only GET /purchaseOpenItem, POST /purchaseOpenItem/id/{id}/createPaymentApplication, POST /purchaseOpenItem/id/{id}/updatePaymentState High Schema: amount, amountOpen, amountPaid, amountDiscount, cleared, openItemType (CREDITOR, etc.)
Bank Transactions (Read) Yes, read+delete GET /bankTransaction, DELETE /bankTransaction/id/{id} High No POST — bank transactions are imported externally
Webhooks (set up) Yes POST /webhook with {entityName, atCreate, atUpdate, atDelete, url, requestMethod} High Spec confirms full CRUD on /webhook
Webhook payload structure Minimal {"entityId": "...", "entityName": "...", "type": "CREATE|UPDATE|DELETE"} High Quoted from doc.weclapp.com — consumer must GET the entity to retrieve content
Webhook retry policy Built-in 1m → 5m → 30m → 5h → 1d, then deactivated High Quoted from doc.weclapp.com
Webhook signature/HMAC verification Not documented in public KB or OpenAPI N/A Low Webhook schema has no secret field; no public docs found. Unresolved (see below)
PDF/Document Download Yes GET /purchaseInvoice/id/{id}/downloadLatestPurchaseInvoiceDocument, GET /document/id/{id}/download High
Authentication API token (header or HTTP Basic) Header: AuthenticationToken: {token}, or HTTP Basic with username * High Per-user token, regeneratable in-app, inherits the user's permissions
Rate Limit No fixed limit; concurrent-request throttling HTTP 429 if requests queue >30 seconds High Spec quote: "no fixed rate limits" — instead a parallel-request limit per tenant with a 30s queue
API Subscription Requirement ERP Services tier or above weclapp.com pricing High Starter (€39) does NOT include API access. Services starts at €86/user/month (monthly) or €95/user/month (annual)
Free Trial 30 days, auto-cancel weclapp.com pricing High Trial scope (which features) not explicitly itemised
Sandbox Environment No dedicated sandbox; trial tenant or /system/createDemoTestSystem Trial signup or POST to system endpoint Medium Maesn confirms: "weclapp does not provide a dedicated sandbox"
Currency Multi-currency /currency, currencyConversionRate on records High currencyConversionDate/Rate fields on baseRecordWithMoney
Custom Attributes Yes /customAttributeDefinition, attribute values on entities High Filterable by customAttribute{id}-eq=...
Filtering / Querying Rich ?propertyName-{eq|ne|lt|gt|le|ge|null|notnull|like|notlike|ilike|notilike|in|notin}=value; or- prefix; filter=... expressions (beta) High Filters can traverse references: customAttribute4587.entityReferences.entityId-eq=1234

1. System Overview

What is weclapp?

"weclapp is the ERP-platform for teams. Whether CRM, merchandise management or accounting: With weclapp, teams jointly control all important business processes in just one software." — weclapp.com (search summary)

"All data is stored in Germany in accordance with the strict German data protection regulations. […] weclapp is a German company certified according to ISO 27001. weclapp is, among other things, ISO 27001-certified and GoBD-conform." — weclapp.com (search summary)

"In October 2022, weclapp was acquired by Exact, a leading provider of business and accounting software." — Crunchbase / search summary

Confidence: High

API Architecture

"The base URL for the API is https://<TENANT>.weclapp.com/webapp/api/v2/ where <TENANT>.weclapp.com is the domain of the specific weclapp instance. So each weclapp instance has its own API endpoints which allow accessing data for that particular instance." — weclapp OpenAPI v2 spec, header description

Operation HTTP URL pattern
List GET /<resource>
Count GET /<resource>/count
Get by id GET /<resource>/id/<id>
Create POST /<resource>
Update PUT /<resource>/id/<id>
Delete DELETE /<resource>/id/<id>
Action (resource-level) POST /<resource>/<action>
Action (instance-level) POST /<resource>/id/<id>/<action>

Available v2 endpoints (count)

The OpenAPI v2 spec is ~46,500 lines and exposes ~150 distinct top-level resources. Functional groups directly relevant to AP automation:

2. Integration Intermediaries & Middleware

Maesn (existing Orcha intermediary for DATEV)

"weclapp" appears in Maesn's official integration list alongside DATEV, Xero, sevdesk, Xentral, Microsoft Business Central. — maesn.com/integrations

"Requires weclapp Personal Access Token and Tenant ID" — maesn.mintlify.app/integrations/weclapp

Capability map per Maesn dev docs (mintlify):

Entity Maesn weclapp coverage
Customers Read, Create, Update fully supported. Webhook capable
Suppliers Create, Read, Update; Delete on demand. Webhook
Invoices Read, Create fully; Update/Delete on demand. Webhook
Sales Orders Read fully; Create/Update/Delete "require direct engagement"
Credit Notes Read fully; write on demand. Webhook
Payments Read fully; Create on demand
Bills "On demand only" — all operations
Purchase Orders "Not supported by weclapp"
Journal Entries "Not supported by weclapp"
Chart of Accounts / Ledger Accounts "Not supported. Trial balance, fiscal years unavailable"
Cost Centers Not explicitly listed
Tax Rates On demand
Documents/Files On demand

"Weclapp webhooks support: CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER resources with CREATED, UPDATED, DELETED events" — maesn.mintlify.app/integrations/weclapp

Marketing-page vs dev-docs contradiction: The Maesn marketing page states it supports "invoices, bills, credit notes, customers, suppliers, contacts, payments, journal entries, purchase orders, sales orders, and more" for weclapp (maesn.com/integrations/weclapp), while the developer documentation explicitly marks bills, journal entries, purchase orders, and ledger accounts as not supported or on-demand. The dev docs should be treated as authoritative.

Misleading wording note: Maesn's "Not supported by weclapp" label for purchase orders, journal entries, and ledger accounts is inaccurate as a description of weclapp itself — these resources all exist in the weclapp v2 API (/purchaseOrder, /accountingTransaction, /ledgerAccount). The accurate reading is "not supported by Maesn's weclapp connector."

Make.com (community-maintained, two variants)

"weclapp is a community developed application... Make does not maintain or support this integration." — make.com weclapp app

Maxmel Tech variant (apps.make.com/weclapp-s3mgzy) — modules quoted from Make's app catalog:

The richer of the two community apps. No ledger accounts, journal entries, or cost centers modules.

#makeitfuture variant (apps.make.com/weclapp-z9gz53-5s74fk) — thinner: only customer/invoice CRUD, no purchase invoices or suppliers.

Workato

"Triggers: New/updated record (real-time), New/updated records (batch). Actions: Create record in weclapp, Get record by ID, Search object, Update object, plus custom actions." — workato.com/integrations/weclapp

Generic record-shape interface — no entity-specific (purchase invoice, supplier, ledger) pre-built operations quoted. Effectively a thin wrapper over the native API.

Intermediaries WITHOUT a weclapp connector

Platform Status Source
Zapier Explicit: "Weclapp has not yet built an integration on Zapier" zapier.com/apps/weclapp/integrations
Chift Not in supported connectors list (which includes Pennylane, Exact, Datev, Odoo, Xero, Sage, Twinfield, Netsuite, Dynamics 365 BC, Holded) docs.chift.eu/connectors/connectors
Celigo No native weclapp connector found in marketplace; would require Universal HTTP connector celigo.com/integrations
n8n No native node; community forum posts show users building via HTTP Request node community.n8n.io
Tray.io Not found in connector hub tray.io/connectors

Confidence: High (for absence findings — searched directly on each platform's connector hub)

3. Authentication & Connectivity

Authentication

"You can authorize against the API with an API token. The token is configurable in your weclapp account under My settings > API. […] Authenticating using a token is possible in two ways: the token can be sent using the AuthenticationToken header AuthenticationToken: {api_token} [or] the standard HTTP Basic authentication can be used: the username needs to be "*" and the password is the token" — weclapp OpenAPI v2 spec, header description

"Dein API-Token ist benutzerspezifisch. Du findest ihn über deinen Benutzernamen > Meine Einstellungen." — doc.weclapp.com/knowledgebase/wo-finde-ich-den-weclapp-api-token

"weclapp übergibt über die API nur die Berechtigungen, die der Benutzer des API-Tokens besitzt." — doc.weclapp.com/knowledgebase/gibt-es-eine-api-zu-weclapp

"Du kannst einen API-Token neu erzeugen, wenn du den Eindruck hast, dass ein Unbefugter den Token bekommen hat." — same source

Analysis:

Connectivity

Rate Limits / Load Management

"The weclapp API has no fixed rate limits, and we want to keep it that way. […] There is a limit on the number of parallel requests per tenant. Multiple parallel requests are allowed, even if you exceed the limit. Requests exceeding the limit are not rejected but wait until resources become available. […] The requests can currently wait in the queue for up to 30 seconds, after that the application will respond with a HTTP 429 Too Many Requests response." — OpenAPI v2 spec, header description

"We recommend using request timeouts of at least one minute to avoid aborting requests too early that would get a successful response." — same source

Operational implications:

Subscription tier required

ERP Starter (€39/month/user, monthly-only): Contact Management, Quotations & invoices, Tasks & projects, Accounting & banking, Reporting, E-Invoicing. No API-access listed.weclapp.com/en/pricing

ERP Services (€86 monthly / €95 annual): Starter features plus CRM, Tasks/calendar/campaigns, Offer & order, Project Management, Time tracking, "API-access" — same source

ERP Trade (€163 monthly / €179 annual): Services features plus Merchandise Management, Disposition & purchasing, Warehouse Management, Serial & batch number, Production, Store/Marketplace connections — same source

API access is gated to ERP Services tier and above (€86/user/month minimum). The Starter tier is not API-eligible. Customers without ERP Services would need to upgrade before any Orcha integration can function.

Conflicting price source flagged: A search snippet from Qualimero's 2026 pricing guide cites €64 / €84 / €159 for similar tiers. The page could not be fetched directly to verify. weclapp.com is the authoritative source — Qualimero may reflect promotional or older pricing.

Sandbox / Testing Environment

"weclapp does not provide a dedicated sandbox. Developers typically use a free trial account or a partner demo instance for testing, which must be managed manually." — maesn.com weclapp API blog

30-day free trial: "Free for the first 30 days | Automatic cancellation" — weclapp.com/en/pricing

"Über das Dashboard kannst du Demodaten in deiner Testinstanz anlegen. Suche das Widget 'Dein Team in weclapp' und klicke auf den grünen Button 'Demodaten anlegen'." — doc.weclapp.com/knowledgebase/wie-kann-ich-in-der-testphase-demodaten-in-meiner-instanz-anlegen

Three substitutes for a real sandbox:

  1. 30-day free trial tenant — full feature access, auto-cancels.
  2. In-trial demo data button — seeds realistic demo data into the trial.
  3. POST /system/createDemoTestSystem endpoint — exists in the OpenAPI spec but lacks any description text. It accepts {label: required, preset: required, all_users?: bool}. Likely provisions a parallel test instance from a named preset — semantics need to be verified hands-on.

Confidence: Medium for sandbox alternatives — /system/createDemoTestSystem is documented as a path but its actual behavior, available presets, and pricing implications are not publicly described.

4. Invoice/Document Submission

weclapp offers two distinct, complementary paths for AP invoice submission via the native API.

Path A: Structured invoice via POST /purchaseInvoice

"create a purchaseInvoice" — POST /purchaseInvoice, accepts a purchaseInvoice schema body — OpenAPI v2 spec, line 13252

Schema fields (from spec line 39073+):

Field Type Notes
supplierId string (party reference) Required (inherited from basePurchaseRecord)
invoiceDate timestamp Required
invoiceNumber string (≤255) The supplier's invoice number
internalInvoiceNumber string (≤255) Required — weclapp's internal numbering
dueDate timestamp
bookingDate timestamp
pricingDate timestamp Required
purchaseInvoiceType enum Required — STANDARD_INVOICE, CREDIT_NOTE, ADVANCE_PAYMENT_INVOICE, PART_PAYMENT_INVOICE, PREPAYMENT_INVOICE, FINAL_INVOICE, CREDIT_ADVICE
status enum (purchaseInvoiceStatusType) Required — values: NEW, OCR_VERIFICATION, INVOICE_RECEIVED, INVOICE_VERIFICATION, INVOICE_CHECKED, ENTRY_COMPLETED, OPEN_ITEM_CREATED, DOCUMENT_CREATED, CANCELLED
paymentStatus enum Required — OPEN, PAID, CLEARED_WITH_CREDIT_NOTE, CREDIT_NOTE_CLEARED, NO_OPEN_ITEM, UNKNOWN
costCenterId string Header-level cost center
costTypeId string Header-level cost type
purchaseInvoiceItems array Line items (see below)
purchaseOrders array of {id} Optional link to existing purchase orders
senderCountryCode, recipientCountryCode enum Required
vatRegistrationNumber string (≤1000)
recordCurrency reference inherited; supports multi-currency with conversion rate
createdViaOcr boolean (read-only) Useful flag to distinguish OCR-created vs API-created invoices

Line item schema (purchaseInvoiceItem, spec line 39278):

Field Type Notes
accountId string Reference to /ledgerAccount
costCenterId / costTypeId string Per-line cost allocation
costCenterItems array Distribution percentage across multiple cost centers
taxId string Reference to /tax
unitPrice, netAmount, grossAmount, unitId decimal/string Inherited from baseRecordItemWithMoney
purchaseInvoiceItemRelationships array Links to incomingGoodsItemId / purchaseOrderItemId with quantity
servicePeriodFromDate, servicePeriodToDate timestamp For service invoices
deliveryDate timestamp

Path B: Document upload + automated processing

"This endpoint can be used to quickly turn invoice documents received from suppliers into weclapp purchase invoices. Supported file types are XML, PDF (with or without embedded XML) and images (PNG, JPEG, GIF, TIFF). The documents are uploaded via HTTP multipart request (multiple documents can be uploaded at the same time) and processing is started as a background job. For each document, the appropriate processing strategy is selected based on the file type:

Endpoint: POST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload Request: multipart/form-data with one or more filename parts Response: {result: <jobResult>} — async job; status retrieved via /job/status or webhooks

Practical implications:

Path A vs Path B trade-offs

For Orcha's likely use case (we already extract structured data), Path A + post-hoc document attachment is the more deterministic option.

Ancillary creation paths

Several other endpoints can create purchase invoices from upstream documents:

These are useful for closed-loop scenarios where the PO/goods receipt already exists and Orcha should reconcile against them.

Document attachment and retrieval

Currency

E-invoicing standards

Document type enum confirms native handling of:

Confidence: High for all of section 4 — derived directly from OpenAPI spec.

5. Master Data Access

Suppliers (via /party)

Party schema fields relevant to suppliers (spec line 36911+):

Operations (/party):

A party can be both customer and supplier simultaneously — both flags can be true.

Confidence: High

Chart of Accounts (/ledgerAccount)

Full CRUD: GET, POST, PUT, DELETE.

Schema (spec line 35615):

Confidence: High (spec-confirmed)

Cost Centers (/costCenter, /costCenterGroup)

Full CRUD on both.

costCenter schema (spec line 32409):

costCenterWithDistributionPercentage is used on invoice line items to split costs across multiple cost centers with percentages.

Cost Types (/costType)

Full CRUD. Schema is simple: just name: string (required, ≤256).

Taxes (/tax)

Schema fields (spec line 43425):

Lookup helpers:

CRUD also supported plus admin actions POST /tax/configurePurchaseTaxes (per country), /tax/configureSalesTaxes, /tax/resetSystemTaxes.

Confidence: High

Other master data

Resource Operations Notes
/financialYear Full CRUD; POST /id/{id}/generatePeriods Status enum: CLOSED, CURRENT, PLANNED, PRELIMINARY_CLOSED
/termOfPayment Full CRUD
/paymentMethod Full CRUD
/currency Full CRUD; GET /currency/companyCurrency
/personalAccountingCode Full CRUD German "Personenkonto" classification
/articleAccountingCode Full CRUD Per-article account mapping
/article Full CRUD plus many actions (datasheet PDFs, labels, image upload, etc.)
/bankAccount Full CRUD
/bankTransaction GET, DELETE only No POST — bank statements imported externally
/sepaDirectDebitMandate Full CRUD
/customAttributeDefinition Full CRUD Custom fields per resource type

Filtering and querying

Filter operators (spec line 432): eq, ne, lt, gt, le, ge, null, notnull, like, notlike, ilike, notilike, in, notin

"or" condition: prefix property name with or-. Group with or<groupname>-.

"Filter Expressions (beta): […] Multiple 'filter' parameters may be used if needed. Property references in filter expressions have exactly the same form and semantics as for the individual filter parameters." — OpenAPI v2 spec lines 357-500+

Filter examples from spec:

Pagination: ?page=N&pageSize=M (or ?offset=...). Sort: ?sort=.... Sparse fieldsets: ?properties=.... Eager-load references: ?includeReferencedEntities=....

6. Historical Bookings / Journal Entries

Read access — /accountingTransaction

Endpoints:

No PUT, DELETE, or direct POST on the resource itself. This means existing transactions cannot be modified or deleted via the API.

Schema (spec line 28674):

Field Notes
transactionDate (required) When the transaction occurred
transactionEstablishDate When recorded in the system
currencyId (required)
conversionRate, conversionRateDate For multi-currency
transactionNumber, internalRecordNumber, externalRecordNumber Identifiers
type bookingType enum: CARRY_FORWARD, INCOMING_INVOICE, OUTGOING_INVOICE, INCOMING_CREDIT_NOTE, OUTGOING_CREDIT_NOTE, INCOMING_PAYMENT, OUTGOING_PAYMENT, INCOMING_MANUAL_ENTRY, OUTGOING_MANUAL_ENTRY, IMPERSONAL, CREDIT_ADVICE
status accountingTransactionStatus: DRAFT, ESTABLISHED, PREBATCHBOOKING
transactionDetails Array of accountingTransactionDetail: {accountId (ledgerAccount, required), debitCredit (DEBIT/CREDIT, required), amount (required), taxId, costCenterId, description}
reverseTransaction (required, bool)
draft (bool)

This means Orcha can fetch full historical journal data, including counter-account, debit/credit indicator, tax breakdown, and cost center per line. Use bookingType-in=["INCOMING_INVOICE", "INCOMING_CREDIT_NOTE", "INCOMING_PAYMENT"] to scope to AP-relevant entries.

Write access — /accountingTransaction/batchBooking

"Creates an accounting transaction of type 'impersonal'" — OpenAPI v2 spec line 1892

Body schema:

{
  "batchBooking": {
    "batchBookingRecords": [
      {
        "amount": "...",
        "debitAccountId": "...",      // ledgerAccount
        "creditAccountId": "...",     // ledgerAccount
        "description": "...",
        "taxId": "..."                // tax
      },
      ...
    ],
    "bookingText": "...",
    "costCenterId": "...",
    "currencyId": "...",
    "externalRecordNumber": "...",
    "transactionDate": <timestamp>
  }
}

Constraints:

Open items — /purchaseOpenItem

Operations:

Schema (spec line 36078, via openItem ancestor):

This is the canonical view of unpaid AP — what's still owed to suppliers, what's been partially paid, what discounts apply.

Bank transactions — /bankTransaction

GET and DELETE only. No POST. Bank transactions are imported via separate channels (e.g., HBCI, file import) rather than via API write. This means Orcha cannot push bank statements via API; it can only read existing ones to match against open items via createPaymentApplication.

Confidence: High (all spec-confirmed)

7. Status & Feedback

Webhooks (native, primary path)

"If a webhook is unreachable, the attempt is retried after 1, 5, 30 minutes, 5 hours and 1 day. After one day if the webhook remains unreachable, the webhook is deactivated. […] In the list of webhooks this is logged with an error message." — doc.weclapp.com webhook KB

Payload format:

{ "entityId": "{ID}", "entityName": "{Name}", "type": "{VALUE}" }

with type values: CREATE, UPDATE, DELETE — same source

Webhook setup:

Webhook entity coverage: The webhook resource accepts an arbitrary entityName (string) — not restricted to a fixed set. Per Maesn's documentation, common entities supported include CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER. Whether the full list of ~150 resources is webhook-eligible is not explicitly documented. Hands-on testing would be needed to confirm, e.g., webhook on purchaseInvoice updates.

Critical webhook design considerations:

  1. Payload is minimal — only {entityId, entityName, type}. Consumer must call GET /<entity>/id/{id} to retrieve the actual entity content. This adds a round trip per event.
  2. Retry ladder is short and aggressive — 1m, 5m, 30m, 5h, 1d, then deactivation. After deactivation, manual reactivation is required (no automatic re-enable). Orcha must monitor webhook health to detect deactivations.
  3. Authentication of incoming webhooks: Neither the OpenAPI spec nor the public KB documents any HMAC/signature mechanism. The webhook schema has no secret field. Requests appear to be plain HTTP POSTs. This is a significant gap for production use — Orcha would need to either: (a) verify by source IP allowlist (if weclapp publishes IP ranges); (b) include a secret token in the URL path/query; (c) call back into weclapp to re-fetch and verify; (d) ask weclapp support for the authoritative answer.
  4. No replay or event-history endpoint found — missed events cannot be backfilled from a webhook log; reconciliation requires polling lastModifiedDate filters.

Synchronous response on resource operations

Standard REST behavior:

Spec quote on validation responses: "Two custom fields have been added to the response structure: 'location' and 'validationErrors'."

Async job tracking

For long-running operations (e.g., the multipart invoice upload, mass operations):

The OCR/e-invoice document upload returns a jobResult body — clients can either poll /job/status or wait for a webhook on the resulting purchaseInvoice creation.

Status states for AP invoices

Useful for tracking the lifecycle of a submitted invoice:

Status Meaning (inferred from name)
NEW Just created, not yet submitted
OCR_VERIFICATION OCR result needs human review
INVOICE_RECEIVED Document received and parsed
INVOICE_VERIFICATION In approval workflow
INVOICE_CHECKED Approved
ENTRY_COMPLETED Posted to ledger
OPEN_ITEM_CREATED Open item generated
DOCUMENT_CREATED Final document created
CANCELLED Cancelled

Confidence: High for documented status names; Medium for the exact transition rules (not fully spec-documented).

Unresolved Questions

Question Why It Matters What Was Tried Next Step
Is there an HMAC signature or shared secret on webhook deliveries? Without verification, any actor knowing the URL can spoof events. Production-grade integration needs this. Read OpenAPI spec (no secret field on webhook schema), KB article, web search for "weclapp webhook HMAC signature" — no public docs. Email weclapp support (support@weclapp.com per spec contact) or open ticket asking specifically about webhook authentication mechanisms. Until answered, document a workaround (e.g., per-tenant secret embedded in callback URL path).
Which entity types are webhook-eligible? Maesn lists 5 (CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER); the OpenAPI accepts arbitrary entityName strings. We don't know if e.g. purchaseInvoice, accountingTransaction, purchaseOpenItem events fire. Spec accepts free-form entityName; KB doesn't enumerate. Hands-on: in a trial tenant, register webhooks on purchaseInvoice, accountingTransaction, purchaseOpenItem and trigger CRUD; observe whether deliveries arrive.
What are the available preset values for /system/createDemoTestSystem? Determines whether the endpoint is useful as a programmatic sandbox provisioner. OpenAPI spec has no description text on this endpoint. Hands-on: try common values (e.g., "DEMO", "EMPTY", "DEFAULT") and observe responses. Or contact weclapp support.
Is there a programmatic way to grant Klippa OCR consent for the multipart upload endpoint? Currently the spec says "This can only be done in the weclapp UI" — meaning each Orcha customer must manually toggle a setting before Path B works. Spec is explicit (line 13721) — no API call provided. Confirm with weclapp support whether a future API exists, or document the manual onboarding step in customer setup instructions.
Are there fixed numeric rate limits anywhere (e.g., per-second hard cap)? Spec says "no fixed rate limits" but mentions a parallel-request limit per tenant. The actual numeric ceiling is not published. Spec quote (line 195+) only describes the dynamic throttle. Hands-on stress test against trial; or contact weclapp support for guidance per tenant size.
Does Maesn's "Bills" endpoint actually work for weclapp purchase invoices, or is it only for sales-side bills? Determines whether Maesn is a viable shortcut for Orcha's AP flow. Maesn dev docs say "Bills: on demand only" — ambiguous. Marketing page lists bills as supported for weclapp. Contact Maesn ("on demand" implies they will scope the integration if asked). Or skip Maesn for AP and use native API directly.
Token expiration / forced rotation policy Affects credential lifecycle management in Orcha. Searched KB, OpenAPI spec — no expiration documented. Tokens appear to persist until manually regenerated. Confirm with weclapp support; treat tokens as long-lived but renewable.
Webhook behavior on entity cascade deletes If a supplier is deleted, do invoice DELETE webhooks fire? Not documented. Hands-on test in trial tenant.

Suggested Hands-On Testing Plan

A 30-day trial tenant + a freshly created API user provides the test environment. Key scenarios to verify, in order of priority:

Scenario 1: Structured purchase invoice creation (Path A)

  1. POST /party to create a test supplier with supplier=true, customer=false, full address, supplierCreditorAccountId (link to an existing ledger account)
  2. GET /ledgerAccount?type-eq=IMPERSONAL_ACCOUNT&pageSize=10 to find expense accounts
  3. GET /tax/findPurchaseTax?recipientCountryCode=DE&dispatchCountryCode=DE&date=<now> to determine the right tax
  4. POST /purchaseInvoice with: supplier from step 1, invoiceDate, internalInvoiceNumber, status=NEW, purchaseInvoiceType=STANDARD_INVOICE, paymentStatus=OPEN, grossPrices=false, items: [{accountId: from step 2, taxId: from step 3, unitPrice: "100.00", quantity: "1", title: "Test"}]
  5. Verify response contains an id and version
  6. POST /document/upload?entityName=PurchaseInvoice&entityId={id}&name=test.pdf&documentType=PURCHASE_INVOICE with a sample PDF body
  7. GET /purchaseInvoice/id/{id}/downloadLatestPurchaseInvoiceDocument to verify retrieval
  8. GET /accountingTransaction?bookingType-eq=INCOMING_INVOICE&pageSize=5 to see if the journal entry was generated

Scenario 2: Document upload + OCR (Path B)

  1. In the trial tenant UI, grant Klippa OCR consent (admin only)
  2. POST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload with a sample PDF invoice
  3. Capture the jobResult ID, poll GET /job/status?jobId=... until completion
  4. GET /purchaseInvoice?status-eq=INVOICE_RECEIVED&createdViaOcr-eq=true&pageSize=5 to find the result
  5. Compare extracted fields (supplier, amount, dates) against the source PDF to gauge accuracy

Scenario 3: Webhook reliability and payload

  1. POST /webhook with {entityName: "purchaseInvoice", atCreate: true, atUpdate: true, atDelete: false, url: "<your test endpoint>", requestMethod: "POST"}
  2. Trigger Scenario 1 again; verify webhook fires within seconds
  3. Inspect the payload — confirm it matches {entityId, entityName, type}
  4. Critical: Inspect ALL HTTP headers on the inbound request — look for any signature/HMAC header (e.g., X-Weclapp-Signature, Authorization, etc.) not documented elsewhere
  5. Repeat with entityName: "accountingTransaction" and entityName: "purchaseOpenItem" to confirm webhook eligibility for these resources
  6. Test retry behavior: respond with HTTP 500; confirm retries arrive at 1m, 5m, 30m intervals

Scenario 4: Filter expressiveness and pagination

  1. Create 50 test purchase invoices with varying dates and suppliers
  2. Test filter=(invoiceDate >= "2026-01-01") and (supplier.supplierNumber-in["S001","S002"]) to confirm beta filter expressions work
  3. Test ?or-status-eq=NEW&or-status-eq=INVOICE_RECEIVED&pageSize=20&page=1 for OR filtering with pagination
  4. Confirm sorting: ?sort=-invoiceDate&pageSize=10

Scenario 5: Concurrent-request throttling

  1. Send 100 parallel GET /purchaseInvoice/count requests
  2. Observe whether/when HTTP 429 occurs and queue-wait latencies
  3. Calibrate Orcha's connection pool size and retry strategy accordingly

Dead Ends

Sources

Primary (weclapp official)

Intermediaries

Third-party SDKs and tools

Background / context

Retractions