Skip to main content

E-Invoicing

The E-Invoicing editor is where you tell NomaUBL how to talk to a Plateforme Agréée (PA) — the certified platform that receives, validates and dispatches your e-invoices to the French e-invoicing public infrastructure. It also defines how UBL documents are validated locally before they leave the system, and how regulatory seller actions are mapped to API calls on the PA.

This page applies to documents from any source system — JD Edwards, SAP, NetSuite, custom ERP — as long as the source has been mapped to UBL.

The editor has five tabs:

  1. UBL Validation — directory of XSL transforms used to convert the source XML into UBL.
  2. PA Connection — transport (API or SFTP), credentials, polling.
  3. PA Endpoints — REST endpoint catalog used to talk to the PA.
  4. Settings — mock / testing controls.
  5. Actions — bind regulatory seller actions to API endpoints (PA or source system).

Tab 1 — UBL Validation

This tab only configures the directory of XSL files used to transform the source XML into UBL. The actual UBL conformity check is performed by standard schematrons, which are documented separately (see UBL Tools → Validate).

UBL XSLT Transforms

FieldDescription
XSLT DirectoryDirectory containing the .xsl transform files used to convert the source XML into UBL. The placeholder %APP_HOME% expands to the NomaUBL install root.

Tab 2 — PA Connection

Connection (always shown)

FieldValuesDescription
ModeAPI / FTP / (none)Transport used to send invoices. API = REST exchange; FTP = SFTP file drop; (none) = skip the send step entirely.
Timeout (ms)numberHTTP / SFTP request timeout in milliseconds. Default 30000 (30 s).
SSL Verifytrue / falseWhether to validate the PA's TLS certificate. Set to false only in non-production environments using self-signed certificates.

The fields below appear depending on the chosen Mode.

When Mode = API

API Server

