{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"crm-pipeline","type":"registry:block","title":"CRM Pipeline","description":"Companies, people and deals: related databases with a board and a pipeline chart.","author":"Notion Arena","categories":["business"],"tags":["native","pro","crm","sales","pipeline","database","rollup"],"meta":{"kind":"native","tier":"pro","version":"2.1.0","updatedAt":"2026-10-07","notionPlan":"Plus","emoji":"💼","delivery":["api","duplicate","guide"],"capabilities":{"interactive":false,"offlineSafe":true,"persistsLocally":false,"writesToNotion":true,"needsNetwork":false},"recipe":"crm-pipeline","installUrl":"https://notionarena.vercel.app/api/install"},"files":[{"path":"recipes/crm-pipeline.json","type":"registry:file","target":"notion/recipes/crm-pipeline.json","content":"{\n  \"$schema\": \"https://notionarena.vercel.app/r/schema.json\",\n  \"notionVersion\": \"2026-03-11\",\n  \"id\": \"crm-pipeline\",\n  \"summary\": \"Companies, People and Deals as three related data sources, with stage rollups, a weighted-value chart and a dashboard that assembles them.\",\n  \"databases\": [\n    {\n      \"ref\": \"companies\",\n      \"title\": \"Companies\",\n      \"icon\": \"🏢\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Website\": {\n          \"url\": {}\n        },\n        \"Industry\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Software\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Services\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Retail\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Finance\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Healthcare\",\n                \"color\": \"pink\"\n              },\n              {\n                \"name\": \"Other\",\n                \"color\": \"gray\"\n              }\n            ]\n          }\n        },\n        \"Segment\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"SMB\",\n                \"color\": \"gray\"\n              },\n              {\n                \"name\": \"Mid-market\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Enterprise\",\n                \"color\": \"purple\"\n              }\n            ]\n          }\n        },\n        \"Employee count\": {\n          \"number\": {\n            \"format\": \"number\"\n          }\n        },\n        \"Account owner\": {\n          \"people\": {}\n        },\n        \"Health\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Healthy\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"At risk\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Critical\",\n                \"color\": \"red\"\n              }\n            ]\n          }\n        },\n        \"Next touch\": {\n          \"date\": {}\n        },\n        \"Notes\": {\n          \"rich_text\": {}\n        },\n        \"People\": {\n          \"relation\": {\n            \"type\": \"dual_property\",\n            \"dual_property\": {\n              \"synced_property_name\": \"Company\"\n            }\n          },\n          \"__relationRef\": \"people\"\n        },\n        \"Deals\": {\n          \"relation\": {\n            \"type\": \"dual_property\",\n            \"dual_property\": {\n              \"synced_property_name\": \"Company\"\n            }\n          },\n          \"__relationRef\": \"deals\"\n        },\n        \"Open pipeline\": {\n          \"rollup\": {\n            \"relation_property_name\": \"Deals\",\n            \"rollup_property_name\": \"Value\",\n            \"function\": \"sum\"\n          },\n          \"description\": \"Sum of every deal value at this company.\"\n        },\n        \"Closed won\": {\n          \"rollup\": {\n            \"relation_property_name\": \"Won deals\",\n            \"rollup_property_name\": \"Value\",\n            \"function\": \"sum\"\n          }\n        },\n        \"Lifetime value\": {\n          \"formula\": {\n            \"expression\": \"prop(\\\"Closed won\\\")\"\n          },\n          \"description\": \"Replace with the Closed won rollup once the filtered relation exists.\"\n        },\n        \"Days since touch\": {\n          \"formula\": {\n            \"expression\": \"if(empty(prop(\\\"Next touch\\\")), 999, dateBetween(now(), prop(\\\"Next touch\\\"), \\\"days\\\"))\"\n          }\n        },\n        \"Created\": {\n          \"created_time\": {}\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Northwind Logistics\",\n          \"props\": {\n            \"Industry\": \"Services\",\n            \"Segment\": \"Mid-market\",\n            \"Employee count\": 240\n          }\n        },\n        {\n          \"name\": \"Kestrel Labs\",\n          \"props\": {\n            \"Industry\": \"Software\",\n            \"Segment\": \"SMB\",\n            \"Employee count\": 32\n          }\n        },\n        {\n          \"name\": \"Aurelia Health\",\n          \"props\": {\n            \"Industry\": \"Healthcare\",\n            \"Segment\": \"Enterprise\",\n            \"Employee count\": 5400\n          }\n        }\n      ]\n    },\n    {\n      \"ref\": \"people\",\n      \"title\": \"People\",\n      \"icon\": \"👤\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Job title\": {\n          \"rich_text\": {}\n        },\n        \"Email\": {\n          \"email\": {}\n        },\n        \"Phone\": {\n          \"phone_number\": {}\n        },\n        \"Decision maker\": {\n          \"checkbox\": {}\n        },\n        \"Champion\": {\n          \"checkbox\": {}\n        },\n        \"Company\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"companies\"\n        },\n        \"Last contact\": {\n          \"date\": {}\n        },\n        \"Channels\": {\n          \"multi_select\": {\n            \"options\": [\n              {\n                \"name\": \"Email\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Call\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"LinkedIn\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Event\",\n                \"color\": \"yellow\"\n              }\n            ]\n          }\n        },\n        \"Added by\": {\n          \"created_by\": {}\n        },\n        \"Days quiet\": {\n          \"formula\": {\n            \"expression\": \"if(empty(prop(\\\"Last contact\\\")), 0, dateBetween(now(), prop(\\\"Last contact\\\"), \\\"days\\\"))\"\n          }\n        },\n        \"Follow up\": {\n          \"formula\": {\n            \"expression\": \"ifs(prop(\\\"Days quiet\\\") > 30, \\\"🔴 Overdue\\\", prop(\\\"Days quiet\\\") > 14, \\\"🟡 Soon\\\", true, \\\"🟢 Fresh\\\")\"\n          }\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Dana Whitfield\",\n          \"props\": {\n            \"Job title\": \"Head of Operations\",\n            \"Decision maker\": true\n          }\n        },\n        {\n          \"name\": \"Omar Haddad\",\n          \"props\": {\n            \"Job title\": \"CTO\",\n            \"Champion\": true\n          }\n        }\n      ]\n    },\n    {\n      \"ref\": \"deals\",\n      \"title\": \"Deals\",\n      \"icon\": \"💰\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Deal ID\": {\n          \"unique_id\": {\n            \"prefix\": \"DL\"\n          }\n        },\n        \"Stage\": {\n          \"status\": {\n            \"options\": [\n              {\n                \"name\": \"Lead\",\n                \"color\": \"gray\",\n                \"group\": \"To-do\"\n              },\n              {\n                \"name\": \"Qualified\",\n                \"color\": \"blue\",\n                \"group\": \"To-do\"\n              },\n              {\n                \"name\": \"Demo given\",\n                \"color\": \"blue\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Proposal out\",\n                \"color\": \"yellow\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Negotiation\",\n                \"color\": \"orange\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Won\",\n                \"color\": \"green\",\n                \"group\": \"Complete\"\n              },\n              {\n                \"name\": \"Lost\",\n                \"color\": \"red\",\n                \"group\": \"Complete\"\n              }\n            ]\n          }\n        },\n        \"Value\": {\n          \"number\": {\n            \"format\": \"dollar\"\n          }\n        },\n        \"Currency\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"USD\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"EUR\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"GBP\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"PKR\",\n                \"color\": \"yellow\"\n              }\n            ]\n          }\n        },\n        \"Probability\": {\n          \"number\": {\n            \"format\": \"percent\"\n          }\n        },\n        \"Expected close\": {\n          \"date\": {}\n        },\n        \"Owner\": {\n          \"people\": {}\n        },\n        \"Company\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"companies\"\n        },\n        \"Primary contact\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"people\"\n        },\n        \"Source\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Inbound\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Outbound\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Referral\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Event\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Partner\",\n                \"color\": \"pink\"\n              }\n            ]\n          }\n        },\n        \"Blocked\": {\n          \"checkbox\": {}\n        },\n        \"Next step\": {\n          \"rich_text\": {}\n        },\n        \"Weighted value\": {\n          \"formula\": {\n            \"expression\": \"prop(\\\"Value\\\") * prop(\\\"Probability\\\")\"\n          }\n        },\n        \"Days in stage\": {\n          \"formula\": {\n            \"expression\": \"dateBetween(now(), date(prop(\\\"Last stage change\\\") ?? prop(\\\"Created\\\")), \\\"days\\\")\"\n          }\n        },\n        \"Stale\": {\n          \"formula\": {\n            \"expression\": \"if(prop(\\\"Days in stage\\\") > 21, \\\"⚠️ Stale\\\", \\\"\\\")\"\n          }\n        },\n        \"Overdue\": {\n          \"formula\": {\n            \"expression\": \"if(and(prop(\\\"Expected close\\\") < now(), not(or(prop(\\\"Stage\\\") == \\\"Won\\\", prop(\\\"Stage\\\") == \\\"Lost\\\"))), \\\"🔴 Slipped\\\", \\\"\\\")\"\n          }\n        },\n        \"Created\": {\n          \"created_time\": {}\n        },\n        \"Attachments\": {\n          \"files\": {}\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Northwind · Platform rollout\",\n          \"props\": {\n            \"Stage\": \"Proposal out\",\n            \"Value\": 48000,\n            \"Probability\": 0.6,\n            \"Source\": \"Inbound\"\n          }\n        },\n        {\n          \"name\": \"Kestrel Labs · Starter\",\n          \"props\": {\n            \"Stage\": \"Demo given\",\n            \"Value\": 9600,\n            \"Probability\": 0.4,\n            \"Source\": \"Referral\"\n          }\n        },\n        {\n          \"name\": \"Aurelia Health · Enterprise\",\n          \"props\": {\n            \"Stage\": \"Qualified\",\n            \"Value\": 180000,\n            \"Probability\": 0.2,\n            \"Source\": \"Outbound\"\n          }\n        }\n      ]\n    }\n  ],\n  \"views\": [\n    {\n      \"on\": \"deals\",\n      \"name\": \"Pipeline board\",\n      \"type\": \"board\",\n      \"configuration\": {\n        \"type\": \"board\",\n        \"group_by\": {\n          \"type\": \"status\",\n          \"property_name\": \"Stage\",\n          \"group_by\": \"group\",\n          \"sort\": {\n            \"type\": \"manual\"\n          }\n        },\n        \"card_layout\": \"comfortable\",\n        \"cover_size\": \"medium\"\n      }\n    },\n    {\n      \"on\": \"deals\",\n      \"name\": \"Weighted pipeline\",\n      \"type\": \"chart\",\n      \"configuration\": {\n        \"type\": \"chart\",\n        \"chart_type\": \"column\",\n        \"x_axis\": {\n          \"type\": \"select\",\n          \"property_name\": \"Stage\",\n          \"sort\": {\n            \"type\": \"manual\"\n          }\n        },\n        \"y_axis\": {\n          \"aggregator\": \"sum\",\n          \"property_name\": \"Weighted value\"\n        },\n        \"color_theme\": \"blue\",\n        \"color_by_value\": true,\n        \"show_data_labels\": true,\n        \"height\": \"medium\"\n      }\n    },\n    {\n      \"on\": \"deals\",\n      \"name\": \"Closing this month\",\n      \"type\": \"list\",\n      \"filter\": {\n        \"and\": [\n          {\n            \"property\": \"Expected close\",\n            \"on_or_before\": {\n              \"value\": \"end_of_this_month\"\n            }\n          },\n          {\n            \"property\": \"Stage\",\n            \"group_does_not_equal\": \"Complete\"\n          }\n        ]\n      },\n      \"sorts\": [\n        {\n          \"property\": \"Expected close\",\n          \"direction\": \"ascending\"\n        }\n      ]\n    },\n    {\n      \"on\": \"deals\",\n      \"name\": \"Slipped\",\n      \"type\": \"table\",\n      \"filter\": {\n        \"property\": \"Overdue\",\n        \"string\": {\n          \"equals\": \"🔴 Slipped\"\n        }\n      }\n    },\n    {\n      \"on\": \"companies\",\n      \"name\": \"Accounts gallery\",\n      \"type\": \"gallery\",\n      \"configuration\": {\n        \"type\": \"gallery\",\n        \"card_layout\": \"cover_dominant\",\n        \"cover_size\": \"small\"\n      },\n      \"sorts\": [\n        {\n          \"property\": \"Open pipeline\",\n          \"direction\": \"descending\"\n        }\n      ]\n    },\n    {\n      \"on\": \"people\",\n      \"name\": \"Needs a touch\",\n      \"type\": \"table\",\n      \"filter\": {\n        \"property\": \"Follow up\",\n        \"string\": {\n          \"equals\": \"🔴 Overdue\"\n        }\n      },\n      \"sorts\": [\n        {\n          \"property\": \"Days quiet\",\n          \"direction\": \"descending\"\n        }\n      ]\n    }\n  ],\n  \"pages\": [\n    {\n      \"title\": \"CRM: how this system works\",\n      \"icon\": \"🧭\",\n      \"blocks\": [\n        {\n          \"object\": \"block\",\n          \"type\": \"callout\",\n          \"callout\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Three data sources, one pipeline. \",\n                  \"link\": null\n                },\n                \"annotations\": {\n                  \"bold\": true\n                }\n              },\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Deals hold the money, Companies hold the relationship, People hold the conversations. Every deal links to one company and one primary contact, and the rollups on Companies mean lifetime value is never stale.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"icon\": {\n              \"type\": \"emoji\",\n              \"emoji\": \"🧭\"\n            },\n            \"color\": \"blue_background\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"The stage ladder\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"paragraph\",\n          \"paragraph\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Stage is a Status property, not a Select. That matters: Status options belong to groups (To-do / In progress / Complete), so Notion's board view can group by group, and the \",\n                  \"link\": null\n                }\n              },\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"group_does_not_equal\",\n                  \"link\": null\n                },\n                \"annotations\": {\n                  \"code\": true\n                }\n              },\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \" filter operator can exclude everything closed in one condition.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"table\",\n          \"table\": {\n            \"table_width\": 3,\n            \"has_column_header\": true,\n            \"has_row_header\": false\n          },\n          \"children\": [\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Stage\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Group\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Exit criterion\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Lead\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"To-do\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"A real person has replied\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Qualified\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"To-do\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Budget, authority and timeline confirmed\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Demo given\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"In progress\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Technical evaluation started\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Proposal out\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"In progress\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Pricing sent in writing\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Negotiation\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"In progress\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Redlines or procurement in play\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Won / Lost\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Complete\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Contract signed, or a written no\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Formulas you will actually use\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"toggle\",\n          \"toggle\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Weighted value\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          },\n          \"children\": [\n            {\n              \"object\": \"block\",\n              \"type\": \"code\",\n              \"code\": {\n                \"rich_text\": [\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"prop(\\\"Value\\\") * prop(\\\"Probability\\\")\",\n                      \"link\": null\n                    }\n                  }\n                ],\n                \"language\": \"javascript\",\n                \"caption\": []\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"paragraph\",\n              \"paragraph\": {\n                \"rich_text\": [\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"Feed this into the chart view's Y axis with a \",\n                      \"link\": null\n                    }\n                  },\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"sum\",\n                      \"link\": null\n                    },\n                    \"annotations\": {\n                      \"code\": true\n                    }\n                  },\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \" aggregator and you get a forecast that respects probability, not just a count of deals.\",\n                      \"link\": null\n                    }\n                  }\n                ],\n                \"color\": \"default\"\n              }\n            }\n          ]\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"toggle\",\n          \"toggle\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Days in stage → Stale\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          },\n          \"children\": [\n            {\n              \"object\": \"block\",\n              \"type\": \"code\",\n              \"code\": {\n                \"rich_text\": [\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"dateBetween(now(), prop(\\\"Last stage change\\\"), \\\"days\\\") > 21\",\n                      \"link\": null\n                    }\n                  }\n                ],\n                \"language\": \"javascript\",\n                \"caption\": []\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"paragraph\",\n              \"paragraph\": {\n                \"rich_text\": [\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"Deals do not die loudly, they go quiet. This surfaces anything that has not moved in three weeks. It needs a date property that changes when the stage changes; set that with an automation (see the manual steps).\",\n                      \"link\": null\n                    }\n                  }\n                ],\n                \"color\": \"default\"\n              }\n            }\n          ]\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"divider\",\n          \"divider\": {}\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Adding a deal\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"to_do\",\n          \"to_do\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Create the Company first if it does not exist. Never a deal without one\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"checked\": false,\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"to_do\",\n          \"to_do\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Set Value, Probability and Expected close on the same day you create it\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"checked\": false,\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"to_do\",\n          \"to_do\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Link a Primary contact; an unlinked deal has nobody to follow up with\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"checked\": false,\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"to_do\",\n          \"to_do\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Write the Next step in one sentence, as a verb\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"checked\": false,\n            \"color\": \"default\"\n          }\n        }\n      ]\n    }\n  ]\n}"},{"path":"recipes/crm-pipeline.manual.md","type":"registry:file","target":"notion/recipes/crm-pipeline.manual.md","content":"## Button: “Log a call” on every Deal\n\n**Why this cannot be scripted:** Button properties are response-only in the Notion API: the schema is returned on read, but the API ignores button settings on write and cannot create a button or configure its actions.\n\n1. Open the Deals database → ••• → Property → Button.\n2. Name it “Log a call”.\n3. Action 1: Add page to → People. Pre-fill Company with the deal's Company, and Last contact with Today.\n4. Action 2: Edit pages in → Deals (this page). Set Last touch to Today.\n5. Place the button in the Deals page layout so it sits above the notes.\n\n## Automation: stamp “Last stage change” when Stage moves\n\n**Why this cannot be scripted:** Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.\n\n1. Deals → ••• → Automations → New automation.\n2. Trigger: Stage changes. Leave “from” as Any.\n3. Action: Edit page → set Last stage change to Today.\n4. Optional second action: add a Slack message to #sales when Stage becomes Won.\n5. This is what makes the Days in stage formula meaningful.\n\n## Automation: nudge the owner when a deal slips\n\n**Why this cannot be scripted:** Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.\n\n1. Trigger: Expected close is before Today AND Stage is not in the Complete group.\n2. Action: Add a comment @mentioning the Owner with “This deal has slipped: update the close date or move the stage.”\n3. Action: set Blocked to true, so the Slipped view stays honest.\n"}]}