Changed behaviour (API): Remind (POST /api/v1/submissions/{id}/resend/{signerId}) now answers 409 instead of sending, for a document that ended (submission_ended), a signer who already signed or declined (signer_done), and a signer whose turn has not come in a document with a signing order (signer_not_current). Migration: remind only signers whose status is pending or viewed (and, with a signing order, whose turn it is), or treat these 409 codes as "nothing to send". Make scenarios that remind every signer through Send a Reminder will see them as errors.
Changed behaviour (API): turning a flow on (POST /api/v1/flows/{id}/activate), and saving a flow that is on (POST /api/v1/flows/{id}/save), now answer 409 invalid_graph when a module that uses a connection has none chosen (issue connection_not_chosen, on conn). Such a flow failed at that module on every run. Migration: choose the module's connection (its conn in the draft), then save and turn the flow on again. Flows that are already on keep running as before.
New
- Flows (by invitation only): automatic reminders on document steps. In a Create a document and wait step, turn on Remind signers who haven't signed and choose when: the first reminder after a number of days (1 to 30), then one every few days (1 to 30), up to 5 reminders. Each reminder emails every signer who still has to sign (with a signing order, only the signer whose turn it is), in the name of the person who sent the document. Reminders stop when the document is signed, declined or voided, and none is sent once it expires. A signer anyone else (a person, or another flow) reminded in the last 24 hours is skipped. Each reminder is in the audit log, marked as sent by the flow, and fires
signer.reminder_sent. New document steps start with reminders on when your organization set Auto-Reminder (days): every that many days, at most 3 times. Existing steps are unchanged. A reminder that could not be sent shows as a warning on the step's operation, and the document keeps waiting. - Flows API: `forNewModules` on `POST /api/v1/flows/schemas`. Send
forNewModules: true when the nodes are modules being added: their settings' defaults then follow the organization's settings where the module says so (today, a new Create a document and wait step's reminders follow Auto-Reminder (days)). Without it, the answer is as before. - Flows (by invitation only): listen for a sample call while a flow is off. On a flow that starts with a custom webhook, an owner or admin can listen for 5 minutes (
POST /api/v1/flows/{id}/webhook/listen). The next call is kept as a sample and answered 200 Accepted, and nothing runs for it; every other call to a flow that is off is still turned away and not kept. On a flow that is on, the call is kept and also runs as usual. Read the sample with GET /api/v1/flows/{id}/webhook/sample to build the webhook's data structure from it, and stop or discard it with DELETE /api/v1/flows/{id}/webhook/listen. A sample never keeps a file's contents and holds at most 512 KiB: a larger call still ends the listening, but only its method, content type and size are kept. Only owners and admins can read a sample, for 24 hours after the call; the daily cleanup then deletes it. A flow set to Keep data confidential can't listen. Listening, stopping and each kept sample are recorded in the audit log. - Flows (by invitation only): Flows home. The Flows page now opens on what needs you: a connection to reconnect, a flow that turned itself off or fails today, and runs saved to retry, each with the button that fixes it. Beside it are the documents your flows sent that wait for signatures, with Remind. People with the "Edit flows" permission see names; others see how many there are. One sentence sums up your last 30 days.
- Flows: tabs, search and a richer list. All, On, Off and With problems each show a count, next to Trash. Search finds a flow by its name, its folder, the apps it uses or the names of its modules. Each flow shows its path of apps, how it starts, its last run, its last 7 days and its operations, and you can sort by name, last run or operations.
- Flows: starter flows. All templates offers ready-made flows, for example "Save signed documents back to Priority", each opening as a draft to fill in. With no flow yet, Flows shows them next to a short "How a flow works". The API lists them at
GET /api/v1/flows/starters (scope flows:read). - Automation in the sidebar. Flows and Data sit in their own Automation group. Runs, Connections and Apps join it as their pages arrive.
- Flows (by invitation only): answer the webhook caller. A flow that starts with a Custom webhook can now answer the request that started it, with the new Webhook response module: a status from 200 to 599, a body (text; a collection or a list, sent as JSON; or a file) and up to 16 headers. The caller waits up to 180 seconds for the first answer. If the run ends without one it gets
200 Accepted, or 500 Scenario failed to complete. when the run failed. A flow that processes data in order, or that does not run immediately, still answers Accepted at once. A flow with a Webhook response is not turned off by an ordinary error and waits out no back-off: the failing request is answered (when its caller is held) and is not run again. An error that stops the flow from running at all (for example, running out of operations) still turns it off, and so does the last failed automatic retry of an incomplete run. When the run cannot start at once (the flow's maximum runs per minute, or a back-off), the caller gets 429 Too many requests for scenario and nothing is kept. - Flows (by invitation only): one Runs page for all your flows. Runs, in the sidebar's Automation group with the number of runs saved to retry, lists every flow's runs, newest first and grouped by day. Each run shows its number, its status, how it started, how many items it handled, its operations, and how long it worked.
- Filters: by flow, by period (the last 24 hours, 7 days or 30 days, or dates you choose) and by status, Waiting to sign included. The filters stay in the page's address, so a link keeps them.
- Empty checks (scheduled checks that found nothing new) are hidden unless you ask for them, and the page says how many it hid.
- Open a run's row to see what happened to each item: where it ended, or where it failed.
- A flow's own runs tab is now the same page, fixed to that flow.
- Flows (by invitation only): Saved to retry. Runs that failed at a module and were saved, so they can be retried from there, now have a tab of their own with their count. Each one shows: You can Retry now, retry with the draft's settings, open the module in the editor, or delete the saved run (it asks first). Each retry and delete is in the audit log.
- where it stopped and the error;
- when it retries. A retry waits while its run still waits for signatures.
- Flows (by invitation only): the builder warns before `erase` fails on a Priority field. Priority does not let a number, an amount, a date or a yes/no column be emptied through its API, so a run refuses
erase there. The mapping panel now marks erase in those fields, and a field that holds it says so, before the flow runs. - Flows API: `ui.erase` on a module's inputs.
POST /api/v1/flows/schemas marks an input with ui: { erase: "refused" } where a run refuses the erase keyword. - Flows (by invitation only): your custom variables in the mapping panel. Anyone who can edit flows now sees the organization's custom variables by name in the mapping panel's Variables tab, and can map one into a field. Their values stay visible to owners and admins only.
- Flows API: custom variable names for flow editors.
GET /api/v1/custom-variables?view=names returns each variable's name and type, never its value. It needs the "edit flows" permission and the flows:read scope. The full list, with values, stays owners and admins only. - Flows API: a document out for signature has an output while it waits. For a step that sent a document still waiting to be signed,
GET /api/v1/flows/{id}/runs/{runId}/payload now returns its output so far: the document, when it was sent and when it expires, and each signer's name, email, role and status as of when it was sent. It never contains a signing link. When the document is signed, declined, voided or expires, its real output replaces it, as before. GET /api/v1/flows/{id}/runs/{runId}/operations marks such a step with has_provisional_output, keeps has_output false until the document ends, and gives a document's step settled_at, the time its signing ended. Reading outputs still needs the "edit flows" permission, and a confidential flow keeps none.
Improved
- Flows: New flow no longer asks for a name first. It opens "Untitled flow" in the editor with the name selected, ready to type over. A flow's last update date moved into its More menu, and the links between the flow pages moved from above the list to the sidebar.
- Flows: "Waiting to sign". A run held for its documents now reads Waiting to sign. It used to read "Waiting for a signature or another flow".
- Flows: a flow's runs load as you scroll. The runs tab no longer pages with Newer and Older; more runs load at the end of the list, or with Load more runs. "Show check runs" is now Hide empty checks, and it is on by default. The tab now lists the runs of the period you choose: the last 7 days by default, or 24 hours, 30 days, or dates you choose up to a year back (it used to page over every run). A flow in the trash no longer lists its runs on its tab; restore the flow to see them.
- Flows (by invitation only): a module with no connection chosen stops the flow from turning on. The builder marks the module and lists it with the flow's warnings, and its settings say so under the Connection field. You can still run the flow once with Run once to test it: the notice under Run once names the module, as before. The note before turning the flow on asks you to fix it first.
- Every email SignFlow sends is redesigned.
- Signing invitations, verification codes, reminders, signer and completion notices and team invitations use SignFlow's light look: your organization's logo and brand color on a white card. When you have set no brand color, the accent is SignFlow's teal instead of indigo. Organization Settings → Branding shows the same default in its email preview.
- Billing notices use SignFlow's dark look. A Hebrew notice now reads right to left from top to bottom.
- Internal billing and collection alerts to the SignFlow team use the same dark look.
- What every email has now: a short inbox preview line, a plain-text version for mail apps that show text only, and a layout that holds up on phones and with images turned off. A Hebrew name or document title in an English email keeps its own direction. Verification codes still never appear in the subject or the preview line.
- Logos show up in more inboxes. The logo now travels inside the email instead of being fetched from our servers when the email is opened, so mail services that cannot reach those servers still show it. This covers the SignFlow logo and organization or agency logos uploaded to SignFlow up to 512 KB. A larger logo, or one hosted on your own website, is still linked as before.
- Replies reach someone. Replying to a SignFlow email used to go to a no-reply address. A reply now goes to your organization's reply-to address when you have set one, else to support: care@leonai.io, or your agency's own support address under a white-label brand.
Fixed
- Remind no longer emails a signer who should not get one.
POST /api/v1/submissions/{id}/resend/{signerId} now answers 409 for a document that ended (submission_ended: completed, declined, voided or expired), a signer who already signed or declined (signer_done), and, in a document with a signing order, a signer whose turn has not come (signer_not_current). Before, it sent each of them a reminder email. A signer after one who declined, in a document with a signing order, is also not reminded: their turn cannot come. And Remind on a document saved without a name now uses its template's name; before, it failed with an error. - Flows (by invitation only): no more false "no connection" warning on HTTP modules. An HTTP module set to No authentication needs no connection, and is no longer marked as missing one. Resolve URL never needs one.
- Flows (by invitation only): an error route can hold an If-else and its Merge before its error handler. A route that handles a failure by choosing between branches, merging them and then ending with Ignore, Resume, Break, Commit or Rollback was refused with "it can only end an error route". Make allows and runs such a route, and now so does SignFlow.
Security
- Flows: answers from a flow's webhook address are sandboxed. Every response from
/api/v1/flows/inbound/… now carries Content-Security-Policy: sandbox; default-src 'none'; frame-ancestors 'none' and X-Content-Type-Options: nosniff, so a page a flow returns cannot run script with a signed-in person's session. A Webhook response cannot set cookies, redirects (Location), CORS headers or other security headers. - Flows (by invitation only): moving an active flow to the trash needs the right to turn flows on and off. The trash turns a flow off, so a member who may edit flows but not turn them on or off can no longer switch one off this way. In the flows list, Move to the trash is unavailable to that member on an active flow; a flow that is already off can still be moved. API:
POST /api/v1/flows/{id}/trash on an active flow answers 403 without flows.activate, and 409 flow_changed when the flow was turned on in the meantime.