Requirements in Masnet
Before configuring the receiving system, prepare the destination in Masnet. The steps are the same for every system.
- Open Company › Integrations (the Spanish interface labels it Empresa › Integraciones), go to the Destinations tab and select New destination. If the integration has no authorized data yet, Masnet asks you to authorize it first.
- In Destination address (https) enter the receiver public URL. It must be
https, port 443 or 8443 and a public DNS name: user information in the URL, fragments, IP addresses and internal names are not accepted. A query string is allowed; Masnet treats the whole URL as a credential. - In Format choose Standard JSON (
application/json) or Structured CloudEvents (application/cloudevents+json). The event content is the same; see Webhooks. - Select Create destination. Masnet shows the signing secret (
whsec_…) only once. Store it immediately in the receiver secret store; it cannot be read again. - Select Test destination and then Send test. The integration is activated only after a successful test; then use Activate destination.
Receiving in Logic Apps
Configure the receiving flow as described in the Azure Logic Apps and Power Automate guide: HTTP request trigger, sig= URL in Destination address (https) and signature verification in a function before writing to Dataverse.
Verification and writing
- After the verification, use a condition on
triggerOutputs()['headers']['masnet-event-type']to choose the branch by event type. - To avoid duplicates, store
webhook-idin a column of the row and query it before writing; if it already exists, end without changes. If your table defines an alternate key, the Dataverse *upsert* operation avoids that step. - To avoid regressions, store the last applied
sequencepersubjectand discard the event if the received one is lower than or equal to it. - Write to Dataverse with the connector action or with the web API:
POST [Organization URI]/api/data/v9.2/<entity set>creates a row and answers 204 with theOData-EntityIdheader.
Mapping example: contract.status_changed
The table and column names below are an example: they correspond to a custom table that your organization must create. The Masnet fields are those of the com.masnet.contract.status_changed.v1 event, inside data.object.
| Event field | Example Dataverse column | Remark |
|---|---|---|
data.object.id | new_masnetid | Masnet contract identifier (UUID). |
data.object.contract_code | new_contractcode | business group. |
data.object.status | new_status | Open enumeration: ignore unknown values. |
data.object.tender.code | new_tendercode | public group. |
data.previous.status | new_previousstatus | Present only if the status changed. |
envelope sequence | new_sequence | To discard old events. |
header webhook-id | new_lastwebhookid | For idempotency. |
Response
Answer 200 or 202 from the flow after verifying the signature. If writing to Dataverse is slow, separate receiving from processing with a queue so that you answer within 15 seconds.
Testing with the test event
- In Masnet, select Test destination and Send test.
- Check that the branch for the test event (
com.masnet.integration.test.v1) ends without writing to Dataverse. - Try a real write after activating the destination, with a contract from a test environment.
Operation: duplicates and ordering
- Idempotency.
webhook-ididentifies the event and is kept across retries and redeliveries. Record the identifiers already processed and discard repeats with a 2xx response. - Ordering. Each resource (
subject) carries an increasingsequence. Discard an event whosesequenceis lower than or equal to the last one applied for thatsubject. Events of different resources have no order between them. - Retries. Masnet retries any non-2xx response for up to 72 hours; the full schedule is in Webhooks.
- Secret rotation. When rotating with overlap, the previous secret stays valid for 24 hours and
webhook-signaturecarries twov1,…signatures separated by a space. Accept the event if either one matches.
Troubleshooting
Masnet records the response code of each attempt in the delivery history. These are the effects of each receiver response:
| Receiver response | Effect in Masnet |
|---|---|
| 2xx | Successful delivery. It means receipt, not business processing. |
| 3xx | The redirect is not followed. It counts as a failure and is retried; the history shows the Location without its query string. |
| 400, 401, 403, 404 and other 4xx or 5xx | Retryable failure for up to 72 hours from the start of the delivery cycle. |
| 410 | Masnet disables the destination and cancels pending deliveries. Return 410 only if the destination must stop receiving events. |
| 413 | The event is marked as undeliverable to that destination and is not retried. |
429 or 503 with Retry-After | Retry-After (seconds or HTTP date) is honored up to a maximum of 1 hour. |
| No response within 15 seconds | Timeout (5 s to connect, 15 s in total). It is a retryable failure: answer 2xx and process asynchronously. |