Support

Need help?

Most answers are already written down. For everything else, Oneop does not publish a response time — there is no SLA instrument behind one — so the fastest thing you can do is send a complete first message.

Search the help centreEmail support@oneop.ioOpen your workspace

Worth including

  • The email you log in with
  • The URL of the screen it happened on
  • What you expected, and what happened instead

Goes somewhere else

AI chatbot

It answers anyone. It only acts for you.

A chatbot on a public website talks to strangers all day. So this one draws a hard line between the questions anybody may ask and the records only one person may touch — and it crosses that line by mailing a code, not by believing a name.

Prices, stock and your knowledge base: open to everyone. An invoice, an order, an appointment: a six-digit code first, every time, and only ever the ones that belong to the person holding it.

No credit card. Free plan, 2 seats, 50 AI credits a month.

  • 51

    blocks to build a flow from, in ten groups

  • 3

    things a block can do to a record — read it, prepare one, change one

  • 6

    digit code, mailed, before it will discuss anything personal

  • 5

    record changes per conversation in any ten minutes

  • 30

    messages a minute from one visitor, then it stops listening

Understand who is asking. Use only what it is allowed to use. Answer, or act inside a boundary. Hand the same conversation to a person.

Four stages, and the order is the whole design. Nothing personal is retrieved before the second one has finished, which is why the third can be allowed to do anything at all.

  • Who is askingAn email typed into a chat window is a claim. A six-digit code mailed to it and typed back is an identity. The chatbot keeps those two words apart, and the proof lives on our side of the conversation rather than in the browser.
  • What it may useA short window of the conversation so far, the fields the flow has collected, and — where you asked for it — passages from your own knowledge. Everything else is fetched because a block went and asked for it, one entity at a time.
  • Answer, or actReading, preparing something for a person, and changing your business are three different permissions with three different requirements. They are not three wordings of the same feature.
  • Hand overThe same conversation row, both sides of the transcript, the proved identity and the collected fields. Your agent replies into the window the customer already has open.
What happens after the handover
  1. Identity

    A claim, then a mailed code — never a name taken at face value
  2. Context

    A short window of the chat, your collected fields, your knowledge
  3. Action

    Read, prepare, or act — each with its own requirement
  4. Handover

    The same conversation, with everything it learned still on it

Looking up an order and cancelling one are not the same feature

Most chatbot pages put both in the same bullet list. They are not the same thing and they do not carry the same risk, so here they are separated by what they do to a record and by what each one requires before it will run.

The three classes of chatbot action

The classes of action an Oneop chatbot can take, the blocks in each class, what each does, and what it requires first
ClassBlocksWhat it doesWhat it requires first
ReadInvoice · order · order tracking · stock level · product search · knowledge answer · HubSpot contact, deal and company · WooCommerce productFinds something and says it.Nothing for public catalogue and stock. A mailed code for anything attached to a person or an order.
PrepareCapture a lead · open a deal · raise a support ticket · start a return · build a cart · create a payment linkCreates something a person will pick up.A mailed code, or a record this same conversation created. Capture goes to your leads pipeline, not into an existing customer.
ActCancel an order · book, move or cancel an appointment · apply a tag that starts a workflowChanges your business, immediately.Signed-in staff, or a verified visitor who owns that exact record. Five of these per conversation in ten minutes, then it stops.
Never, from a public widgetIssuing an invoiceNothing. It is refused before it is attempted.There is no setting. An anonymous visitor cannot cause an invoice to exist, in any flow, in any configuration.

The workspace a block operates in is taken from the installed widget’s own key on the server. It cannot be set by the page the widget is on, by the visitor, or by anything in the message — so a block cannot be talked into reading somebody else’s business.

It does not look you up. It asks you to prove it.

The usual approach is to take an order number or an email from the chat, find the matching record, and start talking about it. That is a lookup wearing identity’s clothes: everything the visitor supplied is something anybody could supply.

A claim

Typed into the chat. Worth nothing on its own.

