Skip to content
TechFabric
Canvass

Agentic GTM · Our own product

Building Canvass for account research and campaign review

Canvass brings account research and campaign review into a Cloudflare application. The workflow keeps campaign preparation, approval and delivery states distinct.

Production

Cloudflare application

Per-tenant

Isolation enforced in the data layer

Every send

Revalidated at delivery

Client
Canvass
Sector
Agentic GTM · Our own product
Stack
CloudflarePostgreSQLTechFabric PlatformTemporal

Challenge

If an agent sends a bad email to one of their prospects, they lose the prospect

Canvass runs a client's outbound, which is a harder constraint than a dashboard nobody acts on. The cost of a wrong action lands on their pipeline the same week, and it is their name on the email.

Drafting a plausible email is the part that demos well, and most demos stop there. It was maybe a fifth of the work.

The rest is everything that has to be true on the hundredth day. A pass can run for hours, and if it dies halfway a contact can be marked as messaged when nothing went out, or messaged twice because a retry lost its place. Both are worse than never running at all.

An agent whose memory is a context window forgets an account between runs and relearns it badly, which is how a system ends up introducing itself twice. Approval gates that a deployment resets are decoration. And ten minutes is long enough for an account to be marked do-not-contact between a human approving a send and the send going out.

Strategy

Enforce in the pipeline, because a prompt is not a control

Asking a model to behave is not a governance mechanism. Every rule that matters had to live somewhere the agent can't reason its way around, which means the workflow engine, the data layer, or the permission model.

The second decision was to gate every outbound action on a person until the evidence said otherwise. A system somebody depends on commercially gets tested by consequences rather than by a demo script.

Solution

Signals in, judgement under policy, a person on the switch

Durability. Every production domain mutation is a Temporal workflow. One pass is one workflow execution, and sense, judge, draft and resolve are activities inside it, so a step that fails at three in the morning picks up where it stopped and afterwards you can read exactly what happened.

Two details in that carry most of the safety. Retry policy comes from whether the action is idempotent, so a send is never blindly retried. An email that may or may not have gone out is a question you answer by looking at what happened, and a system that answers it by trying again will eventually mail somebody twice.

The human approval gate is the second. It is a durable wait on a signal, with an expiry that kills a draft nobody looked at, so a draft can sit for a day and the workflow is still the thing holding it. The usual version of this is a status column and a job that sweeps it, which works until the sweep is what fails.

The activities call the same in-process action pipeline the console does, so policy, the state machine and the audit trail all apply unchanged. Temporal wraps durability and observability around the governed pipeline instead of opening a second way through it, and a second way through is how governance quietly stops being true.

Governed autonomy. Routine actions run on their own. Publishing, launching and sending need a tenant-issued grant scoped to the capability, which expires, and every send is revalidated at the moment it goes out whatever was true when it was approved.

Memory that outlives the process. Account state sits in PostgreSQL, so the system knows an account between runs.

Isolation. Reads verify organization membership and use a tenant-scoped store. Governed actions carry the tenant and actor through the policy and execution path.

Approval that survives a deploy. A workflow can wait days for a human signal and resume from exactly where it paused.

The production application now runs on Cloudflare with PostgreSQL and Temporal. TechFabric Platform carries the tenant and actor through policy checks, execution and audit. The earlier Databricks deployment remains part of the implementation history.

Results

A production agent under real commercial pressure, and a pattern that transfers

Canvass runs a real pipeline in production. When a buyer asks whether we have actually put one of these into production, the answer is a running system with a client's revenue attached to it.

The shape generalises. Swap outbound for claims triage, underwriting review or contract intake and the architecture holds: signals in, judgement under policy, durable execution, an audit trail, and a person holding the switch on anything that leaves the building. It is the same pattern we bring to every engagement, proven where a mistake costs somebody their pipeline.