FieldDescription
Base URLRoot URL of the PA REST API (e.g. https://api.plateformeagree.fr).

Authentication

FieldDescription
Auth typeFixed to OAUTH2 for PA APIs — cannot be changed.
Token EndpointPath used to obtain an OAUTH2 token (e.g. /api/login_check). Combined with Base URL.
UsernameAccount name issued by the PA.
PasswordAccount password.

Status Retrieval

FieldDescription
Page sizeNumber of statuses fetched per page when polling the PA (default 100).
Last retrieved atISO datetime of the most recent successful status retrieval (e.g. 2025-01-01T00:00:00Z). Updated automatically after each retrieval run; manual edits act as a starting point.

Background Scheduling (serve mode)

These intervals only apply when NomaUBL is running in serve mode (long-running server). Changes require a server restart to take effect.

FieldDescription
Import poll interval (min)Minutes between automatic import-status polls for pending invoices (status 9906). 0 = disabled.
Status retrieval interval (min)Minutes between automatic lifecycle-status retrievals from the PA. 0 = disabled.

When Mode = FTP

FieldDescription
HostSFTP host (e.g. ftp.plateformeagree.fr).
PortSFTP port. Default 22.
UserSFTP user.
PasswordSFTP password.
Outbound DirRemote directory where NomaUBL drops UBL files for the PA (e.g. /out/invoices/).
Inbound DirRemote directory where the PA writes status updates that NomaUBL pulls back (e.g. /in/status/).

Tab 3 — PA Endpoints

A catalog of REST endpoints used by NomaUBL to interact with the PA. Each entry is collapsible — click the row to expand or collapse.

You can use {{param}} placeholders in URL paths, query parameters, headers and bodies; values are injected at call time from the document context or from the action parameters defined in Tab 5.

Predefined endpoints

NomaUBL ships with the following endpoints already configured for a typical PA REST integration. Edit them to match your PA's exact paths or add your own:

MethodNamePurpose
POSTimportSubmit a UBL invoice to the PA.
GETimport-statusPoll the import status of a previously submitted invoice (e.g. waiting for the PA to confirm reception).
GETinvoice-statusesRetrieve the lifecycle statuses of one or several invoices already in the PA.
GETresolve-invoiceLook up an invoice on the PA by its identifier — useful for reconciliation.
POSTpost-statusPush a seller status update to the PA (used by the regulatory actions in Tab 5).

Example — POST import

Concrete configuration shipped by default for the import endpoint:

FieldValue
Nameimport
DescriptionSend invoice to PA
MethodPOST
URL path/api/v1/sale/invoices/import
Query paramspageSize={{pageSize}}&page={{page}}
HeadersContent-Type:application/json

Body

{
"format": "xml_ubl",
"content": "{{content}}",
"postActions": []
}

{{content}} is replaced at call time with the UBL document payload (typically base64-encoded XML).

Response mappings

Logical nameJSON path
uuiduuid
statusstatus

After a successful submission the PA returns a JSON body containing uuid and status; NomaUBL extracts both and stores them on the invoice record so downstream actions (status polling, resends, regulatory actions) can reference them.

Per-endpoint fields

FieldDescription
NameLogical identifier used internally and referenced from the Actions tab (e.g. import, getStatus).
DescriptionHuman-readable label shown in the editor (e.g. Send invoice to PA).
MethodHTTP method (GET / POST / PUT / DELETE / PATCH).
URL pathEndpoint path appended to the connection's Base URL (e.g. /api/v1/sale/invoices/import).
Query paramsQuery string template (e.g. pageSize={{pageSize}}&page={{page}}).
HeadersHTTP headers, one per line or separated by line breaks (e.g. Content-Type:application/json).
BodyRequest body — appears only for POST / PUT / PATCH. JSON bodies can be auto-formatted with the Format JSON button.
Response MappingsMap logical names to JSON paths in the response. For example, mapping uuiddata.uuid lets NomaUBL extract the PA-assigned UUID from the response and store it on the invoice.

Use the Add endpoint button at the bottom of the list to add new entries; remove an endpoint with the trash icon on its row.


Tab 4 — Settings

Mock / Testing

Controls a built-in PA mock useful for development and CI.

FieldValuesDescription
Use MockY / NWhen Y, calls go to the in-process mock instead of the configured PA.
Mock BehaviorALWAYS_SUCCESS / ALWAYS_FAILED / ALTERNATING / TOKEN_EXPIRED / RANDOMBehaviour the mock should simulate: always succeed, always fail, alternate success / failure, simulate an expired OAUTH2 token, or random outcomes.

Tab 5 — Actions

Bind regulatory seller actions to API connector endpoints. These actions appear in the invoice detail modal based on the document's lifecycle status, as required by French e-invoicing regulation. Unbound actions are shown as disabled in the UI.

The endpoint can target either the PA or a source-system API — for example, Cancel Accounting typically calls the source ERP's accounting cancellation endpoint, not the PA. Connectors used here are defined under Configuration → API Connectors (documented separately).

Available actions

ActionTriggered at status
Payment Received205
Credit Note206 / 207
Corrected Invoice206 / 207
Send Completed208
Cancel Accounting210 / 213
New Invoice213
Resend to PA9904 / 9907

Configuring a binding

For each action you want to enable, click Add Binding and fill in:

FieldDescription
ActionThe regulatory action being bound. Each action can be bound only once.
ConnectorThe API Connector template providing the endpoint — PA connector or source-system connector (defined under Configuration → API Connectors).
EndpointThe endpoint name within the chosen connector (the dropdown lists endpoints declared on it).
ParametersPer-endpoint parameter values. Defaults from the endpoint definition are pre-filled when you choose the endpoint.

Parameter values can be literal (e.g. JDE) or placeholders that pull values from the current invoice. Available placeholders:

{{fedoc}} {{fedct}} {{kco}} {{ublNumber}}
{{statusCode}} {{customerName}} {{totalHT}} {{totalTTC}}
{{currency}} {{amountDue}} {{invoiceType}} {{orderRef}}
{{contractRef}}

If an endpoint declares no parameters, you'll see a single free-form Params input where you can enter key={{field}};key2={{field2}} pairs by hand.

Worked example — Payment Received → JDE accounting

A typical binding when the source system is JD Edwards: on Payment Received (status 205), call a JDE AIS report to register the payment in the source ERP.

FieldValue
ActionPayment Received (status 205)
Connectorjde-ais (JD Edwards AIS connector defined under Configuration → API Connectors)
EndpointreportExecute_R0010P — Execute Report R0010P

Parameters

ParameterValue
Report NameR0010P
Report VersionZJDE0001
Company Code{{fedct}}

The two first parameters are literal (the JDE report ID and version are constant), while Company Code uses the {{fedct}} placeholder to inject the company of the current invoice. Replace the connector / endpoint with whatever your source ERP exposes — the same mechanic works for SAP BAPIs, NetSuite RESTlets, or a custom ERP webhook.


Tips & best practices

  • Start with paMode= (none) when first wiring up a new document type — you can build the UBL pipeline end-to-end before involving the PA.
  • Test against the mock (Tab 4) before pointing at the real PA. Use ALTERNATING to exercise both happy-path and error-path code in the invoice detail UI.
  • Define endpoints once, reuse from Actions. Don't duplicate URLs across actions — bind each action to the corresponding endpoint name.
  • Server-restart-required intervals: changing Import poll interval or Status retrieval interval only takes effect after restarting the NomaUBL server process.
  • Response Mappings are your contract with the PA. If the PA changes a field path in its response, update the mapping rather than parsing the response in calling code.