An email address, an order number, a name. The chatbot will happily collect these and will not act on any of them. Nothing is looked up, and — this is the part that matters — nothing is revealed about whether the claim matched anything, because that answer is itself information.

A challenge

Six digits, mailed, ten minutes.

Five attempts, three codes per quarter hour, stored as a peppered hash and compared in constant time. The code goes to the address, so only somebody holding that mailbox gets through. A visitor who never completes it stays exactly as anonymous as they started.

An identity

Written on our side. Re-read every turn.

The result lives on the conversation record in the database and is loaded fresh on every message, never taken from anything the browser sent. There is no verified flag a page could set. And the conversation’s own token has to match too, so guessing a conversation number gets you nowhere.

When an unverified visitor leaves their details, they become a lead in your pipeline — scored and routed like any other. They are never quietly merged into an existing customer record on the strength of a matching email.

“Answers from your knowledge” is a promise one block makes

Attaching your documents to a model is not grounding. Grounding is what happens when the answer is refused because the documents did not support it, and that is a property of a specific block rather than of the chatbot as a whole. So here is what that block does, precisely.

It retrieves from your workspace only — every retrieval path is scoped to it, with no shared pool and no cross-customer index. It then requires the model to declare, in a structured field it cannot waffle in, whether the answer was actually supported by what came back. If nothing came back, that declaration is overridden to false on our side, because a model cannot be grounded in an empty context however confident it sounds.

Confidence is whatever the model reported, or nothing at all. It is never defaulted and never inferred. Below your threshold, or ungrounded, and the model’s answer isdiscarded — not softened, not prefixed with a caveat — and the visitor sees the fallback message you wrote, on a branch you can route to a person.

Where your knowledge base lives
  • RetrievedFrom your workspace’s own content, scoped in the query rather than in the prompt
  • DeclaredThe model must state whether the context supported the answer
  • OverriddenNothing retrieved means not grounded, whatever it claimed
  • ScoredModel-derived or null. A dash, never a plausible number
  • DiscardedUngrounded answers are thrown away, and your fallback runs

It does not know your business. It looks things up.

There is a comfortable ambiguity in the phrase “connected to your CRM” that we would rather not trade on. Two different things are going on, and only one of them is automatic.

Attached automatically

A short window of the conversation — the last eight turns by default, tunable — and the fields your flow has collected in this session. On the AI reply block, and only there, up to three passages from your knowledge are attached as well. That is the whole list.

No customer record is loaded because a conversation started. No order history is sitting in the prompt in case it comes up. There is no ambient sense in which the chatbot already knows who you are.

Fetched on purpose

Everything else. An invoice is read because you put an invoice block in the flow. Stock is checked because there is a stock block. Each one names its entity, takes its own parameters and carries its own permission requirement — including which kinds of document a knowledge block is even allowed to search.

The practical consequence is that the blast radius of any single block is the thing that block reads. That is a boundary you can point at on a diagram, which is the only kind worth claiming.

The person inherits the conversation, not a summary of it

When a flow escalates, the row the visitor has been talking to changes state. It is not closed and reopened as a ticket, and it is not copied into a different inbox. The customer keeps typing in the same window and a person starts typing back.

What travels with it: the full transcript with both sides in it, any identity the visitor proved during the chat, every field the flow collected, the escalation reason and the visitor’s profile. Your agent inherits a verified customer without asking them to verify again — the chatbot did that work and the proof is on the conversation, not in the bot’s memory.

And one thing that does not travel, because it does not exist: nothing writes an AI-authored summary of the chat for the agent. The panel leads with the escalation reason your flow set, and falls back to the tail of the last bot message. We would rather say that here than let you picture a briefing that is not being written. Set a clear escalation reason and the top of that panel earns its place.

How your team works the conversation

Connected with Oneop

The records it reads are the records you work in

