Outvelo
Changelog
New

Personalize with your own variables

Use any detail you have about a lead, not just their name and company.

Until now personalization meant the fields we already hold about a lead: first name, company, job title, location. Useful, and the same fields every other tool has, which is why a message built only from them reads like it was built only from them.

Custom variables let you personalize on anything you know. A funding round, a recent hire, a product launch, a line you wrote yourself after looking at their profile. You define the variable, you supply the value per lead, and the message renders it at send time.

How it works

  • Create a variable under Settings, Custom variables. Give it a name like recent_funding.
  • Give each lead its value. As a column in your CSV when you import, through the API, or by typing it straight into the lead list or a prospect row.
  • Reference it in any message with double braces.
  • Set a default value so a lead missing that detail still gets a sentence that reads properly, instead of a gap where the personalization should be.
congrats on the {{recent_funding}} round

  Jane   ->  congrats on the Series B, $40M round
  Marcus ->  congrats on the Seed, $3M round

You supply the values

Worth being explicit, because it is the thing people assume otherwise: writing {{recent_funding}} in a message does not make Outvelo go and find the funding. Outvelo does not source leads and does not enrich them. The variable renders whatever value you put against that lead, and nothing if you put nothing.

That is also why defaults matter. A half-filled list is normal, and a default is what stops the leads you have no value for from receiving a broken sentence.

Filling them in with an AI agent

If you use Claude or Codex, you can connect Outvelo as an MCP server and have the agent do the filling in.

The lead sourcing and enrichment come from whatever other MCPs you already have connected in that agent. Claude reads the context those provide, writes a personalized value for each of your variables, and pushes the leads into an Outvelo campaign with the values already attached. Outvelo is the destination in that loop, not the data source.

Or make the whole message a variable

A variable does not have to be a phrase inside a sentence. It can be the entire message.

Set your step body to a single variable and every lead receives whatever text you put against them. This is what you want when an agent, or you, has written a different opener per lead rather than one template with a few slots in it. The step still behaves normally in every other way: delays, A/Z variants and branches all work the same.

The step's fallback message covers the gaps. If a lead has no value, they get the fallback rather than an empty send, so a list where only some leads got a written opener is still safe to launch.

One limit to know: a value is capped at 500 characters and anything longer is stored cut. That is comfortably above LinkedIn's 300 character limit for connection request notes, but it is worth watching if you are generating long messages. The API and the MCP tools name any variable they had to shorten, so you find out at import time rather than from a prospect who received half a sentence.

step body:  {{opener}}

  Jane   ->  Saw Northwind shipped the incident review tool last month.
             How are you handling on-call reporting today?
  Marcus ->  Your post on attribution windows matched what we keep
             hearing from growth teams. Worth comparing notes?

Renaming and removing

Renaming a variable is safe at any size. The name is a label, and your messages and stored values reference the variable itself, so a rename changes one record and running campaigns carry on sending exactly as before.

Deleting one tells you first which campaigns use it, refuses if a live campaign still references it, and offers to repoint those messages at another variable instead. Values already stored on your leads are kept, so re-creating a variable brings the personalization back.

Writing about the syntax

If you ever need literal braces in a message, put a backslash in front and they send as text instead of being treated as a variable.

\{{example}}  sends as  {{example}}

This is live in Outvelo today

On every plan, no add-on.

Start free