How to Report on a Headless CRM's Pipeline via the HTTP Connector to Slack
Build a weekly Spojit workflow that pulls open deals from a CRM with no native tile through the http connector, totals pipeline value by stage with the math connector, and posts an AI-summarized report to a Slack channel.
What This Integration Does
Plenty of sales teams run on a CRM that Spojit does not ship a dedicated connector for. That is not a blocker: the http connector calls any REST API directly, so you can read your pipeline from whatever CRM you use and turn it into a recurring report. This tutorial reads every open deal, groups the deals by stage, sums the deal value in each stage with the math connector, and drops a clean weekly summary into Slack so the team starts the week with one place to see where revenue sits.
The workflow runs on a Schedule trigger, so nobody has to remember to pull the numbers. Each run calls your CRM's REST endpoint, parses the response into the fields you care about with the json connector, computes per-stage totals, hands the figures to Miraxa for a short narrative, and sends one Slack message. It holds no state between runs: every execution fetches a fresh snapshot of the pipeline, so re-running it simply produces a current report rather than duplicating or compounding anything. If a run fails (for example the CRM is briefly unreachable), nothing is half-written, and the next scheduled run picks up cleanly.
Prerequisites
- A Slack connection added under Connections, with access to the channel you want to post in. See the Slack connector article for setup.
- Your CRM's REST API base URL and an API key (or bearer token). You will pass this in the request header through the http connector. No native CRM connection is required.
- Knowledge of your CRM's "list deals" endpoint and which fields hold the deal value (for example
amount) and stage (for examplestageorpipeline_stage). - The http, json, and math connectors are built in and need no connection or credentials.
- An idea of your reporting cadence and timezone (this tutorial uses Monday 9am Sydney time).
Step 1: Add a Schedule trigger
Create a new workflow and add a Trigger node, then set Trigger Type to Schedule. Schedules use a 5-field Unix cron expression plus an IANA timezone. For a weekly Monday 9am report in Sydney, set the expression to 0 9 * * 1 and the timezone to Australia/Sydney. A single trigger can hold more than one schedule if you later want a mid-week run too. The trigger output is { scheduledAt }, which you can reference downstream as {{ scheduledAt }} to stamp the report with its run time.
Step 2: Fetch open deals from your CRM via the http connector
Add a Connector node on the http connector in Direct mode and choose the http-get tool. Point the url at your CRM's deals endpoint and pass your API key in a header. A typical configuration:
url: https://api.yourcrm.com/v1/deals?status=open&limit=200
headers:
Authorization: Bearer YOUR_CRM_API_KEY
Accept: application/json
Use a query parameter to scope the request to open deals only, and request a generous page size so you capture the whole pipeline in one call. The http-get tool returns the parsed response, which you can reference as {{ http-get.data }} (the exact path depends on your CRM's response shape). If your CRM expects the deal filter in the body instead of the query string, switch to the http-post tool and move the filter into the request body.
Step 3: Pull out the deal list with the json connector
CRM responses are often wrapped (for example { "data": { "deals": [ ... ], "meta": { ... } } }). Add a Connector node on the json connector in Direct mode and use the get tool to pluck the array you need. Set the input to the response from Step 2 and the path to the deals array, for example data.deals. This gives you a clean list to iterate over. If the response is a string rather than an object, run the parse tool first to turn it into structured JSON, then get. You can reference the resulting array downstream as {{ get.result }}.
Step 4: Total pipeline value by stage with the math connector
Now reduce the deal list to per-stage totals. Add a Transform node to group the deals by their stage field and collect each stage's deal amounts into a numeric list (one list per stage, for example all amount values where stage equals "Negotiation"). Then, for each stage, add a Connector node on the math connector in Direct mode using the sum tool, with the stage's list of amounts as the input. Capture the result so you have a figure per stage:
Proposal: {{ sum.result }} // e.g. 48250
Negotiation: {{ sum.result }} // e.g. 121000
Closing: {{ sum.result }} // e.g. 73500
If your stage set is fixed and small, a Connector node per stage is the clearest approach. If stages vary, wrap a Loop node (ForEach) over the grouped stages and run the sum tool inside the loop body. You can also use the math connector's format or currency tool to render each total as a tidy money string before it reaches Slack.
Step 5: Summarize the figures with Miraxa
Add a Connector node and switch it to Agent mode. Agent mode lets Miraxa, the intelligent layer across your automation, turn the raw per-stage totals into a short, readable narrative. Pass the stage totals and the run time into the prompt, and ask for a tight summary:
Write a 3 to 4 sentence weekly pipeline summary for the sales team.
Stage totals (AUD): {{ stage_totals }}.
Report time: {{ scheduledAt }}.
Call out the largest stage by value and the total open pipeline.
Keep it factual and skip greetings.
To keep downstream formatting predictable, you can attach a Response Schema so Miraxa returns structured JSON (for example a headline string and a body string) rather than free text. Agent mode costs AI credits; if you would rather keep the report fully deterministic and free, skip this step and build the message text directly from the totals with the text connector instead.
Step 6: Post the report to Slack
Add a Connector node on the slack connector in Direct mode and choose the send-message tool. Set the target channel and the message text, drawing on the summary from Step 5 and the per-stage totals from Step 4:
channel: #sales-pipeline
text: |
*Weekly Pipeline Report* ({{ scheduledAt }})
{{ summary.headline }}
Proposal: ${{ proposal_total }}
Negotiation: ${{ negotiation_total }}
Closing: ${{ closing_total }}
{{ summary.body }}
If you would rather route this to several places, add a second Connector node, or fan out with a Parallel node so the Slack post and an email summary go out at the same time. To email the same report, add a Send Email node, which sends from Spojit's built-in mail service with no extra connection (recipients must be on your org allowlist).
Tips
- Most CRMs paginate. If your pipeline exceeds one page, read the
nextcursor or page count from the response and loop additionalhttp-getcalls inside a Loop node until you have every open deal. - Use the math connector's
currencytool to format totals with a symbol and thousands separators so the Slack message reads cleanly without extra string work. - Keep the Agent mode prompt short and feed it only the computed totals, not the full deal list. That keeps the run fast and the AI cost low while still producing a useful narrative.
- Add a second schedule on the same trigger (for example
0 9 * * 4) if the team wants a Thursday check-in as well.
Common Pitfalls
- Wrong response path. If the
jsongetstep returns nothing, your path is off. Open the execution log, inspect the rawhttp-getoutput, and correct the path (for exampledata.dealsvsresults). - Strings instead of numbers. If deal amounts arrive as strings, the math
sumtool may not total them as you expect. Coerce them to numbers in the Transform node before summing. - Timezone drift. Cron runs in the timezone you set, not the viewer's. Confirm the IANA zone (for example
Australia/Sydney) so the Monday 9am run lands when you expect across daylight saving changes. - Expired CRM credentials. If the
http-getcall returns 401, your API key or token has rotated. Update the header value; a single bad week of auth means a missing report, not corrupted data, since runs hold no state.
Testing
Before relying on the schedule, validate the chain on a small scope. Temporarily add a query parameter to the http-get URL to fetch just a handful of open deals, then use the Run button to trigger the workflow manually. Walk the execution log step by step: confirm the CRM call returns deals, the json get step yields the array, each sum total looks right against the source data, the Agent mode summary reads well, and the Slack message lands in the right channel. Once the numbers reconcile, remove the test scope and let the Schedule trigger take over.