Help center

Guide: Zapier, Make and n8n

Step-by-step HTTP setups for Zapier, Make and n8n. Poll for new SOPs and assignments, assign SOPs, and create SOPs from Markdown.

Business plan Updated
On this page
  1. Common setup
  2. Zapier
  3. Trigger: new SOP
  4. Trigger: SOPs changed in the last hour
  5. Trigger: new assignment
  6. Action: assign an SOP
  7. Action: create an SOP
  8. Make
  9. n8n

There’s no SOPCompass app in the Zapier, Make or n8n directories yet. Their generic HTTP tools work with the API today.

Common setup

  • One key per workflow, named after it (for example Zap: new hire onboarding), so revoking one doesn’t break the others. Read only unless the workflow writes.
  • Headers on every request:
    • Authorization: Bearer sc_live_...
    • Content-Type: application/json (on POST requests)
  • Never put the key in the URL or a query parameter. It is refused with 401 key_in_url, and you’ll have to revoke it.
  • Create keys from an admin account that will stay an admin. If the key’s creator is removed or demoted, the key stops working with 401 creator_not_admin and every workflow using it fails.

Zapier

Use Webhooks by Zapier, a built-in app available on Zapier’s paid plans.

Trigger: new SOP

Use the Retrieve Poll event:

Setting Value
URL https://app.sopcompass.com/api/v1/sops?limit=100
Headers Authorization = Bearer sc_live_...
Key data
Deduplication key id

Zapier remembers the ids it has seen and fires once for each SOP when it first appears. Limits of this approach:

  • It fires on new SOPs, not edits: an edited SOP keeps its id.
  • It reads only the first page, and GET /sops lists the oldest changes first. It works while the workspace has at most 100 SOPs. For larger workspaces, add a filter such as library_id to keep the list under 100, or use the scheduled approach below.

Trigger: SOPs changed in the last hour

For edits, or workspaces with more than 100 SOPs:

  1. Schedule by Zapier: every hour.
  2. Formatter by Zapier, Date / Time, Add/Subtract Time: -1 hour from {{zap_meta_human_now}}, output format YYYY-MM-DDTHH:mm:ss, time zone UTC.
  3. Webhooks by Zapier, GET: URL https://app.sopcompass.com/api/v1/sops, query string updated_since = the Formatter output followed by a literal Z (so the time is read as UTC) and limit = 100, the Authorization header as above.
  4. Looping by Zapier over data to act on each SOP.

Make the steps after it safe to run twice for the same SOP (update by id), since a change right at the boundary can be seen by two runs.

Trigger: new assignment

Retrieve Poll on https://app.sopcompass.com/api/v1/assignments?limit=100, key data, deduplication key id. Assignments are listed newest first, so the first page always holds the newest ones.

Action: assign an SOP

Webhooks by Zapier, Custom Request:

Setting Value
Method POST
URL https://app.sopcompass.com/api/v1/assignments
Headers Authorization = Bearer sc_live_..., Content-Type = application/json
Data the JSON below, with fields mapped from earlier steps
JSON
{
  "sop_id": "5b7e9d1a-2c4f-4e6b-8a1d-3c5e7f9a0b03",
  "email": "new.cleaner@example.com",
  "due_on": "2026-10-01",
  "note": "Assigned automatically by Zapier"
}

A rerun of the same Zap answers 422 already_assigned instead of assigning twice. The assignee isn’t emailed, so add an email or Slack step if they should be told.

Action: create an SOP

Custom Request, POST to https://app.sopcompass.com/api/v1/sops, same headers, with:

JSON
{
  "library_id": "4a6c8e0b-2d4f-4a1c-8e3a-5c7e9b1d3f07",
  "title": "Close a client site for the night",
  "markdown": "## Equipment\n\n1. Empty the mop buckets\n\n## Lock up\n\n- Set the alarm"
}

When mapping multi-line text into the JSON, make sure line breaks arrive as \n and quotes are escaped, or the request fails with 400 invalid_json. See Create an SOP for the Markdown supported.

Make

Use the HTTP app’s Make a request module.

Setting Value
URL https://app.sopcompass.com/api/v1/sops
Method GET
Headers Authorization = Bearer sc_live_...
Query String updated_since = {{formatDate(addHours(now; -1); "YYYY-MM-DDTHH:mm:ss[Z]"; "UTC")}}, limit = 100
Parse response Yes

Schedule the scenario every hour and add an Iterator on data. For POST requests, set Body type to Raw, Content type to JSON (application/json), and put the JSON in Request content.

Add an error handler to the module (for example Break, with automatic retries) so a 429 or 500 is retried after a pause instead of stopping the scenario.

n8n

Use the HTTP Request node.

  1. Credential: create a Header Auth credential with name Authorization and value Bearer sc_live_.... Keeping the key in a credential keeps it out of workflow exports.
  2. Authentication: Generic Credential Type, Header Auth, the credential above.
  3. URL: https://app.sopcompass.com/api/v1/sops.
  4. Send Query Parameters: updated_since = {{ $now.minus({ hours: 1 }).toUTC().toISO() }}, limit = 100.
  5. Follow with Split Out on data.

For assignments, use POST, Send Body with JSON, and the body shown in the Zapier section. Under Options, Pagination can follow next_cursor: set the cursor query parameter to {{ $response.body.next_cursor }} and complete when {{ !$response.body.has_more }}.

Enable Retry On Fail on the node for 429 and 500 responses.