Tukang.com × SteelSolution API Integration: Call Flow
This document describes how Tukang.com's installation-service platform integrates with SteelSolution's CMS across the customer's install journey, covering vendor matching, site-visit scheduling, cost estimation, installation, and completion.
This page and the API reference together are the authoritative description of Tukang.com's side of this integration. Where any other document disagrees with them, these two are correct.
Endpoint paths are shortened in the diagrams below. Every Tukang.com path is relative to /partners/steelsolution/v1, so step 2's POST /match is POST /partners/steelsolution/v1/match. Full paths are in the API reference.
Happy path
sequenceDiagram
actor Customer
participant SteelSolution as SteelSolution CMS
participant Tukang as Tukang.com API
Customer->>SteelSolution: 1. Find nearby vendors
SteelSolution->>Tukang: 2. POST /match
Tukang-->>SteelSolution: 3. Returns up to 5 vendors with site-visit cost
Customer->>SteelSolution: 4. Pick vendor, pay site-visit fee
SteelSolution->>Tukang: 5. POST /site-visits
Tukang-->>SteelSolution: 6. Confirms site visit scheduled
Tukang->>Tukang: 7. Vendor starts the site visit
Tukang->>SteelSolution: 8. Status webhook: in_progress
SteelSolution-->>Tukang: 9. Acknowledges
Tukang->>Tukang: 10. Vendor completes the site visit
Tukang->>SteelSolution: 11. Status webhook: visit_complete (no estimate yet)
SteelSolution-->>Tukang: 12. Acknowledges
Tukang->>Tukang: 13. Cost estimate is built (can be hours to days later)
Tukang->>SteelSolution: 14. Status webhook: estimate_ready (quote, materials list, total service amount, RAB PDF URL)
Customer->>SteelSolution: 15. Review estimate, decide to accept
SteelSolution->>Tukang: 16. POST /site-visits/{id}/accept
Tukang-->>SteelSolution: 17. Confirms estimate accepted, work in progress
SteelSolution->>Tukang: 18. POST /site-visits/material-received
Tukang-->>SteelSolution: 19. Confirms logged, vendor notified
Tukang->>Tukang: 20. Vendor completes every RAB line item
Tukang->>SteelSolution: 21. Status webhook: retention_started
Tukang->>Tukang: 22. Final install sign-off
Tukang->>SteelSolution: 23. Status webhook: install_complete
SteelSolution-->>Tukang: 24. Acknowledges
Estimate rejected (replaces steps 15-17 above)
sequenceDiagram
actor Customer
participant SteelSolution as SteelSolution CMS
participant Tukang as Tukang.com API
Customer->>SteelSolution: 15. Review estimate, decide to reject
SteelSolution->>Tukang: 16. POST /site-visits/{id}/reject
Tukang-->>SteelSolution: 17. Confirms estimate rejected, site visit closed
No additional work needed (replaces steps 7-12 above)
Vendor determines the job is complete during the site visit itself, so no separate cost estimate is required. Same in_progress/visit_complete status webhooks as the happy path's steps 8 and 11 - the difference is nothing follows visit_complete, this branch ends here.
sequenceDiagram
actor Customer
participant SteelSolution as SteelSolution CMS
participant Tukang as Tukang.com API
Tukang->>Tukang: 7. Vendor starts the site visit
Tukang->>SteelSolution: 8. Status webhook: in_progress
SteelSolution-->>Tukang: 9. Acknowledges
Tukang->>Tukang: 10. Vendor completes job outright
Tukang->>SteelSolution: 11. Status webhook: visit_complete (terminal, no estimate follows)
SteelSolution-->>Tukang: 12. Acknowledges
Outbound status webhook
All the outbound pushes shown above (steps 8, 11, 14, 21, 23) are the same one webhook call on SteelSolution's CMS, not separate endpoints - each carries a status value plus the full site-visit record (same shape as the GET /site-visits/{id} response in the API reference), fields not relevant to the current status are simply null.
| Status value | Fires when |
|---|---|
in_progress | Vendor has started the site visit |
visit_complete | Site visit has ended. No estimate attached yet either way - jobs that don't need one stop here |
estimate_ready | The cost estimate has been built and sent. Fires separately, later - can be hours to days after visit_complete, not the same call. Includes the quote, a materials list (each item with a Magento-recognizable ID), total service amount, and a RAB PDF URL |
retention_started | Every RAB line item has been marked complete by the vendor, before final install sign-off |
install_complete | Installation work is fully finished |
These are the values the webhook sends. GET /site-visits/{id} uses the same words, so a push and a status check taken at the same moment agree. It also returns two the webhook never sends: scheduled before work starts, and closed when the customer rejected the estimate. One limitation: on jobs that need a cost estimate, a status check answers in_progress between the visit_complete and estimate_ready pushes, so rely on the push in that window. Full table and the payload shape are in the API reference under "Status values" and "Outbound status webhook".
Material catalog sync (background)
Tukang.com periodically syncs SteelSolution's product catalog so vendors' cost estimates can reference current SteelSolution material pricing.
sequenceDiagram
participant Cron as Tukang.com (scheduled sync)
participant SteelSolution as SteelSolution CMS
Cron->>SteelSolution: GET product catalog
SteelSolution-->>Cron: Returns products (SKU, price, etc)
Cron->>Cron: Update local catalog
Endpoints needed from SteelSolution
Only 2 endpoints are needed on SteelSolution's side, not one per event - see "Outbound status webhook" above for why. Both were specified by Kemana on 3 August 2026 and verified on their staging environment.
| Purpose | Endpoint | Trigger |
|---|---|---|
| Receive the status webhook (all 5 status values above) | POST /V1/tukang/callbacks/site-visit-status | Any site-visit status change - in_progress, visit_complete, estimate_ready, retention_started, install_complete |
| Provide product catalog access | GET /V1/tukang/catalog | Tukang.com reads SteelSolution's product catalog nightly to price materials in cost estimates |
For the second item, direction is reversed from the first: Tukang.com is the caller, reading from an endpoint SteelSolution hosts.
