Documentation

Everything Signum does, written down.

Start with Quick Start. Agents in depth when writing rules. API and webhooks at the end.

Quick start

Five minutes from zero to your first tracked email.

  1. Visit signum.email, click Start free. Sign in with Google.
  2. Grant Gmail permissions — full scope list on the Security page.
  3. First-run wizard: name your workspace → install Chrome extension → return to Gmail.
  4. Compose an email. The Signum Track pill is on by default.
  5. 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: AUTOWATCH or IGNORE. 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: WatchedThread row 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. Honor Retry-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.sent
  • email.opened (carries verdict tag)
  • email.clicked
  • email.replied
  • followup.step.sent
  • followup.step.skipped
  • followup.completed
  • followup.cancelled
  • watcher.triggered
  • watched-thread.closed
  • reminder.fired
  • reminder.auto_dismissed
  • contact.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 /console shows 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