Send
This chapter was written from the product's source code and has not yet been checked by a person on a running Cogneris. If what you see on screen differs, the screen is right — please tell your Cogneris contact so the chapter can be corrected.
A Send phase delivers the result of the whole process to your system: it posts a signed JSON call to the webhook endpoint you set. It is normally the last phase of a route.
| Palette | Nodes › Send |
| Outputs | One output |
| Content status | From source; not observed (workflow-fe f88c5c1, workflow-be 6703373, 2026-10-22) |
When to use it
- At the end of a route, to hand the extracted data and the outcome of each document to a CRM, an ERP or any system that can receive an HTTPS call.
- During setup, pointed at a Test URL, to see exactly what your system will receive before you connect it.
A Send phase may receive links from several phases — for example from both outputs of a Conditional, one of them through a Manual Review. It runs once, from the route the process actually took.
What happens in a run
1. The process result is closed
When the process reaches Send, every phase before it on its route has finished. Send then:
- marks every document that did not fail as completed;
- copies each document's extracted fields to the document management area as tags, and marks the process as completed there (both best effort: a failure here never stops the delivery);
- builds the process result, a JSON object with:
| Key | Content |
|---|---|
runId | The process (run) |
workflowId, version | The workflow and the published version the process ran on |
source | Where the process was started from |
process | The process data supplied when it was started, if any |
summary | total, completed and failed document counts |
documents | One entry per document: documentId, name, status, result, error, ecmDocumentId and downloadUrl |
upstream | The output of the phase that led into Send |
downloadUrl is filled only for documents the process produced (for example a generated contract) and is valid for 24 hours. Documents the customer uploaded carry only ecmDocumentId, which does not expire.
2. The webhook calls
With an Endpoint URL (HTTPS) set, Send makes one call per document the process was started with (a process without documents makes a single call with empty document fields). Each call is:
- Method: the HTTP method chosen in the panel —
POST,PUT,PATCHorDELETE,POSTwhen none was chosen. - Body (JSON):
| Key | Content |
|---|---|
workflowId | The workflow |
workflowName | The workflow's name |
documentId | An identifier of the document in this process: doc_ followed by 24 hexadecimal characters, stable for the same process and file name |
documentName | The file name |
eventType | Always workflow.completed |
processedAt | UTC time of the call, as 2026-10-22T14:03:09Z |
data | The whole process result described above — the same in every call of the process |
- Headers:
| Header | Content |
|---|---|
Content-Type | application/json; charset=utf-8 |
X-Xtrakt-Run-Id | The process (run) |
X-Xtrakt-Workflow-Id | The workflow |
X-Xtrakt-Signature | sha256= followed by the lowercase hexadecimal HMAC-SHA256 of the raw request body, keyed with the Signing secret. Sent only when the phase has a secret. |
Verifying the signature. Compute HMAC-SHA256 over the body bytes exactly as received (UTF-8), using the 64 characters of the signing secret as text — do not decode them from hexadecimal — and compare the lowercase hex result with what follows sha256=.
Before every call the service checks the endpoint again: it must be HTTPS on port 443, contain no user name or password, resolve in DNS, and not resolve to a private or internal address. An endpoint that fails this check is not called.
3. The answer and the retries
| Your system answers | Result |
|---|---|
| Any 2xx | Delivered. The next document is sent. |
| 5xx, 408 or 429, a timeout, or a connection error | Retried. |
| Any other status (400, 401, 403, 404…) | Final failure — the run fails. |
| The endpoint is blocked by the check above | Final failure. |
On a retryable failure the phase is run again at once, up to 3 more times (4 attempts). A new attempt picks up where the last one stopped: documents this phase already delivered to the endpoint are not sent again, and the phase output lists them under alreadyDelivered. Retrying the phase after it completed sends nothing again either. When the attempts are exhausted the run fails.
A document can still reach your system twice if the call succeeded on your side but the answer never arrived (for example a timeout after you processed it), so keep accepting the same documentId twice. A correction round re-runs the phase as a new step and delivers again.
Every attempt for every document is recorded in Webhook Deliveries (Administration › Integrations & Deliveries) with the endpoint, the payload sent, the HTTP status, the response time, the outcome and an Attempt number that grows per document. From there Resend webhook sends the stored payload again, with the same HTTP method, as a new attempt. It is signed with the signing secret of the published version that is live now — a secret regenerated in a draft that was not published yet is not used, because your system has not been given it. If the live version no longer has that endpoint, the secret of the version the process ran on is used. A resent payload is the original one, so its downloadUrl links may have expired. See Connect your systems.
4. What it stores
The phase output is the process result plus a delivery entry: channel (custom_webhook), event, the Integration name, the endpoint, whether it was a test URL, and the HTTP status of each document's call.
When every document failed
If no document of the process succeeded and exactly one Send phase can still be reached, the process goes straight to that Send, which delivers the result with every document marked failed. The run then ends as failed. In this case documents are not marked completed and the document management area is not updated.
Without an endpoint
With Endpoint URL (HTTPS) empty, the service:
- e-mails the process result to Recipient email, when it is filled. The subject is Subject, or Cogneris workflow result when Subject is empty. A failed e-mail is retried like a webhook, and an e-mail that went out is not sent again by a retry;
- otherwise publishes the event
extract.processedthrough the Cogneris vision service, with the run id, the workflow id and version, andresults— the per-document results of the phases before Send (found even when a Manual Review wrapped them). Where that event goes is decided by that service.
Configuration
Select the phase to open Phase Configuration. Its header shows the phase type as SEND.
| Field | What it does | Required | Format / values | Default | Validation messages |
|---|---|---|---|---|---|
| Description | The name shown on the node | No | Text | Send | — |
| Subject | The e-mail subject. Used only when the phase sends an e-mail (see Without an endpoint). | No | Text | Empty | — |
| Recipient email | Where the process result is e-mailed when Endpoint URL (HTTPS) is empty. Previous step output will be sent as the email body. | No | One e-mail address | Empty | Enter a valid e-mail address. · This step has an endpoint URL, so the e-mail would never be sent. Keep only one of them. (in the panel) · Send phase e-mail recipient must be a valid e-mail address. · Send phase has both a webhook endpoint and an e-mail recipient; only the endpoint would be used. Keep one. (on publish) |
| Integration name | A name for the receiving system. Stored in the phase output; not sent in the call. | No | Text | Empty | — |
| Endpoint URL (HTTPS) | Where the calls go. Setting it is what makes the phase post to a webhook. | For webhook delivery | An absolute https:// URL on port 443, or a Test URL | Empty | Enter a valid HTTPS URL. (in the panel) · Send phase webhook endpoint must be a valid HTTPS URL. · Send phase webhook endpoint must use the standard HTTPS port 443. (on publish) |
| HTTP method | The method of every call to the endpoint, and of a resend. | No | POST, PUT, PATCH, DELETE | POST | Send phase HTTP method '…' is not supported. Use POST, PUT, PATCH or DELETE. (on publish, for a value set outside the editor) |
| Description (optional) | A note on what the integration does. Not used by the service. | No | Text | Empty | — |
| Signing secret | The key of X-Xtrakt-Signature. Shown, read-only, to administrators only and only while an endpoint is set. | — | 64 lowercase hexadecimal characters | Created when an administrator sets the endpoint; otherwise created when the workflow is published | — |
Notes on the signing secret:
- Clearing Endpoint URL (HTTPS) as an administrator also deletes the secret.
- A save by a profile that cannot see the secret keeps the stored one.
- The secret travels with the published version: a new or regenerated secret is used by processes started after the next publish. Processes already running keep the secret of their version.
Buttons and actions
| Button | What happens | Reversible? |
|---|---|---|
| Test endpoint | Sends one POST whose body is an empty JSON object, with the header X-Xtrakt-Webhook-Probe: true to the endpoint, after the same address checks as a real call. Any HTTP answer, even an error status, counts as reachable: Endpoint reachable. The test sent a real POST with the header X-Xtrakt-Webhook-Probe: true — make your receiver ignore requests that carry it. Otherwise Endpoint not reachable: …. Disabled while the URL is empty or invalid. The probe is always a POST, whatever HTTP method says: have your system answer it and discard it when it carries X-Xtrakt-Webhook-Probe: true. | Nothing to undo |
| Copy (signing secret) | Copies the secret; the button reads Copied. Administrators only. | — |
| Regenerate | Creates a new secret at once. The previous one stops being valid for processes started after you publish. Administrators only. | No — the old secret cannot be restored |
| Generate test URL | Creates a temporary Cogneris address that records every call made to it. Needs a saved workflow (Save the workflow first to generate a test URL.). One test URL per phase: generating again replaces the previous one. | Revoke |
| Copy (test URL) | Copies the test URL; the button reads Copied. | — |
| Use as endpoint | Puts the test URL in Endpoint URL (HTTPS). | Type your endpoint back |
| View requests | Opens Received requests: Time, Method, Status, Size of each call, refreshed every 10 seconds; select one for its Headers and Payload. Refresh reloads, Back returns to the list. A large payload is marked truncated. | — |
| Revoke | Ends the test URL. Calls to it then fail. | No — generate a new one |
A test URL expires after 7 days (Expires in … day(s). History is kept for 7 days.). Calls to it are recorded in-process with the same headers and signature a real call carries, and also appear in Webhook Deliveries. Replace it with your real endpoint before going live.
Common problems
| Message | Cause | What to do |
|---|---|---|
| Enter a valid HTTPS URL. | The endpoint is not an absolute https:// address | Correct the URL. |
| Send phase webhook endpoint must be a valid HTTPS URL. | Publishing refused: the saved endpoint is not a valid HTTPS URL | Correct the URL, save and publish again. |
| Endpoint not reachable: https_required / port_not_allowed / userinfo_not_allowed | The address is not HTTPS, not on port 443, or carries a user name or password | Use a plain https://host/path address on port 443. |
| Endpoint not reachable: dns_resolution_failed | The host name does not resolve | Check the host name. |
| Endpoint not reachable: blocked_private_address | The host resolves to a private or internal address | Use a publicly reachable address. |
| Endpoint not reachable: timeout / unreachable | No HTTP answer (connection, TLS or time-out) | Check that your system is up and accepts HTTPS from the internet. |
| Endpoint not reachable: test_hook_inactive | The test URL was revoked or expired | Generate test URL again. |
| Test URL operation failed. Try again. | Generating, loading or revoking the test URL failed | Try again. |
| Could not load requests. | Received requests could not be loaded | Refresh. |
| No requests received yet. Run the workflow to see deliveries here. | Nothing has called the test URL yet | Start a process on the published workflow. |
| Run error HTTP … with a 4xx status | Your system refused the call; not retried | Fix the receiving side, then Resend webhook from Webhook Deliveries. |
| Run error Webhook endpoint blocked: … | The endpoint failed the address checks at delivery time (for example its host now resolves to a private address) | Fix the endpoint, publish, and resend. |
| Run error Webhook POST timed out. or Webhook POST call failed: … (the method named is the one configured) after the retries | Your system did not answer in 4 attempts | Check your system, then Resend webhook. |
| Run error Test hook not found (HTTP 404). Generate a new test URL. / Test hook revoked or expired (HTTP 410). Generate a new test URL. | The published endpoint is a test URL that no longer exists | Put your real endpoint, or a new test URL, and publish. |
| Your system rejects the signature | Wrong or outdated secret, a body changed before checking, or the secret decoded from hex | Copy the current secret, hash the raw body, use the secret as text. |
| Signing secret is not shown | Your profile is not administrator, or no endpoint is set | Ask your company administrator. |
Related
- Connect your systems — signature verification and Webhook Deliveries
- Send Message — a similar phase the service never ran, no longer offered
- Conditional — choose which route reaches Send
- Design and publish a workflow
Last reviewed 2026-10-22 · Version 1.0.0 · Owner: product-documentation