Quick start
Five minutes from zero to your first tracked email.
- Visit signum.email, click Start free. Sign in with Google.
- Grant Gmail permissions — full scope list on the Security page.
- First-run wizard: name your workspace → install Chrome extension → return to Gmail.
- Compose an email. The Signum Track pill is on by default.
- Send. Within seconds the event lands at
app.signum.email/mails.
Concepts
Workspaces · users · roles
A workspace is the top-level container — own settings, billing, contacts, templates, rules.
A user is a Google-authed person with a workspace-membership role:
OWNER— full control. One per workspace.ADMIN— everything except billing and deletion.MEMBER— day-to-day use.VIEWER— read-only.
The agent model
Each agent does one narrow thing on rules you write, with every action visible:
- Watcher tags inbound threads matching rules.
- Followup sends scheduled sequences that skip on engagement.
- Remind wakes you up on cold threads.
- Track confirms opens per recipient with a pixel plus six bot layers.
Engagement score
0–100 per recipient per send. Default weights (configurable):
- Direct pixel HUMAN: 20pt · GMAIL_PROXY (real open via Google’s proxy): 15pt · MPP_PROXY (Apple pre-fetch): excluded · BOT: 0pt
- First link click HUMAN: 45pt (additional clicks add up to a cap)
- Document open / engaged / revisit: bonus points
- Honeypot: discounts the scanner burst it fired in — does not zero the recipient
There is deliberately no “Gmail-API read” tier: the Gmail API can only see the sender’s own mailbox, never the recipient’s open, so we don’t claim it. Caps at 100.
Verdicts
HUMAN— all six bot layers green. Full weight.MPP_PROXY— Apple Mail Privacy Protection fingerprint. Partial.GMAIL_PROXY— Gmail image proxy without follow-on. Reduced.PIXEL_PROXY— proxy of indeterminate origin. Partial.BOT— decisively failed. Zero.
Agents in detail
Watcher
Rule engine for inbound Gmail. Each Watcher has an ordered rule list.
Rule structure
- Conditions:
from-exact,from-domain,from-contains,subject-contains,subject-regex,body-contains,header-matches. AND within rule, OR across rules. - Action:
AUTOWATCHorIGNORE. IGNORE wins. - Attached reminder: optional saved Remind pattern on AUTOWATCH match.
Lifecycle
- Inbound via Gmail Pub/Sub push (polling fallback).
- Rules run in position; first match wins.
- On AUTOWATCH:
WatchedThreadrow created,source = AUTO_WATCHER. - Optional Reminder chain inserts.
- On reply (any client): auto-closes, reminder cancels.
Dedup
(thread, watcher) pair fires once per 24h.
Followup
Engagement-aware sequences per recipient.
Rule structure
- Ordered steps with
offset_hours, subject template, body template, optional condition. - Reply mode:
REPLY_TO_LAST·NEW_THREAD·SAME_THREAD. - Engagement threshold: 0–100, default 30.
- isDefault: TRUE = auto-attaches to every tracked send.
Lifecycle
- On attach: all steps scheduled at once via pg-boss.
- At fire time: worker pulls engagement and reply state.
- Engaged > threshold OR replied → sequence completes.
- Else: body sent via Gmail API in configured reply mode.
Remind
Conditional reminder chains anchored to Gmail threads.
Pattern structure
- 1–10 offsets in min/hr/day; free-text label.
Reminder structure
fire_at,note,source(MANUAL / AUTO_WATCHER / FOLLOWUP_FALLBACK).state: PENDING → FIRED / DROPPED / DISMISSED / AUTO_DISMISSED.
Auto-dismiss: any reply from any client cancels the whole chain.
Track
Substrate for the other agents. Per-recipient pixel × six bot layers.
Signals
- Pixel — 1×1 embedded image, one per recipient (so you see who opened).
- Click — wrapped links via pixel-worker.
- Honeypot — hidden bait resources catching scanners.
- Document — tracked attachments report per-page view time.
Bot layers
UA blocklist · Cloudflare bot score · header heuristics · IP class · timing · honeypot correlation.
Surfaces
Chrome extension
Install from Chrome Web Store. Auto-updates.
- Thread pills — Track / Watch / Reminder / Followup on every open thread.
- Compose carets — Track, Followup-attach, Schedule-send toggles.
- Inbox eye — row-level engagement on sent folder.
- Floater — persistent panel: Watching / Followups / Reminders.
- Template insertion — slash-commands for saved blocks.
Gmail add-on
Install from Workspace Marketplace. Works in Gmail mobile + web.
- Reading-side card: thread status.
- Compose-side card: recent engagement on the recipient.
- Quick actions: Watch · Remind · Follow up.
Dashboard
Web app at app.signum.email.
/— today's engagement at a glance./mails— all tracked sends./emails/[id]— single send with full signal trace./agents— active sequences, reminders, watches./cohorts— recipient cohorts and contacts./compose— send from dashboard./billing— plan, usage, invoices./console— settings, integrations, API keys, audit log.
Sending email
Compose with tracking
Track caret has three states: On (default), Off, Per-recipient.
Followup caret attaches a saved rule. Schedule caret schedules the send.
Bulk mailing
Dashboard Compose → paste/upload CSV (email + optional merge tags).
Per-tier caps: Free 25 · Basic 100 · Standard 250 · Premium 500.
Respects Gmail send limits (~500/day free, ~2,000/day Workspace).
Suppression list auto-skips opted-out recipients with visible count.
Templates
Saved compose blocks. Reusable in dashboard Compose, extension slash-command, Followup step bodies.
Merge tags
{{first_name}}·{{last_name}}·{{full_name}}{{company}}·{{title}}{{custom.<field_name>}}— any custom contact field.{{sender.first_name}}·{{sender.signature}}{{today}}·{{day_of_week}}
Missing-tag handling: configurable. Default skips silently (empty string substituted).
Data
Contacts and cohorts
Auto-created on first send; bulk-uploadable via CSV.
Cohorts are saved queries — recomputed on every read, no manual refresh.
Analytics
- Per-email: signal trace, verdict per event, weight contribution.
- Per-recipient: rolling engagement across all sends.
- Per-cohort: funnel — sent / opened HUMAN / clicked / replied.
Suppression list
Per workspace. Auto-added on List-Unsubscribe click or footer opt-out. Manually addable. Exportable as CSV.
Export and deletion
Settings → Data → Export. Signed JSON archive with contacts, sends, events, rules.
Account deletion: 30-day delete window for sender data; recipient tracking anonymized.
API reference
Base URL: https://api.signum.email/v1. JSON in, JSON out.
Authentication
Generate an API key from Console → API Keys. Pass as bearer:
GET /v1/emails Host: api.signum.email Authorization: Bearer sk_live_AbCdEf...
Token scopes: READ-ONLY · READ-WRITE · ADMIN. Optional IP allowlist.
Rate limits
- Free: 60 req/min
- Basic: 240 req/min
- Standard: 600 req/min
- Premium: 1,200 req/min
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Over limit: 429 with Retry-After.
Resources
Emails
GET /v1/emails # list, paginated GET /v1/emails/:id # single + signal trace POST /v1/emails # register an outbound (rare) DELETE /v1/emails/:id
Contacts
GET /v1/contacts GET /v1/contacts/:id POST /v1/contacts # upsert by email PATCH /v1/contacts/:id DELETE /v1/contacts/:id POST /v1/contacts/import # bulk CSV/JSON POST /v1/contacts/:id/suppress
Followups
GET /v1/followups POST /v1/followups/:id/pause POST /v1/followups/:id/resume POST /v1/followups/:id/cancel GET /v1/followup-rules POST /v1/followup-rules PATCH /v1/followup-rules/:id
Reminders
GET /v1/reminders POST /v1/reminders # apply pattern to thread PATCH /v1/reminders/:id # snooze DELETE /v1/reminders/:id # drop chain GET /v1/reminder-patterns POST /v1/reminder-patterns
Watchers
GET /v1/watchers POST /v1/watchers GET /v1/watchers/:id/rules POST /v1/watchers/:id/rules GET /v1/watched-threads POST /v1/watched-threads # manual watch DELETE /v1/watched-threads/:id
Error codes
Errors: { "error": { "code": "...", "message": "...", "details": {...} } }
400 invalid_request— malformed JSON or missing required field.401 unauthenticated— missing/invalid API key.403 forbidden— key lacks scope.404 not_found— resource doesn't exist for this workspace.409 conflict— write conflict (e.g. cancelling completed sequence).422 plan_limit— plan limit reached (details: limit + current count).429 rate_limited— too many requests. HonorRetry-After.500 internal— unexpected. Auto-reported; safe to retry with backoff.503 unavailable— service degraded.
Webhooks
Setup
Console → Webhooks → New endpoint. Provide URL + select events. Signum returns a webhook secret (display once only).
Event types
email.sentemail.opened(carries verdict tag)email.clickedemail.repliedfollowup.step.sentfollowup.step.skippedfollowup.completedfollowup.cancelledwatcher.triggeredwatched-thread.closedreminder.firedreminder.auto_dismissedcontact.suppressed
Each delivery is a POST with JSON body:
{
"id": "evt_01HV...",
"type": "email.opened",
"created_at": "2026-06-28T14:23:11Z",
"workspace": "ws_abc123",
"data": {
"email_id": "em_xyz789",
"recipient": "[email protected]",
"verdict": "HUMAN",
"score": 20,
"signal": "PIXEL"
}
}Signature verification
Every delivery carries X-Signum-Signature: HMAC-SHA256 of the raw body, hex-encoded, using your webhook secret.
const sig = req.headers['x-signum-signature'];
const computed = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (sig !== computed) return res.status(401).end();Use constant-time comparison in production.
Retries
Failed deliveries retry with exponential backoff over 24 hours: +30s, +2m, +10m, +30m, +1h, +3h, +6h, +12h, +24h.
After 24 hours of failures, the delivery is marked permanently failed. Endpoint health is visible in Console.
Troubleshooting
Extension pills don't appear in Gmail
- Reload the extension at
chrome://extensions→ Signum → Reload. - Hard-reload Gmail (Ctrl-Shift-R) — Gmail caches the DOM heavily.
- Check that you're signed in to the extension (click the toolbar icon).
- Confirm your Google account matches the workspace you expect.
Tracked email shows zero opens, but the recipient definitely read it
- Image-blocking client (Outlook desktop default, some Gmail settings) — pixel won't load.
- Network-level pixel block (corporate firewall).
- Check the signal trace at
/emails/[id]for click, Gmail-API, document signals — pixel isn't the only path.
All my opens are MPP_PROXY
- Your recipient base is iCloud / Apple Mail-heavy. Expected behavior — Apple MPP pre-fetches every pixel.
- Pivot to click and document signals as your engagement proxy.
Followup step didn't send
- Check the sequence state at
/agents— did it transition to COMPLETED before this step? - Check Gmail send quotas — Gmail blocks at ~500/day free, ~2,000/day Workspace.
- Confirm the rule's reply mode matches what you wanted.
- Audit log at
/consoleshows the worker decision per step.
Reminder fired even though I replied
- You replied from a non-Gmail client that doesn't sync to Gmail's thread state.
- You sent the reply, then Gmail Pub/Sub took a few minutes to deliver.
- Your reply was to a different thread (subject changed, etc.).
Webhook deliveries failing
- Check Console → Webhooks → endpoint health.
- Confirm your endpoint returns 2xx within 5 seconds.
- Validate signature with constant-time comparison.
API returns 401
- Token revoked or expired. Generate a new one.
- IP allowlist mismatch — check your client's egress IP.
- Bearer prefix missing in Authorization header.
FAQ
Does Signum work with non-Gmail providers?
No. Gmail-only for now. Outlook / Microsoft 365 is on the longer-term roadmap.
Can I use my own SMTP / Postmark / SendGrid?
No. All sends route through your authenticated Gmail account via the Gmail API.
Does the recipient see I'm tracking?
The tracking pixel is invisible (1×1 transparent). No footer is added by default. You can configure an opt-out link in your signature — recommended where required by law.
Will I get blocked for sending too much?
Signum respects Gmail's own send limits. We don't increase your sending capacity; we just instrument the sends you're already authorized to make.
Is Signum compliant with GDPR / DPDP?
Technical posture documented on the Security page. We provide the tooling for sender-side compliance (consent collection, opt-out, DSARs). Compliance is a joint responsibility — see the Privacy Policy.
Can I export my data?
Yes — signed JSON archive from Settings → Data → Export Workspace Data.
What happens to my data on cancellation?
Drops to Free tier; data preserved. Hard-delete the workspace to delete everything within 30 days.
Does Signum train AI on my emails?
No. Email content is not used to train any model, ours or anyone else's.
Can I run Signum self-hosted?
Not currently. The product is a managed service.
Is there an API trial?
Yes — Free tier includes API access at 60 req/min. Sufficient for prototyping.
Changelog
The full changelog — what we’ve shipped, when — lives at signum.email/changelog. Per-commit history at github.com/AxiomTechLab/Signum/commits/main.
Billing and account
Live at app.signum.email/billing. Current plan, renewal date, usage counters, downloadable invoices.
Switching plans
Upgrades prorated, take effect immediately. Downgrades take effect at next billing cycle.
Cancellation
Billing → Cancel subscription. Drops to Free at end of period. Data preserved indefinitely on Free.
Account deletion
Settings → Account → Delete workspace. Sender data deleted within 30 days; recipient tracking anonymized for billing reconciliation.
Anything missing?
Docs are kept honest by usage. Searched for something you didn't find? Write to [email protected] and we'll add it.
Try it free