Keep another system in step
Design a sync from your CRM, scheduling or job system to GeotechOS that never makes a record twice and survives outages.
Many teams keep their scheduling or CRM in another system and send its records to GeotechOS as they change. This page tells you how to build that sync so it is safe to run again and again.
Send records as they change
- When a record is saved in your system, put it in a queue.
- A worker takes it from the queue and sends it with
PUT /{resource}/ext:{your id}. - If the request fails because GeotechOS cannot be reached, try again later.
PUTis safe to send again.
Send after your own database saves the record, not during the save. Then a change that your system does not keep is never sent.
Send the parents first
A record must name records that are already in GeotechOS. Send them in this order:
- Staff accounts, if you send them.
- The client.
- The client contacts.
- The project, which names the client and the contacts.
- The job, which names the project and the crew.
Keep a table of what you sent and when. Before you send a job, check that its project was sent. If it was not, send the project first.
Backfill, then follow changes
When you start, send the records that are in use now. For example, send the projects with work in the last 90 days, and their clients and jobs. Then send changes as they happen. Use the same code for both. A backfill then also tests the code your live sync uses.
Do not send records that nobody will use. A smaller first sync is easier to check.
When your system deletes a record
GeotechOS has no delete. Send the state the record is left in:
| In your system | Send to GeotechOS |
|---|---|
| A job is deleted or cancelled | cancelled_at and cancellation_reason |
| A project is closed or deleted | "is_archived": true |
| A client is no longer used | "is_active": false |
| A person leaves | "is_active": false on the staff account |
Times and time zones
Send every time with its offset from UTC, for example 2026-11-03T07:00:00+11:00. If your database keeps local times with no zone, add the zone of your office before you send them. Send days, such as a project's start date, as days: 2026-11-03.
When GeotechOS refuses a record
| Status | What to do |
|---|---|
422 |
The record has a problem. Keep it in a list of failed records, show it to a person, and do not try again until it changes |
409 |
The record conflicts with one in GeotechOS. A person must decide |
429 |
Wait for the seconds in the Retry-After header, then send it again |
500 to 504, or no answer |
Try again later, with a longer wait each time |
Log the X-Request-Id header of every refused request. GeotechOS support can find the request with it.
Do not overwrite the office's work
Send only the fields your system owns. A field you leave out keeps its value in GeotechOS. For example, do not send an empty description because your system has none: leave it out.