Define your own signals on top of the 47 we ship.
Mama ships 47 built-in buying signals across 5 categories. Custom signals let you add your own — anything you can express as a SQL query over your warehouse, a webhook payload, or a CRM field change. Available on Pro plan.
Three ways to define a custom signal.
1 · SQL signal (warehouse)
If your warehouse is connected via Snowflake, BigQuery, or Redshift, write any SQL query that returns account_domain, signal_strength, fired_at. Mama runs it nightly and creates a signal record per row.
-- Custom signal: "account opened our pricing page 3+ times in 7 days"
SELECT
account_domain,
COUNT(*) AS visit_count,
CASE
WHEN COUNT(*) >= 8 THEN 5 -- strength: 5 (very strong)
WHEN COUNT(*) >= 5 THEN 4
WHEN COUNT(*) >= 3 THEN 3
ELSE 0 -- not strong enough; skip
END AS signal_strength,
MAX(visited_at) AS fired_at
FROM web_visits
WHERE page_path = '/pricing'
AND visited_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY account_domain
HAVING COUNT(*) >= 3;
2 · Webhook signal
Post to https://api.signalmama.com/v1/signals/custom with a JSON payload. Use this when the source-of-truth lives in a tool that's not in your warehouse (intercom, Customer.io, internal system).
{
"signal_type": "expansion_intent",
"account_domain": "acme.co",
"strength": 4,
"fired_at": "2026-05-25T14:12:00Z",
"source_url": "https://internal-tool.com/event/123",
"metadata": {
"trigger": "added 3rd seat",
"csm_owner": "[email protected]"
}
}
3 · CRM-field signal
If your CRM is connected (HubSpot, Salesforce, Pipedrive), define a signal as "this field changed to this value" or "this field crossed this threshold." Configured in Settings → Custom signals → CRM trigger. No code.
How custom signals show up.
In the brief: labeled "Custom signal · <your-name>" with the strength score and source URL. Same first-class status as built-in signals.
In the ICP rubric: custom signals contribute to the signal-strength dimension by default; you can reweight or create a separate rubric dimension for them.
In webhooks: they fire signal.fired webhooks just like built-ins. See /api/webhooks.
Anti-patterns.
- Don't define a signal that fires on every account. If it fires constantly, it isn't a signal — it's noise. Filter to the top 5-10% of strength.
- Don't reinvent a built-in. Check the built-in signal catalog first. Many "custom" signals are just our funding/hiring/tech-change signals filtered differently.
- Don't skip recency decay. A custom signal that fired 90 days ago shouldn't have the same weight as one from yesterday. Use
fired_at+ Mama's per-signal-type half-life setting.