A chatbot block does not call an API to reach your business — it queries the same tables your staff have open. The invoice it quotes is the invoice in Finance. The stock level it promises against is the one the warehouse is picking from. A lead it captures lands in the CRM already scored and routed, and a ticket it raises is in the Help Desk queue with the transcript attached rather than described. That is also what makes the permission model on this page mean something: giving a flow order reads and no order writes is a real boundary because there is exactly one set of orders. There is nothing to synchronise and nothing to map, because there is nothing in between.

You are hereAI chatbotAI responds using permitted business context.

The other 6 modules sit on the same record, and reach AI chatbot the same way:

Beyond the four stages

Testing a flow cannot change your data

The preview inside the builder walks the real flow through the real engine — the same one your visitors hit — but it is marked as a test at the door and every record-changing block refuses on that basis. You get an honest rehearsal without a trail of test leads, test tickets and test appointments to clean up afterwards.

A broken lookup never becomes a confident answer

When a lookup cannot run, the chatbot distinguishes a source that was never set up from one that failed just now, and says so. Neither is ever rendered as “nothing found”, because “we could not check” and “it is not there” are different sentences to a customer and only one of them is true.

It cannot loop forever, and it cannot loop quietly

A single turn walks at most fifty blocks, and no block runs more than three times unless it is a loop, which carries its own counter. A flow that argues with itself stops rather than running up a bill in your name.

Calculations run in a sandbox, not an interpreter

The expression block understands a deliberately tiny grammar — arithmetic and comparison, no function calls, no property access, no evaluation of arbitrary code. Anything outside it fails closed. Outbound requests are checked before they are made, so a webhook URL cannot be pointed at your own internal network.

What the visitor typed is scrubbed before the model sees it

Emails, phone numbers and national insurance and social security numbers are masked out of the text on its way to the model and on its way to the log. That happens on every AI call in Oneop and there is nothing to switch on, which is the only version of a privacy control worth having.

The transcript has both sides of it

Visitor lines and bot lines are written through one function rather than by whichever surface happened to handle the message. That sounds like plumbing and is the reason a handed-over conversation reads as a conversation instead of as a list of things the customer said into a void.

One script tag on your site. Everything else is already inside.

Installing is a single snippet, or the WordPress plugin if that is where your site lives. After that there is no per-chatbot credential to store, because the flow reads Oneop’s own tables rather than calling out to your other systems. What the integrations below do is put rows in those tables — orders from WooCommerce, deals from HubSpot, payments through Stripe, leads captured on WordPress. A row that arrived that way is indistinguishable to a flow from one somebody typed.

Two blocks are exceptions and go out directly: the HubSpot and WooCommerce lookups, for teams whose catalogue or pipeline still lives there. Everything a flow sends outward — a webhook, an API call — is checked before the request is made.

See all integrations
  • WooCommerce
  • HubSpot
  • WordPress
  • Stripe
  • Gmail
  • Microsoft 365
  • SendGrid
  • Webhooks

For the technical evaluator

Not yours and not there read exactly the same.

A visitor who asks about a record they do not own gets a word-for-word identical reply to a visitor who asks about a record that never existed. Only signed-in staff are ever told that something is missing.

Why this is the guarantee, and the limits around it

What the difference costs you. A chatbot that says “I can’t find order 41822” for one number and “I can only discuss that once I’ve verified you” for another has just answered a question nobody asked. Run it a few thousand times and it will tell a stranger which of your order numbers are real, which email addresses belong to customers, and roughly how many of each you have. This is not a hypothetical class of bug; it is the ordinary way an otherwise careful support bot leaks a customer list, and it survives review because both messages are individually polite and individually true.

How it is enforced. The refusal is emitted before the record is resolved, not after. On an unverified conversation the lookup does not run at all, so there is no branch that could diverge and no timing difference between the two cases to measure. Where a record must be fetched to decide ownership, the not-yours and not-found paths converge on the same constant. The unverified refusal and the not-owned refusal are literally the same string in the source, which is deliberate: two strings that must stay identical eventually stop being identical.

