zend.shzend.sh
Campaign logic
Build workflows with three step types — email, delay, and condition. Branch on reply, open, click, or inaction. Test multiple variants per step. The sequence engine runs all of it without cron jobs or custom code.
Multi-step sequences
Chain email steps, delay steps (hours or days), and condition steps into any workflow.
A/B variant testing
Test multiple subject lines and body copy per step. Weighted distribution. Pick the winner by reply rate.
Condition branching
If replied → stop. If opened but not replied → follow up. If no open after 3 days → try a different angle. All automatic.
Scheduling & rotation
Send during business hours in the recipient's local timezone. Distribute load across mailboxes using the rotation strategy that fits your infrastructure — health-weighted, round-robin, least-used, or random. Randomized send delays ensure nothing looks robotic.
Timezone-aware scheduling
Send within business hours in the recipient's timezone. Configure send windows per campaign — days, hours, timezone.
4 rotation strategies
Round-robin, health-weighted, least-used, or random. Health-weighted automatically favors your best-performing mailboxes.
Randomized delays
Random intervals between sends. No predictable patterns. Looks human to inbox providers.
Compliance
Variable substitution, suppression enforcement, and webhook events are built into every campaign — not optional add-ons. CAN-SPAM compliance requires suppression and unsubscribe handling; both run at the worker layer before every send.
Variable substitution (Handlebars)
{{first_name}}, {{company}}, nested custom fields. Missing variables render empty — never crash, never expose raw tokens.
Suppression enforcement
Global suppression list checked at the worker layer before every send. Bounced, unsubscribed, and complained contacts are never contacted again.
Webhook events
email.sent, email.replied, email.bounced, lead.completed, lead.unsubscribed. HMAC-signed. Retry with exponential backoff.
A condition step evaluates a trigger — for example, 'did the recipient reply to step 2?' — and routes the lead to a different sequence branch based on the answer. Common patterns: reply → stop sequence; open but no reply → send follow-up; no open after N days → try a shorter subject line. Conditions run at the worker layer automatically.
Four strategies: round-robin (equal distribution across connected mailboxes), health-weighted (mailboxes with higher health scores get more volume), least-used (balances total send count), and random. Health-weighted is the default recommendation for most use cases — it automatically shifts load away from mailboxes that are warming up or recovering.
CAN-SPAM compliance is enforced at the infrastructure level. Unsubscribe requests are processed immediately and written to the global suppression list. That list is checked before every send — not at campaign creation, but at worker-layer dispatch. Bounced and complained contacts are added automatically. You still need a physical mailing address in your emails (a legal requirement we cannot enforce for you).