Integrations / ABM

Company contact replied: tag in Attio

When any contact at a target account replies, tag the company as engaged in Attio (or your CRM of choice). The warm-the-committee pattern for account-based outreach.

Why this matters

Account-based outreach treats the company as the unit of progress, not the individual. If you reach out to seven people at Acme and one of them replies, the entire account just got warmer, even if six of those individuals never engaged directly. Tagging the company lets you trigger account-level next-best-actions like inviting more buying-committee members, scheduling a multi-thread email follow-up, or alerting the named-account AE.

The trigger

  • Event name: company.contact_replied
  • Fires: when any contact at a Crispy company replies for the first time. The event payload includes both the company snapshot and the specific contact who replied.
  • Depends on: the company entity (shipped in Phase 89). Contacts must be linked to a Crispy company for the event to fire.

Setup

Attio exposes a REST API for company tagging. The flow looks up the Attio company via your stored external_ids.attio_company_id (or by linkedin_company_id if Attio knows it), then PATCHes the company's tags array.

  1. In Make, create a scenario with a Webhooks → Custom webhook trigger. Copy the URL.
  2. Subscribe Crispy to company.contact_replied. The example below uses a match filter to scope the subscription to strategic-tier accounts only:
    curl -X POST https://crispy.sh/api/v1/subscriptions \
      -H "Authorization: Bearer crispy_your_api_key" \
      -H "Content-Type: application/json" \
      -d '{
        "event": "company.contact_replied",
        "target_url": "https://hook.us2.make.com/your-make-webhook-id",
        "filter": {
          "match": {
            "company.custom_attrs.tier": "strategic"
          }
        }
      }'
  3. Verify the signature using the HMAC verification snippet.
  4. Add an HTTP → Make a request module pointing to Attio. If you stored the Attio company ID:
    PATCH https://api.attio.com/v2/objects/companies/records/{{ payload.data.company.external_ids.attio_company_id }}
    Authorization: Bearer ATTIO_API_KEY
    Content-Type: application/json
    
    {
      "data": {
        "values": {
          "tags": [{ "value": "engaged" }]
        }
      }
    }
  5. If you don't have the Attio ID, add a lookup step first: query Attio by linkedin_company_id or company domain, then PATCH.

Sample payload

Both company and contact are present. source_event tells you which underlying event triggered the company-level rollup (typically contact.first_inbound_message or message.inbound_received).

{
  "payload_version": "1",
  "id": "00000000-0000-0000-0000-000000000902",
  "event": "company.contact_replied",
  "timestamp": "2026-04-29T16:08:11.000Z",
  "webhook_id": "00000000-0000-0000-0000-0000000009h3",
  "account_id": "00000000-0000-0000-0000-0000000009a1",
  "data": {
    "company": {
      "id": "00000000-0000-0000-0000-0000000009co",
      "workspace_id": "00000000-0000-0000-0000-0000000009w1",
      "name": "Acme Corp",
      "linkedin_company_id": "li-acme-001",
      "custom_attrs": {
        "headcount_min": 50,
        "headcount_max": 200,
        "tier": "strategic"
      },
      "external_ids": {
        "attio_company_id": "attio-acme-001"
      }
    },
    "contact": {
      "id": "00000000-0000-0000-0000-0000000009c2",
      "workspace_id": "00000000-0000-0000-0000-0000000009w1",
      "connection_status": "connected",
      "current_campaign_id": "00000000-0000-0000-0000-0000000009p1",
      "custom_attrs": {
        "title": "Director of Engineering"
      }
    },
    "source_event": "contact.first_inbound_message",
    "triggered_at": "2026-04-29T16:08:11.000Z"
  }
}

Troubleshooting

The event isn't firing for some companies.
Contacts must be linked to a Crispy company (the relationship Phase 89 added). If a contact was imported before that link existed, the rollup event won't fire for them. Re-run the company backfill or manually attach the contact to a company record.
Attio is rejecting the PATCH with a 404.
Either the attio_company_id in the payload is stale, or you never imported it. Add a Search-by-domain step before the PATCH and update the Crispy company's external_ids with the resolved ID for next time.