Talking Peppol made easy

The bookkeepers's page receives the company's invoices and delivers documents to the accounting department. The received documents contain entries as well as a copy of the invoice as xml, html and pdf.
The application includes an option to archive received documents. This is relevant if the ERP system does not have the ability to archive electronic invoices itself.

A template can be created for posting each vendor. In many cases, this will mean that it is not necessary to edit received invoices further before posting.

The accountant's page should preferably be called as a plugin from the accounting system. If this is not possible, the application can be called via the computer's toolbar. (see EasyUBL API - TemporaryKey)

A real-time and seamless integration

To receive a webhook, you must have an api that can service all of your tenant's companies. EasyUBL webhook calls a url, that you provide when creating your tenant
If you create multiple Webhook recipients, EasyUBL will send the same notifications to all of them. For example, you can send notifications about address creations to your ERP system, your webshop, your CRM system, etc. EasyUBL sends webhooks all the time. You don't need to respond to them. We will resend a notification a certain number of times before giving up.

We send the notifications we receive from the UBL network to you as WebHooks. In addition, we send events from the EasyUBL applications.

It could be: https://myBasicURL/api/ tools/ UBLNotifications

The webhook call to your service will contain a small json document:

{
"companyId": "c9b89d84-cdb6-4207-8a99-23c7ffb04577",
"endpointId": "df4967d4-7e4d-4f23-9653-b8bd1b8719b2",
"ublDocumentId": "22323456",
"documentStatusCode" : "5110",
"documentType": "110",
"actionCode": "2",
"errorCode": "-1",
"base64EncodedMessage": "Not sent",
"externalIdentifier": "5053387"
"documentXmlBase64Content"
}


CompanyId will make it possible to find the company in your application. This is the key that was returned, when you created the company. You probably don't use EndpointId for anything.
ublDocumentID is an internal ID in the system, that makes it possible to backtrace the document. You don't use it.
externalIdentifier will contain your invoice number/order number etc. depending on the document type.


We currently support document types 100 (order), 110 (Invoice), 120 (credit note) and Essy100 (Financial documents and goods transactions). "base64MEssage" and "documentBase64" will contain information related to the document type.

This is an example of what a webhook might look like.
[Route("UBLNotifications")]
[HttpPost]
public int UBLNotifications(Notification ublNotification)
{
  if (ublNotification.companyId == Guid.Empty) throw new ArgumentException("Missing companyId");
  DBUser.ConnectionGetByEasyUBLKey(ublNotification.companyId);
  string DocumentType = ublNotification.documentType;
  if (DocumentType == "110" || DocumentType == "120") // invoice/ creditnote
  {
   NotificationService myUBL = new NotificationService(DBUser);
   if (ublNotification.documentStatusCode < 5200)
   {
   String message = myUBL.UpdateInvoice(ublNotification);
   }
  }
  if (DocumentType == "100")
  {
   NotificationOrderService myUBL = new NotificationOrderService(DBUser);
   if (ublNotification.documentStatusCode < 5200)
   {
    String message = myUBL.UpdateOrder(ublNotification);
   }
  }
  if (DocumentType == "EasyUBLDocumentBooked")
  {
   NotificationVoucherService myUBL = new NotificationVoucherService(DBUser);
   String message = myUBL.ProcessVoucher(ublNotification);
   }
  if (DocumentType == "EasyUblProductChanged")
 {
  EasyUblProductService myUBL = new EasyUblProductService(DBUser);
  String message = myUBL.OnProductChanged((ublNotification));
 }
 if (DocumentType == "EasyUblDocumentReceived")
 {
  NotificationVoucherService myUBL = new NotificationVoucherService(DBUser);
  String message = myUBL.OnDocumentReceived((ublNotification));
 }
  return 0;
}
A document with a document type of 5200 and above is for receipt. This is handled by the "Bookkeepers Page". Notifications below 5200 contain information about the document's shipment. This information can be used to update directly in the ERP system.

A document with DocumentType "EasyUBLDocumentBooked" is a document that must be saved in the ERP system. The call is made by Bookkeepers Page when the paper flyer is clicked that transfers the document to the journal. The document that is delivered is similar to that returned by the API called "NextTransaction". The call makes it possible to transfer vouchers to the ERP system in real time. the field "documentXmlBase64Content" will contain at json document:

EasyUblDocumentReceived contains the same document as "EasyUBLDocumentBooked" but with less information. It is the result of the first attempt to interpret the document. The call comes when the document arrives at EasyUBL. The document contains, among other things, the creditor's address, and can be used to create the creditor in the ERP system. It will be convenient that the creditor exists when the invoice arrives.

EasyUblProductChanged contains a document with product information. The call is sent every time an item is changed in EasyUBL and is used to maintain products in the ERP system. EasyUBL will attempt to map suppliers' products to the buyer's and, for example, convert units and packages if the necessary information is found in the UBL document.

We talk to everyone

Webhooks from EasyUBL can either be sent to a central API, or to a locally installed middleware belonging to a single company. This middleware must contain a single API call that receives webhooks from EasyUBL. If it works directly against the locally installed database, the system will work in real time.

If the machine the database is installed on is visible from the web, and you have the ability to write to the database, we can communicate this way. If you wish, we can send you an example written in C# of an API that receives webhooks from EsyUBL. You then write the part that communicates with the database.

The alternative methods are not described here, but you are welcome to contact EasyUBL if you need alternatives. We can usually find a solution.
An unhandled error has occurred. Reload 🗙