{
  "name": "Send partnership announcements from Bounce Watch to Slack",
  "nodes": [
    {
      "parameters": {
        "content": "## Send partnership announcements from Bounce Watch to Slack\n\nBounce Watch tells you what just happened at a company and when \u2014 funding, senior hires, new offices, customer wins and partnerships, each carrying its own date. What the API covers: bouncewatch.com/products/data-enrichment-api\n\nEvery partnership announcement names two companies that have just decided to work with somebody. That is a short window in which a third name is easier to add than it will be in six months. This workflow puts those announcements in a Slack channel each morning.\n\n### How it works\n\nA daily schedule starts the run. A Settings node holds the country and the lookback window. The Bounce Watch node searches for announced partnerships in that window and returns one item per company. A filter drops the companies whose only match is an inference rather than an announcement, so the channel stays something you can act on. Each remaining company is posted with what was announced, the date and a link to the profile.\n\n### Setup\n\n1. Get an API key at bouncewatch.com/register/api. It is free, no card, and every new account starts with 2,500 credits. Paste it into the Bounce Watch credential.\n2. Set the window in Search settings. Country is optional: blank means every country.\n3. Pick your Slack credential and choose the channel on the last node.\n\nAn empty run means nothing matched the filters, not that those companies were quiet.\n\n### Customization tips\n\nAdd a headcount band or a funding stage to the filters to keep the channel to companies of a size you partner with. Include the partnership-talks key if you want the earlier, softer signal too \u2014 it is inference rather than announcement, and the filter here would need loosening to let it through.",
        "height": 1040,
        "width": 520
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -380,
        -120
      ],
      "id": "sticky-overview",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Where to look\n\nDaily run, one country, one window.\nChange the market in one field.",
        "height": 300,
        "width": 440,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        150,
        -170
      ],
      "id": "sticky-section-1",
      "name": "Section 1"
    },
    {
      "parameters": {
        "content": "## Announcements only\n\nCompanies whose only match is an inference\nstop at the filter.",
        "height": 300,
        "width": 440,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        630,
        -170
      ],
      "id": "sticky-section-2",
      "name": "Section 2"
    },
    {
      "parameters": {
        "content": "## Post it\n\nOne message per company.\nDates are printed as stamps, not claims.",
        "height": 300,
        "width": 200,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1110,
        -170
      ],
      "id": "sticky-section-3",
      "name": "Section 3"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "days",
              "triggerAtHour": 8
            }
          ]
        }
      },
      "id": "bw0099-0000-4000-8000-000000000099",
      "name": "Every morning",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "as0100-0000-4000-8000-000000000100",
              "name": "country_code",
              "type": "string",
              "value": ""
            },
            {
              "id": "as0101-0000-4000-8000-000000000101",
              "name": "lookback_days",
              "type": "number",
              "value": "={{ 3 }}"
            }
          ]
        }
      },
      "id": "bw0102-0000-4000-8000-000000000102",
      "name": "Search settings",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        460,
        0
      ],
      "notes": "Two-letter country code of the company headquarters, and how far back to look."
    },
    {
      "parameters": {
        "resource": "signal",
        "operation": "search",
        "splitSignals": true,
        "filters": {
          "signal_keys": "partnership_announced",
          "country": "={{ $json.country_code  || undefined }}",
          "days": "={{ $json.lookback_days }}",
          "limit": 50,
          "sort": "most_recent"
        }
      },
      "id": "bw0103-0000-4000-8000-000000000103",
      "name": "Partnerships announced",
      "type": "n8n-nodes-bouncewatch.bounceWatch",
      "typeVersion": 1,
      "position": [
        700,
        0
      ],
      "credentials": {
        "bounceWatchApi": {
          "name": "<your credential>"
        }
      },
      "notes": "One item per company, with the matching signals nested underneath."
    },
    {
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "as0104-0000-4000-8000-000000000104",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.signals.some(s => !s.unconfirmed) }}",
              "rightValue": ""
            }
          ]
        }
      },
      "id": "bw0105-0000-4000-8000-000000000105",
      "name": "Drop unconfirmed",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        940,
        0
      ],
      "notes": "A company whose only match is inference rather than announcement stops here."
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "",
          "mode": "name",
          "cachedResultName": ""
        },
        "text": "=\ud83e\udd1d *{{ $json.company.name }}*\n{{ $json.signals.filter(s => !s.unconfirmed).map(s => \"\u2022 \" + s.label + \" \u2014 \" + s.date + (s.summary ? \"\\n  \" + s.summary : \"\")).join(\"\\n\") }}\n_{{ $json.company.country }}{{ $json.company.employees ? \" \u00b7 \" + $json.company.employees + \" people\" : \"\" }}_\n{{ $json.company.profile_url }}",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "id": "bw0106-0000-4000-8000-000000000106",
      "name": "Post the announcements",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1180,
        0
      ],
      "notes": "Pick your channel here."
    }
  ],
  "connections": {
    "Every morning": {
      "main": [
        [
          {
            "node": "Search settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search settings": {
      "main": [
        [
          {
            "node": "Partnerships announced",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Partnerships announced": {
      "main": [
        [
          {
            "node": "Drop unconfirmed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Drop unconfirmed": {
      "main": [
        [
          {
            "node": "Post the announcements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  }
}