Callback verification: text and call an investor about a held payment, and get a signed answer back

Your payments system holds a suspicious payment. Omni Octo texts the investor, calls them, asks if they made the request, and sends a typed, signed result back to your system. A person still decides what happens to anything that is not a clear yes. Built from one message to Octo.

Updated

A fictional mutual fund holds a $20,000 redemption. Octo builds the AI agent, the Dialog Insight and the workflow from one conversation, the agent texts and calls the investor, and a typed, signed result comes back.

Saltmarsh Funds is a fictional mutual fund company. A redemption of $20,000 has just come in, to a bank account that was changed six days ago. Saltmarsh’s rule says a payment like that stays on hold until someone has called the investor on the phone number on file.

Today that call is a ticket in a queue. This guide replaces the wait, not the team: Omni Octo texts the investor a heads-up, phones them, asks one question, and sends the answer back to the payments system as typed fields it can act on. The payments system keeps the decision, and anything that is not a clear yes goes to a person.

You build it by describing it to Octo: no drag and drop, and no technical skills for this part. A build like this usually takes days, and Octo takes about ten minutes. Pointing your own payments system at it and making the test calls is the rest of an hour, and that part needs someone who can change your system.

What you end up with

One workflow, with four steps:

StepWhat happens
Webhook inYour payments system sends the case: investor, amount, fund, phone number
TextThe investor gets a heads-up from your number, with the amount and a reference
Call, and waitYour AI agent phones them. The workflow waits for the call to end and for its analysis
Signed result outA signed message goes back to your system with the typed fields

Omni Octo never moves money. It has no connection to your payment rails. All it sends back is an answer.

Before you start: what you need

  • A number that can both text and call. A toll-free number is the usual choice. See how to get a business texting number. It has to show Cleared to send under /phone-numbers before the text will go out.
  • A place for the result to land. That is an address on your payments or operations system that can receive a POST and check a signature.
  • A signing secret, shared by both sides. Octo can’t hold secrets, so you save this one yourself in the next step.

Step 1: Save the signing secret

Go to Integrations → Add integration and pick Webhook signing secret. Give it a name you will recognise, such as Saltmarsh payments system. Paste the secret, and under How the sender uses it choose Signs each webhook (HMAC). Press Save.

The same integration does both jobs in this workflow. It checks the case coming in, and it signs the result going out.

You don’t need to add your system’s address by hand. Octo proposes it in the next step, on a card you approve.

Step 2: Ask Octo to build it

Open a new conversation with Octo and describe the job. The first paragraph below is the request. The details are there so that Octo doesn’t have to guess at your field names:

Build a callback verification line for Saltmarsh Funds, a mutual fund company. When our payments system sends you a case, text the investor a heads-up and then call them. Confirm you’re speaking to the investor by name, read back the request, and ask if they made it. If yes, it’s paid today; if no, unsure, or they want a person, it’s on hold and a fraud specialist will call within the hour. Then send the result back to our payments system.

Details

  1. One workflow. Trigger: a webhook verifying X-Signature-256 with the integration “Saltmarsh payments system”. The case looks like {"case_id":"SF-20931","investor_name":"Jordan Lee","fund":"Saltmarsh Growth Fund","amount":"$20,000","bank_last4":"7731","bank_changed_on":"October 27","phone":"+1…"}
  2. Text, then call, from our toll-free number. Text: “Saltmarsh Funds: we’re calling you now from this number about a {amount} redemption request, ref {case_id}. We will never ask for your password.” Wait for the call to finish (10-minute cap), and carry the case ID on the call. Every case must place a new call, even for the same case ID. Quiet hours on for both steps.
  3. The agent: a neutral greeting with no name in it. First question: “Am I speaking with {investor_name}?” If not, apologise, share nothing, end the call. Otherwise read back the amount, the fund, the bank account ending and the date the bank details changed, and ask “Did you make this request?” Give the reference, say goodbye and end the call yourself. Never ask for passwords, account numbers or Social Security numbers. No financial advice.
  4. Dialog Insight on the agent, exactly these fields: case_id (text), outcome (released or held), request_recognized (yes, no or unsure), hold_reason (none, not_recognized, wants_specialist or no_answer), summary.
  5. After the call, in the same workflow: a signed POST to https://payments.saltmarsh.example/hooks/octo with those fields and the call status. If the call wasn’t answered or was skipped, send outcome: "held" and hold_reason: "no_answer".
  6. Approve that address on the integration, validate, leave the workflow inactive, and give me its webhook address.

Octo builds the agent, the Dialog Insight and the workflow from that one message. It may ask you about the time zone or what to do about calls outside calling hours.

Octo stops and asks before it creates, approves or turns on anything. Read each card and confirm it, including the Approve address card. That card is the only way the workflow is allowed to send to your system.

The Saltmarsh verification line agent page, with its system prompt open at the lines that say never to ask for passwords.
The agent Octo built, with the script it follows. You can read and edit every line.

Step 3: Point your system at it

Octo gives you the webhook address. You can also find it on the Overview tab of the workflow, in the Webhook endpoint card, with a Copy button and a status:

  • Ready: live, with a signing secret saved
  • Inactive: not switched on yet, so your system’s messages are refused
  • Setup incomplete: something is still missing