Where the ownership test is drawn. A verified visitor may reach a record when the address they proved is the one on it — for a deal, the address on its contact. There is a second, weaker path that matches on an internal identifier, and it is deliberately crippled: it only fires when both sides of the comparison are known to come from the same part of the product, and it is disabled entirely once a conversation is resumed from the database, because at that point the identifier’s origin is no longer certain. An uncertain match is treated as no match. Separately, a record the conversation itself created is always reachable by that conversation — tracked on our side, not by anything the visitor could assert.

The first limit: this is a disclosure control, not a rate control.It stops the reply from telling you which records exist. It does not, by itself, stop somebody trying a great many times — that is what the per-visitor message limit and the per-conversation cap on record changes are for, and those are best-effort brakes on abuse rather than accounting controls. The systems underneath remain the authority on whether an action was valid and whether it happened once.

The second limit: prompt injection is defended, not solved. Text arriving from a visitor is screened for instruction-override, persona-hijack, prompt-extraction and exfiltration patterns in several languages, with the common obfuscations normalised away first, and a match is refused unconditionally — there is no setting for it. But this is a filter, and a filter over natural language is a layer rather than a boundary. The controls we would actually stand behind are the structural ones this page is about: a flow that can only run the blocks you drew, a workspace resolved on the server from the widget key, and an ownership test that a sentence cannot argue with.

What is written down. Every model call records the workspace, the kind of call, the model, tokens, cost, latency and how it ended — on the failing path as well as the succeeding one. Credits are reserved before the call, reconciled after it and released if the provider produced nothing. A separate stream records which blocks a conversation walked through; that one is best-effort analytics for your funnel reports and is not the billing record, and we would rather draw that distinction than let a chart imply an audit trail.

What it costs

There is no chatbot tier. The builder, every block, email verification, knowledge grounding and handover to a person are on every plan including the free one. What moves down the table is the credit allowance, and it is a number rather than a tick.

Only the blocks that call a model spend anything. A flow of questions, branches, lookups and record actions costs nothing to run at all. When you do reach for AI, a reply and a knowledge-grounded answer are one credit each and the broader retrieval block is two — so read the free plan’s fifty as about fifty AI answers a month. That pool is shared with every other AI feature in Oneop rather than reserved for chat.

See full pricing
Which AI chatbot capabilities are included on each Oneop plan
PlanVisual flow builder, all 51 blocksEmail-code identity verificationKnowledge-grounded answersHandover to a person, same conversationAI credits a month, shared with the rest of Oneop
Free $0IncludedIncludedIncludedIncluded50
Starter $19IncludedIncludedIncludedIncluded1,000
Pro $59IncludedIncludedIncludedIncluded5,000
Business $129IncludedIncludedIncludedIncluded15,000

Frequently asked

Can it actually do things, or only answer questions?

It can do things, and the distinction between the kinds of things is the part worth reading. Reading is the easy case: catalogue and stock questions need nothing, and anything attached to a person or an order needs a verified visitor. Preparing is the middle case — a captured lead, a raised ticket, a started return — where something real is created but a person picks it up, and the customer is told that in the reply rather than left to assume it was handled. Acting is the sharp end: cancelling an order, booking or moving an appointment, applying a tag that sets a workflow running. Those change your business the moment they run, so they require either signed-in staff or a visitor who has proved by email that they own that exact record, and they are capped at five per conversation in any ten minutes. One thing is refused outright and has no setting attached to it: an anonymous visitor cannot cause an invoice to be issued, in any flow you can draw.

How does it know the person it is talking to is who they say they are?

It does not take their word for it. When a flow reaches anything personal, the chatbot asks for an email address and then mails a six-digit code to it; the code expires in ten minutes, allows five attempts, and only three can be requested in a quarter of an hour. What is stored is a peppered hash, never the code, and it is compared in constant time so the comparison itself gives nothing away. The important part is where the result lives: on the conversation record on our servers, re-read from the database on every single turn. It is never read back from anything the browser sent, which means a visitor cannot arrive with a verified flag set and be believed. Two smaller behaviours sit underneath that. The chatbot only ever matches on the verified email once a conversation is resumed, because the weaker identifier match is disabled the moment its origin is uncertain; and an identifier from one part of Oneop is never accepted as an identifier from another, so a coincidence of numbering can never authorise anybody.

