{"generatedAt":"2026-10-03T18:48:09.435Z","product":{"slug":"workmate","name":"Workmate","summary":"Workforce automation for people, clients, tasks, attendance, proof, and live operations.","stateModel":"stateful","platforms":["REST","Android","Web"],"auth":{"type":"Organization and user-scoped access","guidance":"Use service identities for dispatch integrations and user identities for worker actions; preserve the actor in every transition."}},"ownership":{"classification":"provider-stateful","boundary":"Workmate exposes durable operational resources. Mirror provider identity and lifecycle evidence in an application aggregate; an accepted request is not a completed business outcome.","applicationRule":"The application owns business identity, expected version, command idempotency, evidence receipts, audit, reconciliation, and downstream side effects even when Mappls owns provider resource state."},"coverage":{"slug":"workmate","name":"Workmate","stateModel":"stateful","ownership":"provider-stateful","accent":"#3478f6","journeyCount":1,"boundary":"Workmate exposes durable operational resources. Mirror provider identity and lifecycle evidence in an application aggregate; an accepted request is not a completed business outcome.","aggregates":["task"],"journeySlugs":["field-service-task"],"sampleSlugs":["field-service"],"tutorialSlugs":["workmate-task-lifecycle","webhook-reliability","workmate-proof-review","ios-sdk-production-readiness","react-native-native-parity"],"useCaseSlugs":["field-service","energy-grid-resilience","insurance-claims","smart-city-operations","aviation-ground-operations","agriculture-field-ops","mining-haulage-safety","telecom-network-care"],"contractSlugs":["workmate-post-tasks-to-create-new-task","workmate-get-tasks-taskid-to-get-the-task-details-for-the-given-task-id","workmate-put-tasks-taskid-to-update-the-task-description-status","workmate-get-users-to-get-all-the-user-details-which-belongs-to-your-organization","workmate-get-clients-to-get-all-your-client-details"],"sourceGuideSlugs":["mapmyindia-workmate-apis","mappls-workmate-android-sdk"],"totals":{"states":8,"transitions":8,"failurePlans":4,"durableRecords":4,"operationalSignals":6}},"controlLayers":[{"id":"identity","title":"Identity and aggregate boundary","question":"What durable thing is being operated?","implementation":"Use stable business and provider identifiers for task; never infer identity from display text or the latest coordinates.","proof":"Duplicate creation, resource rebinding, tenant isolation, and retirement tests."},{"id":"authority","title":"Actor authority","question":"Who may advance each transition?","implementation":"Authorize every command against the named journey actors: Dispatcher, Field worker, Supervisor, Integration service. Persist the attributable actor, tenant, purpose, and policy decision.","proof":"Role, resource, tenant, purpose, and human-approval denial tests."},{"id":"commands","title":"Commands and concurrency","question":"How are retries and races made safe?","implementation":"Require a command idempotency key and expected aggregate version. Cache the canonical result, reject key reuse with different intent, and reconcile ambiguous timeouts before retry.","proof":"Exact replay, stale-version rejection, concurrent-writer, timeout, and restart tests."},{"id":"evidence","title":"Evidence and durable records","question":"What proves each state?","implementation":"Persist immutable receipts and revisions around these catalog records: Task snapshot, Audit event, Evidence manifest, Transactional outbox. Keep event time, receipt time, source identity, hashes, and retention policy separate.","proof":"Missing, malformed, late, duplicate, conflicting, and redacted-evidence tests."},{"id":"events","title":"Events and side effects","question":"How do downstream systems learn what committed?","implementation":"Commit aggregate state, audit, and a transactional outbox together. Sign deliveries, bound retries, dead-letter exhaustions, and preserve delivery attempts without changing business history.","proof":"Atomic commit, signature, retry, lease fencing, dead-letter, replay, and ordering tests."},{"id":"recovery","title":"Recovery and reconciliation","question":"What happens when systems disagree?","implementation":"Treat timeouts as unknown outcomes, poll or consume authoritative evidence, compare versions, append a reconciliation decision, and use compensation instead of destructive history edits.","proof":"Provider timeout, callback-before-response, delayed event, outage, restart, and manual-recovery drills."},{"id":"privacy","title":"Privacy and human control","question":"Which data and decisions are sensitive?","implementation":"Minimize precise location and media, scope retention, redact derived data deliberately, and require attributable approval for dispatch, publication, access, closure, and destructive change where consequential.","proof":"Least-privilege, consent expiry, separation-of-duties, retention, export, revocation, and redaction tests."},{"id":"operations","title":"Operations and release","question":"Can operators see and recover the journey?","implementation":"Expose state age, source freshness, stuck commands, retries, reconciliation lag, outbox depth, terminal outcomes, and per-aggregate audit. Roll out behind explicit acceptance gates.","proof":"SLO alerts, support lookup, bulk reconciliation, rollback, backup restore, regional failover, and incident drills."}],"journeys":[{"slug":"field-service-task","title":"Field-service task lifecycle","eyebrow":"Workmate · command-driven aggregate","productSlug":"workmate","stateModel":"stateful","summary":"Create, assign, accept, travel, prove, approve, and close a field job without losing actor, retry, or evidence history.","aggregate":"task","actors":["Dispatcher","Field worker","Supervisor","Integration service"],"sourceGuideSlugs":["mapmyindia-workmate-apis","mappls-workmate-android-sdk"],"contractSlugs":["workmate-post-tasks-to-create-new-task","workmate-get-tasks-taskid-to-get-the-task-details-for-the-given-task-id","workmate-put-tasks-taskid-to-update-the-task-description-status","workmate-get-users-to-get-all-the-user-details-which-belongs-to-your-organization","workmate-get-clients-to-get-all-your-client-details"],"sampleSlug":"field-service","states":[{"id":"unassigned","label":"Unassigned","meaning":"The job exists with client, site, SLA, skills, window, and proof policy but no worker owns it.","recovery":"Re-run assignment using the same external job identifier; never create a second job to recover a timeout."},{"id":"assigned","label":"Assigned","meaning":"A specific eligible worker owns the next decision and dispatch has recorded why they were selected.","recovery":"Expire or explicitly reassign after checking worker availability and the last committed task version."},{"id":"accepted","label":"Accepted","meaning":"The worker has acknowledged responsibility and the customer-facing plan can become firm.","recovery":"If the device is offline, accept locally with a client command ID and reconcile once connectivity returns."},{"id":"en_route","label":"En route","meaning":"Travel has begun and ETA, route deviation, and SLA-risk observations may change continuously.","recovery":"Resume from the last task version and latest trusted position; recalculate route rather than replaying old guidance."},{"id":"in_progress","label":"In progress","meaning":"Arrival is established and work evidence can be gathered under the declared proof policy.","recovery":"Keep an offline evidence queue with hashes and local IDs; upload without losing capture time or actor."},{"id":"proof_pending","label":"Proof pending","meaning":"The worker submitted an immutable evidence set awaiting automated or supervisor validation.","recovery":"A rejected set returns to in-progress through an explicit event; retain the rejected evidence for audit."},{"id":"completed","label":"Completed","meaning":"Required proof is accepted and downstream billing, inventory, SLA, and customer workflows may run.","recovery":"Treat completion as terminal; corrections are compensating records, not destructive edits to history.","terminal":true},{"id":"cancelled","label":"Cancelled","meaning":"A named actor stopped the job with a reason before completion.","recovery":"Create a replacement job only when business intent genuinely changes and link it to the cancelled task.","terminal":true}],"transitions":[{"command":"create_task","actor":"Integration service","from":[],"to":"unassigned","event":"task.created","idempotency":"Use the upstream job ID as a stable creation key."},{"command":"assign","actor":"Dispatcher","from":["unassigned","assigned"],"to":"assigned","event":"task.assigned","idempotency":"Deduplicate by dispatcher command ID and compare expected task version."},{"command":"accept","actor":"Field worker","from":["assigned"],"to":"accepted","event":"task.accepted","idempotency":"Generate the key on-device before network transmission and persist it through retry."},{"command":"start_travel","actor":"Field worker","from":["accepted"],"to":"en_route","event":"task.en_route","idempotency":"A repeated start must return the same state and must not create a second trip."},{"command":"arrive","actor":"Field worker","from":["en_route"],"to":"in_progress","event":"task.started","idempotency":"Bind arrival evidence and command ID to the same transition transaction."},{"command":"submit_proof","actor":"Field worker","from":["in_progress"],"to":"proof_pending","event":"task.proof_submitted","idempotency":"Hash the evidence manifest and reject a reused key with different content."},{"command":"approve_proof","actor":"Supervisor","from":["proof_pending"],"to":"completed","event":"task.completed","idempotency":"Commit approval and downstream outbox entries atomically."},{"command":"reject_proof","actor":"Supervisor","from":["proof_pending"],"to":"in_progress","event":"task.proof_rejected","idempotency":"Preserve decision reason and the rejected evidence version."}],"invariants":["One upstream external job maps to one durable task aggregate.","Only the assigned worker can accept, travel, arrive, or submit proof unless an attributable override is recorded.","Every command carries tenant, actor, idempotency key, expected version, and occurrence time.","Completion is impossible until the declared proof policy passes.","Task history is append-only; corrections use new events or compensating work."],"records":[{"name":"Task snapshot","purpose":"Fast current-state reads and optimistic concurrency.","keyFields":["taskId","externalId","state","version","assigneeId","mapplsPin"]},{"name":"Audit event","purpose":"Attributable, replayable history for support and compliance.","keyFields":["eventId","aggregateVersion","actor","commandId","occurredAt"]},{"name":"Evidence manifest","purpose":"Immutable references and hashes for checklist, media, signature, and consent.","keyFields":["manifestId","taskVersion","captureTime","contentHash","retentionClass"]},{"name":"Transactional outbox","purpose":"Reliable downstream billing, inventory, notification, and analytics delivery.","keyFields":["outboxId","eventId","status","attempts","nextAttemptAt"]}],"failures":[{"trigger":"Create-task response times out","detection":"No provider response but the upstream external ID and idempotency key are known.","recovery":"Query by known identity or repeat the same command; do not mint a new job ID."},{"trigger":"Two dispatchers edit the same task","detection":"The submitted expected version is older than the current aggregate version.","recovery":"Return conflict with current state; refresh context and require an intentional new command."},{"trigger":"Worker is offline during proof capture","detection":"Evidence exists locally but no server acknowledgement or event ID exists.","recovery":"Retain command ID, hashes, capture timestamps, and retry queue until the committed event is returned."},{"trigger":"Downstream system is unavailable after completion","detection":"Task is complete but its outbox entry remains pending or retrying.","recovery":"Retry outbox delivery independently; never reopen or re-complete the task to trigger side effects."}],"observability":["Command acceptance, rejection code, actor, task version, and latency","Time spent in each state and SLA-risk interval","Duplicate command rate and version-conflict rate","Offline queue age and proof upload completeness","Outbox backlog, attempt count, and dead-letter age","Precise-location access with purpose and retention class"],"website":"/journeys/field-service-task"}],"evidence":{"contracts":[{"slug":"workmate-post-tasks-to-create-new-task","method":"POST","path":"/tasks","summary":"To create new Task","contractStatus":"legacy-source","stateModel":"stateful","journeyRole":"command","website":"/api-reference/workmate-post-tasks-to-create-new-task"},{"slug":"workmate-get-tasks-taskid-to-get-the-task-details-for-the-given-task-id","method":"GET","path":"/tasks/{taskId}","summary":"To get the task details for the given task id.","contractStatus":"legacy-source","stateModel":"stateful","journeyRole":"observe","website":"/api-reference/workmate-get-tasks-taskid-to-get-the-task-details-for-the-given-task-id"},{"slug":"workmate-put-tasks-taskid-to-update-the-task-description-status","method":"PUT","path":"/tasks/{taskId}","summary":"To update the task description & status.","contractStatus":"legacy-source","stateModel":"stateful","journeyRole":"transition","website":"/api-reference/workmate-put-tasks-taskid-to-update-the-task-description-status"},{"slug":"workmate-get-users-to-get-all-the-user-details-which-belongs-to-your-organization","method":"GET","path":"/users","summary":"To get all the user details which belongs to your organization.","contractStatus":"legacy-source","stateModel":"stateful","journeyRole":"observe","website":"/api-reference/workmate-get-users-to-get-all-the-user-details-which-belongs-to-your-organization"},{"slug":"workmate-get-clients-to-get-all-your-client-details","method":"GET","path":"/clients","summary":"To get all your client details","contractStatus":"legacy-source","stateModel":"stateful","journeyRole":"observe","website":"/api-reference/workmate-get-clients-to-get-all-your-client-details"}],"guides":[{"slug":"mapmyindia-workmate-apis","title":"Mappls by MapmyIndia-Workmate-Apis","summary":"Powerful work force management APIs helping users get all the pertinent data related to their org such as live location of employees, client details and task details etc. Mappls Workmate easily integrates with existing cloud services via our APIs. These APIs help to make the ops efficient by providing location intellegence to your solutions.","kind":"REST API","maturity":"legacy","platforms":["REST"],"website":"/reference/mapmyindia-workmate-apis"},{"slug":"mappls-workmate-android-sdk","title":"Workmate SDK - Android","summary":"Native Android SDK for our Workforce Management & Automation Solution - Workmate","kind":"SDK","maturity":"current","platforms":["Android"],"website":"/reference/mappls-workmate-android-sdk"}],"samples":[{"slug":"field-service","name":"Field Service Console","description":"Create, assign, execute, and audit a technician visit with proof.","stack":["Node.js","Browser UI","Workmate adapter"],"implementation":"full-stack-reference","verifiedTestCount":6,"downloadPath":"/downloads/field-service.zip","website":"/samples/field-service"}],"tutorials":[{"slug":"workmate-task-lifecycle","title":"Automate a complete Workmate task lifecycle","outcome":"An idempotent field-service integration.","level":"Advanced","duration":"2 hr","website":"/tutorials/workmate-task-lifecycle"},{"slug":"webhook-reliability","title":"Consume Mappls events exactly once in effect","outcome":"A production webhook ingestion pipeline.","level":"Advanced","duration":"55 min","website":"/tutorials/webhook-reliability"},{"slug":"workmate-proof-review","title":"Build proof review and rework for field jobs","outcome":"An auditable proof workflow that cannot silently overwrite rejected evidence.","level":"Advanced","duration":"90 min","website":"/tutorials/workmate-proof-review"},{"slug":"ios-sdk-production-readiness","title":"Qualify an iOS Mappls release","outcome":"A clean-device iOS qualification record spanning SDK, widget, tracking, and distribution boundaries.","level":"Advanced","duration":"2 hr","website":"/tutorials/ios-sdk-production-readiness"},{"slug":"react-native-native-parity","title":"Qualify React Native native parity","outcome":"One JavaScript contract backed by independently qualified Android and iOS behavior.","level":"Advanced","duration":"100 min","website":"/tutorials/react-native-native-parity"}],"useCases":[{"slug":"field-service","title":"Dispatch the right technician, with the right proof","industry":"Utilities","outcome":"Higher first-time-fix rates and auditable work from dispatch through customer sign-off.","website":"/use-cases/field-service"},{"slug":"energy-grid-resilience","title":"Restore the grid from alarm to verified service","industry":"Energy","outcome":"Faster, safer restoration with an explainable view of affected assets, customers, crews, and residual risk.","website":"/use-cases/energy-grid-resilience"},{"slug":"insurance-claims","title":"Evidence-led claims from incident to settlement","industry":"Insurance","outcome":"Faster, more consistent claims decisions with tamper-aware spatial evidence.","website":"/use-cases/insurance-claims"},{"slug":"smart-city-operations","title":"A living operations map for the city","industry":"Government","outcome":"One governed view from daily operations to infrastructure investment planning.","website":"/use-cases/smart-city-operations"},{"slug":"aviation-ground-operations","title":"Run a safe, punctual airport turnaround","industry":"Aviation","outcome":"More predictable departures with safer vehicle movement and attributable hand-offs across airport and airline teams.","website":"/use-cases/aviation-ground-operations"},{"slug":"agriculture-field-ops","title":"Coordinate field operations across every plot","industry":"Agriculture","outcome":"Less travel and better traceability for inspection, inputs, harvest, and compliance.","website":"/use-cases/agriculture-field-ops"},{"slug":"mining-haulage-safety","title":"Move material safely across a changing mine","industry":"Mining","outcome":"Higher productive haulage with fewer route conflicts, stale-map movements, and unexplained cycle losses.","website":"/use-cases/mining-haulage-safety"},{"slug":"telecom-network-care","title":"Operate the network from tower to doorstep","industry":"Telecommunications","outcome":"Faster restoration with better prioritization and fewer repeat dispatches.","website":"/use-cases/telecom-network-care"}]},"releaseGates":["Every command has tenant, actor, purpose, idempotency, expected-version, and authorization evidence.","Every state transition has an objective evidence rule and an explicit recovery path.","Provider and business identities remain distinct, versioned, and reconcilable.","Timeout, retry, duplicate, late, out-of-order, conflict, restart, and outage paths are tested.","Sensitive location, media, identity, and operational evidence has consent, access, retention, and redaction policy.","Audit and outbox commit atomically; signing, delivery, dead-letter, replay, and lease fencing are verified.","Operators can find one aggregate, explain its state, repair safely, and prove who acted.","Live Mappls entitlement, quota, regional behavior, callbacks, and exact provider contracts are validated before production."],"handoffs":{"website":"https://developer.mappls.com/tools/stateful?product=workmate","api":"https://developer.mappls.com/api/stateful-plan?product=workmate","console":"https://developer.mappls.com/console/apps","resource":"mappls://catalog/stateful","tool":"mappls_plan_stateful_integration"},"credentialRule":"The planner accepts no credential, token, secret, precise location, media, or provider resource identifier."}