Configure your payments system to POST each held case to that address, signed with the secret from Step 1. Then tell Octo “Activate it”.

Step 4: Test on your own phone

Send a test case with your own number in it, answer, and try every answer an investor might give:

You sayThe agent should sayYour system should get
”Yes, that was me”It will be paid today, plus the referencereleased, yes, none
”No, I didn’t make that”It’s on hold, a fraud specialist will call within the hourheld, no, not_recognized
”Can I talk to a person?”The same hold messageheld, wants_specialist
Let it go to voicemailNothing about the caseheld, no_answer

The result arrives a few seconds after the call ends, once the analysis is in.

Testing outside calling hours? Don’t turn quiet hours off. Ask Octo to run the workflow once to your own number. That one run can call only you, and the setting stays as it was. Texts are still skipped on that run, so test the text during calling hours.

If something looks wrong, ask Octo to show you the last run and explain it. The steps and their results are also under Runs on the workflow.

The Callback verification workflow on its Overview tab: the webhook address, then four boxes, webhook in, send a text message, place a phone call, send a signed webhook.
One workflow. The call step waits for the call to end and for its analysis, so the signed webhook carries the answer.

The console in this guide and the film

We built a small operations console to show what this looks like from the payments team’s chair. It is a stand-in for your own system: Saltmarsh Funds is fictional, and so are its cases and people. Your own screen can be anything that can send a POST and check a signature.

The fictional Saltmarsh Funds payments screen: a queue of payment exceptions, case SF-20931 on hold, the rule that requires a callback, and a Verify by phone button.
The case before the call. An operator presses Verify by phone, or your system can start the workflow on its own, the moment it flags a payment.

Pressing the button only sends the case to the workflow’s webhook address. Your payments system can send the same case by itself as soon as it flags a payment, with nobody pressing anything.

These are the three results a case can come back with. In all three, the console checks the signature before it reads a field.

The investor did not make the request. The payment stays on hold and the case goes to the fraud team.

Case SF-20931 marked Held, fraud review, with fields outcome held, request_recognized no, hold_reason not_recognized, and Signature verified.
No: held, with the reason and a one-line summary for the fraud specialist.

The investor confirmed it. Your system can release the payment.

Case SF-20931 marked Released, with fields outcome released, request_recognized yes, hold_reason none, and Signature verified.
Yes: released, so someone telling the truth is not held up.

Nobody picked up. A voicemail counts as unanswered, so the money stays where it is.

Case SF-20931 marked Held, no answer, with fields outcome held, hold_reason no_answer, and Signature verified.
No answer: held, with the reason no_answer. Nothing about the case was left in the message.

What comes back

The result is not a transcript. It is the fields you named, signed:

{
  "case_id": "SF-20931",
  "outcome": "held",
  "request_recognized": "no",
  "hold_reason": "not_recognized",
  "summary": "Investor did not make the request and did not change their bank account.",
  "status": "completed"
}

Check the signature before you read anything else. Then treat anything other than outcome: "released" as held, including a missing field or a result that never arrives. A workflow that fails should leave the money where it was.

The Callback result Dialog Insight in the editor, showing the case_id and outcome fields and the outcome field's allowed values, released and held.
The Dialog Insight Octo set up. You can edit the fields here, or ask Octo to.

The fields are Dialog Insight, so you can see them on the call itself as well. Open the call in Conversations to find the Dialog Insight beside the full transcript. That is what your fraud specialist reads before calling back.

The call in Conversations: the full transcript beside the Dialog Insight card with the five fields.
The whole conversation and the same five fields, for the specialist who calls back.

Keeping a person in the loop

A person stays involved at three points:

  • Before it goes live. Octo builds nothing and turns on nothing without a card someone confirmed.
  • After every call that isn’t a clear yes. Your system routes held cases to your fraud team. The investor has been told a specialist will call, so somebody has to.
  • Before a release, if you want. Ask Octo to add an approval step after the call. The workflow waits on it, and the named approver answers Approve or Reject on the workflow’s run page. For large amounts, this is worth the extra minute.

You can also change the workflow by describing the change. For example: “When a redemption is held, also email the fraud desk with the case number, the reason and the summary.”

What this does not do

  • It is not identity verification. The agent asks whether it is speaking to the person named on the case, and takes their word for it. What makes it a callback is that you call the number on file, so don’t call a number that arrived with the request.
  • The answer comes after the call, not during it. Nothing reaches your system until the call has ended and been analysed.
  • Calling hours apply. By default both steps respect calling hours: 9am to 8pm in every time zone of the investor’s country, which for the US and Canada works out to 9am to 4pm Pacific in winter. Outside those hours the step is skipped, not delayed, so the case comes back as no_answer.
  • Voicemail counts as unanswered, and comes back as no_answer. The agent shouldn’t leave case details in a message.
  • The fields are an AI’s reading of a conversation. They are usually right, and they can be wrong. That is why anything but a clear yes is held, and why the approval step exists.
  • The agent’s script is an instruction. “Never ask for a password” is something you tell the agent and test on your calls, not a technical block.
  • Replies to the text go to whichever agent answers that number. Check this before you go live. Ask Octo to route replies to the verification agent or to a person, or an investor’s “was this really you?” could reach your general support agent.