VxCloud
Docs/Guides/SalesShift
✉️SalesShift

One tracked email, end to end

SalesShift sends through a mailbox you own, not a platform account you rent capacity from. Connect it once, and the same credential that runs vxcli sends the mail.

15 minBeginnerSalesShiftEmailBYOKTracking
Pick how you want to follow along

In the dashboard (UI)

Everything here lives in the SalesShift web app. You need two things before the first send: a mailbox connected under Settings, and a contact to send to. A lead is not a contact — that distinction costs people their sending domain, so it is the first thing this guide pins down.

1

Connect a mailbox (this is the BYOK step)

Open Settings → Integrations. Add an integration of type email — either a plain IMAP/SMTP mailbox (host, port, username, password) or an OAuth mailbox. The credential is written into your workspace Vault; Postgres keeps only the metadata row (provider, active flag, the Vault path, and when it was last tested). Nothing about your password is stored in the database.

  • The integration list is exactly what the org has connected — the same rows GET /api/v1/salesshift/settings/integrations returns, grouped by type: email, AI, payment.
  • Use the per-integration Test action after saving. It reads the credential back out of Vault and uses it against the provider for real. A Vault round-trip on its own proves nothing about whether the host, port or password still work.
Tip: If you plan to use the AI drafting features later, that is a second, separate integration of type AI — and until an org has one, the AI endpoints return a partial result rather than inventing text. BYOK means a feature is only as present as its key.
2

Check the email worker before you send anything

Outbound mail does not go out from the control plane — it goes through a Go worker running on your tenant node, the same node vxcli node current reports. Confirm it is up and which providers it has: the health endpoint reports status, the provider list, whether Redis is connected, and the per-domain rate limit in messages per minute.

# The one SalesShift call that does not carry a credential — it is a
# plain GET against your own node.
vxcli salesshift worker health

# Node             https://node1.vxcloud.io
# Status           healthy
# Providers        [smtp]
# Redis            true
# Domain rate/min  20
3

Understand what you are allowed to send to

SalesShift has three kinds of person record and only one of them is mailable. A pool person is a row in the global prospect pool. Their address comes back masked — j•••@acme.com — until your organization spends a metered reveal on it. A saved lead is a snapshot of a pool person copied into your org. Still not mailable. A contact is a CRM record. Converting a lead is what creates one, and conversion is where consent metadata is written. Only a contact address goes into a send.

  • has_email tells you an address exists. email_revealed tells you whether you may see it. They are different questions.
  • The Python and Go bindings refuse a masked address on the send path outright, rather than let it reach a real domain. Do the same in your own scripts.
Tip: A scraped record entering a send path is how a tenant's sending domain dies. If you are testing, send to a mailbox you own — not to a pool row you just revealed.
4

Create or pick a contact

Open Contacts. Either create one directly, or convert a lead: from Leads → Pool, open a person, reveal them (this spends one from your metered allowance), then convert. Conversion is idempotent — a lead that already has a contact reports the existing contact id rather than creating a second one.

5

Send the email

From the contact record, compose and send. The send goes through the same engine sequences use, in this order: suppression gate → per-mailbox daily cap and warmup ramp → the tenant node worker → tracking pixel and click rewriting → the event stream. A suppressed or unsubscribed recipient is rejected, and that gate is not optional.

  • Merge tags such as {{first_name}} resolve against the contact record, in both the subject and the body.
  • The response names the provider that actually carried the message — node-smtp, smtp, sendgrid, mailgun, platform or sink — plus a tracking id.
6

Read the engagement back

Two places show what happened. The email list shows every tracked outbound message with its status, open count and click count. The Conversations view shows the full thread with one contact — every tracked send plus any captured reply. Reply detection runs an IMAP pass roughly every five minutes, so a reply takes a few minutes to appear.

Tip: Open tracking is a pixel. Corporate mail scanners and image proxies fetch it, so an open is evidence of delivery to a mailbox, not proof a human read it. Replies are the signal worth optimising for.
7

Confirm at the org level

The dashboard counters roll everything up: contacts, companies, open deals, active sequences, and the email funnel — sent, delivered, opened, replied, bounced. It is the fastest way to confirm your first send actually registered.

Stuck halfway through? Email [email protected] — most replies land within an hour during weekdays.

All guides

Was this page helpful?