Integrations / Canonical use case

Invitation not accepted in 7 days

When a LinkedIn invitation isn't accepted within 7 days, fire a webhook that drops the contact into Instantly, Smartlead, or any cold-email tool. If they accept inside the 7-day window, the trigger is cancelled automatically.

Why this matters

Most LinkedIn outreach tools lock workflows inside their own UI. You can build a sequence that sends a follow-up message after acceptance, but you cannot easily say “if they ignore me on LinkedIn for a week, switch to email.” That multi-channel handoff is exactly where competitors leave you stranded.

Crispy treats this as a first-class primitive. The invitation.not_accepted_after event is scheduled the moment you send an invitation, fires automatically once the threshold elapses, and cancels itself if the contact accepts in the meantime.

The trigger

  • Event name: invitation.not_accepted_after
  • Fires: 7 days after invitation.sent, if and only if invitation.accepted has not been recorded for the same contact.
  • Cancelled: automatically when invitation.accepted fires inside the window. The cron sweeper marks the scheduled row cancelled_at with reason invitation.accepted.
  • Tolerance: the firing cron runs every minute. Fire times are jittered ±10 minutes to spread bulk-import bursts across your downstream endpoint. Don't rely on second-precision.
v1 note: the 7-day threshold is hardcoded in v1. Per-subscription thresholds (e.g. “14 days for SaaS prospects, 5 days for agencies”) are a deferred follow-up. Subscribe once per workspace and route downstream by filter.

Setup via Make.com

Make has the cleanest visual flow for this. Roughly 5 minutes end-to-end.

  1. In Make, create a new scenario and add a Webhooks → Custom webhook trigger. Copy the generated webhook URL.
  2. Subscribe Crispy to invitation.not_accepted_after with that URL as target_url:
    curl -X POST https://crispy.sh/api/v1/subscriptions \
      -H "Authorization: Bearer crispy_your_api_key" \
      -H "Content-Type: application/json" \
      -d '{
        "event": "invitation.not_accepted_after",
        "target_url": "https://hook.us2.make.com/your-make-webhook-id",
        "filter": {
          "is_first": true,
          "match": {
            "contact.custom_attrs.industry": "SaaS"
          }
        }
      }'
  3. Send a test invitation from Crispy to fire a sample delivery. Make's scenario editor will auto-detect the payload shape so subsequent modules can map fields like payload.data.contact.email and payload.data.contact.custom_attrs.industry.
  4. Add an Instantly → Add lead to campaign module. Map the contact email and any custom attributes you imported into Crispy's custom_attrs into Instantly's lead fields.
  5. Verify the signature. In a Make HTTP module, the Webhook-Signature header is exposed under headers. Add a router branch that calls a Tools → Run JavaScript module with the code from the HMAC verification reference before any downstream side effects.
  6. Activate the scenario. Make will receive deliveries on every fire and route to Instantly automatically.

A pre-built Make scenario template will be linked here once shared (placeholder).

Setup via n8n

n8n self-hosted or n8n.cloud. The flow mirrors Make.

  1. Create a new workflow with a Webhook trigger node. Set the HTTP method to POST and copy the test URL.
  2. Subscribe Crispy with that URL (same curl as Make above, just swap the target).
  3. Add a Code node immediately after the Webhook trigger. Paste the Node verifier from the HMAC verification page. Throw on signature mismatch so the workflow short-circuits.
  4. Add an HTTP Request node configured to POST to Instantly's /api/v2/leads/lists/{list_id}/leads endpoint. Map {{ $json.data.contact.email }} into the Instantly lead body.
  5. Activate the workflow and fire a real invitation.not_accepted_after from Crispy to confirm.

Setup via Zapier

Zapier's native trigger doesn't verify HMAC out of the box, so add a Code-by-Zapier step.

  1. Create a new Zap with a Webhooks by Zapier → Catch Hook trigger. Copy the catch URL.
  2. Subscribe Crispy to that URL using the same curl above.
  3. Add a Code by Zapier step (Run JavaScript). Paste the Node verifier from the HMAC verification page. Set output = { valid: true } on success and throw on failure to short-circuit the Zap.
  4. Add the Instantly → Add Lead action (or Smartlead, Lemlist, etc.). Map fields from the trigger payload.
  5. Publish the Zap and send a test invitation to verify end-to-end.

Sample payload

Every delivery has the v1 envelope shape below. Top-level keys are frozen; new fields are additive. The data.source_event field tells you which event led to the schedule (always invitation.sent for this trigger).

{
  "payload_version": "1",
  "id": "00000000-0000-0000-0000-000000000900",
  "event": "invitation.not_accepted_after",
  "timestamp": "2026-04-29T22:00:00.000Z",
  "webhook_id": "00000000-0000-0000-0000-0000000009h1",
  "account_id": "00000000-0000-0000-0000-0000000009a1",
  "data": {
    "contact": {
      "id": "00000000-0000-0000-0000-0000000009c1",
      "workspace_id": "00000000-0000-0000-0000-0000000009w1",
      "account_id": "00000000-0000-0000-0000-0000000009a1",
      "connection_status": "pending",
      "current_campaign_id": "00000000-0000-0000-0000-0000000009p1",
      "tags": ["q4-target"],
      "custom_attrs": {
        "industry": "SaaS",
        "headcount": 120
      },
      "external_ids": {
        "hubspot_contact_id": "hs-12345"
      }
    },
    "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
      },
      "external_ids": {
        "attio_company_id": "attio-acme-001"
      }
    },
    "source_event": "invitation.sent",
    "triggered_at": "2026-04-29T22:00:00.000Z"
  }
}

Troubleshooting

My webhook is auto-disabled and I'm not getting deliveries.
Crispy disables a webhook after 100 consecutive failures and emails the workspace owner. Check get_webhook_deliveries for the failure reason, fix your endpoint, then re-enable from the dashboard.
Signature verification fails inside Make / n8n / Zapier.
Make sure you're using the raw request body (not the parsed JSON) when computing the HMAC. The body input to the HMAC is v1.<timestamp>.<raw_body>, not the body alone. Most platforms expose the raw body as a separate variable; check the platform docs.
I'm receiving the same delivery twice.
Retries are expected on 5xx responses. Use the Webhook-Event-Id header for idempotency. Store delivered IDs for 7 days and short-circuit duplicates.
The contact accepted on day 6 but I still got the day-7 fire.
Cancellation is idempotent and fires on invitation.accepted from Crispy's side. If your webhook tooling didn't see the acceptance in time, the most common cause is your LinkedIn account being disconnected during the polling window. Reconnect from the dashboard and the next sync will pick up the missed accept.