Will it make things up?

That depends which block you asked, and we would rather draw the line than blur it. The knowledge-answer block is the one built to hold it. It retrieves from your own content, requires the model to declare in a structured field whether the answer was actually supported by what it retrieved, and overrides that declaration to false on our side whenever nothing was retrieved at all — a model cannot claim to be grounded in an empty context. Confidence is whatever the model reported or nothing at all; it is never defaulted to a plausible-looking number. And when the answer comes back ungrounded or below your threshold, the model text is thrown away entirely and the visitor sees the fallback message you wrote. Not a hedged version of the answer. The answer, discarded. The other AI blocks are ordinary generation with your knowledge attached as context, which is useful for tone and small talk and is not the same promise — so use the knowledge-answer block for anything a customer might act on, and route its fallback to a person.

What happens when the AI call fails?

The visitor gets a short, honest message and the conversation carries on down the flow — never silence, and never an invented answer to cover the gap. Underneath that, three failures are deliberately kept apart. A model or provider failure falls back through a chain of Gemini models first and only produces the fallback message if the whole chain fails. A prompt that trips the injection filter is refused before any provider is called and before any credit is reserved, so an attack costs you nothing. And a billing stop is not disguised: if a workspace has hit its AI ceiling, that error is allowed to travel rather than being caught and shown as a chat hiccup, because a spend limit that presents as a technical glitch is how a limit gets debugged for a week instead of noticed in a minute. What none of these do is escalate to a human on their own — if you want a failed answer to reach a person, you draw that path, and we would recommend you do.

What does a person actually receive when the bot hands over?

The same conversation, not a copy of it and not a ticket about it. The row the visitor has been talking to changes state; it does not close and reopen somewhere else. What comes with it: the full transcript with both sides in it, any identity the visitor proved during the chat, every field the flow collected, the reason it escalated, and the visitor’s own profile details. The agent replies into the same thread and the customer sees it in the same window — there is no “a colleague will email you”. One thing we will not claim, because it is not there: nothing writes an AI summary of the conversation for the agent. The panel shows the escalation reason if the flow set one, and otherwise the tail of what the bot last said. If a written summary of the conversation is what you are picturing, picture the transcript instead, and set a clear escalation reason in your flow so the top of the panel is useful.

What does it cost to run?

Only the blocks that call a model cost anything. A flow made of questions, branches, lookups and record actions can answer all day without touching your credit balance, which is worth knowing before you reach for AI on every step. When you do: an AI reply and a knowledge-grounded answer are one credit each, and the broader retrieval block is two. The free plan’s fifty credits are therefore about fifty AI answers a month — enough to build something real and watch it work, not enough to run a support queue on. Two details about the meter itself: the workspace is resolved before generation, so no chatbot call can ever happen that nobody is charged for, and a call the provider fails to complete is refunded rather than billed.

How is this different from an AI agent?

Direction and audience. The chatbot faces your customers and follows a flow you drew, which is exactly what you want on a public website: the same question walks the same path every time, and you can point at the step that produced any answer. An agent faces your own team, is started by one of your people, and chooses its own path through a set of tools you granted it until it finishes or hits a ceiling. The chatbot is bounded by its diagram; an agent is bounded by published limits precisely because it has no diagram. They also sit at different risk levels for the same reason this page spends so long on identity: anyone on the internet can open the chatbot, and only your staff can start an agent. Most teams run both, and the rules that constrain them — one workspace, redaction before the model, credits reserved before generation, evidence written either way — are the same rules.

Put it on a real page and try to break it.

Build a flow that looks up an order, then ask it about an order that is not yours. That is a five-minute test and it tells you more about a chatbot than any feature list will. Or book a walkthrough and we will run the verification challenge, a refused action and a live handover in front of you.

Free forever · 2 seats · No credit card