Odyssee Field Service
ERPConnect AI agents to Odyssee Field Service (also branded Wello), field service management software. Agents open and update work orders, dispatch tasks to technicians, manage companies, contacts, and projects, book meetings, and read the article and purchase order records behind a job.
What This Integration Enables
Odyssee Field Service, also branded Wello Field Service, is built for companies that install, service and maintain equipment, and the thing that separates that business from generic ticketing is the installation. A job is not work done for a customer, it is work done to a machine at an address, and the machine has a history that outlives every technician who has touched it. Odyssee models that as a project, and the API enforces it: a job created without a project_id, or a matching reference_back_office, is rejected with HTTP 422 and a descriptive message, because a job must reference an installation. That single validation rule is the best thing about this connector, and it is worth building flows around rather than working around.
The API is a stateless OData v4 REST service, and list operations support server side filtering, ordering, column selection and paging, so flows scope large data sets at the vendor rather than in the flow. Companies and contacts are the customer side, fully writable through List Companies, Get Company, Create Company, Update Company and the matching contact actions. Work orders are the job, through List Work Orders, Get Work Order, Create Work Order and Update Work Order, with tasks sitting underneath them through List Tasks, Get Task, Create Task and Update Task. Projects, the installations and assets, are writable through List Projects, Get Project, Create Project and Update Project. Meetings are bookable against a project through List Meetings and Create Meeting. Two areas are read only and it is worth saying so directly rather than implying otherwise: articles, the products and parts catalog, are available through List Articles and Get Article only, with no create or update, and purchasing is available through List Purchase Orders and List Purchase Order Details only, with no way to raise or amend a purchase order from here. Users are read only too, through List Users and Get User, which is the right shape for resolving a technician rather than managing a roster.
Two behaviours change how you design. There is no delete: the REST API exposes no DELETE verb for the top level entities this connector covers, and companies in particular cannot be deleted at all. To take a record out of active lists you update it with archived: true through the Additional Fields object, where the entity supports it. And statuses, types and priorities are not fixed enums. Job status, job type, job priority, task status and project status are GUID foreign keys into per tenant lookup tables, so this connector ships no hardcoded value dropdowns and instead reads those lookup tables live, which means a status is always a GUID resolved from the account it is being written to. Create and update semantics are conventional: creates POST to the collection, updates PUT to /Entity(id) using the OData key syntax with a GUID, and an update sends only the fields you provide. Every documented field the typed parameters do not cover, including the many udf1..N user defined fields and the full address blocks, goes through the Additional Fields object.
On events, this connector has no triggers. The Odyssee API publishes no webhook subscription mechanism at all, so real time events are not available, there is no action here that registers one, and nothing creates a FlowRunner trigger. Change detection is a scheduled poll of a list action filtered on the standard modified_dateutc timestamp, for example modified_dateutc gt '2024-01-01T00:00:00.000Z', carrying the last seen timestamp between runs. OData is case sensitive, so operators are lowercase, and, eq, gt. Every list response is paged at 20 items by default, with an @odata.nextLink for the next page and rows under value.
Without FlowRunner
With FlowRunner
Use Case Scenarios
Service requests that become jobs against the right machine
Requests arrive from a web form, a customer email and a support queue, and each one names a site and a symptom rather than an installation ID. The agent reads new submissions from Typeform and from Gmail, then calls List Companies with an OData filter on name or reference to resolve the customer to a real company GUID, and List Projects filtered to that company to find the installation the symptom belongs to. Where exactly one installation matches, it calls Create Work Order referencing that project, because a job without a project reference is rejected with a 422 rather than created loosely. Where the customer has several installations and the request does not distinguish them, the flow does not guess: it asks the customer through the same channel which unit is affected, then creates the job. Create Task adds the specific work items underneath, and the job reference goes back to the requester. Every job that exists in Odyssee after this flow is attached to a machine with a history.
A dispatch summary the field team actually reads
The field team needs to know what moved, and nobody wants to open the platform to find out. On a schedule the agent calls List Work Orders with $filter set to modified_dateutc gt the timestamp held from the previous run, paging through the 20 record default with Top and Skip until @odata.nextLink runs out. For each changed job it calls Get Work Order for the detail and Get Project for the installation and site, and List Tasks for the work items underneath. It joins the assigned technician through List Users, then posts one summary to the field channel in Slack: jobs newly created, jobs whose status GUID changed and what that status is called in this tenant's lookup table, jobs reassigned, and jobs whose scheduled date has passed with no status movement. The same rows are appended to Google Sheets for the weekly review. This run writes nothing to Odyssee, which is what makes it safe to schedule every hour.
Customers and installations kept in step with the CRM
Odyssee holds the installed base and the CRM holds the commercial relationship, and the two drift. On a nightly run the agent calls List Companies and List Contacts filtered on modified_dateutc to find what changed on the field service side, and pushes the changes into HubSpot matched on a reference held in a user defined field. In the other direction, new customers won in the CRM become Create Company and Create Contact calls in Odyssee, followed by Create Project to register the equipment being installed so the first service visit has something to hang from. Where a customer relationship ends, the flow does not delete: the API exposes no DELETE verb, and companies cannot be deleted at all, so it updates the record with archived: true through Additional Fields where the entity supports it and reports the ones where it does not. List Articles is read alongside to attach the correct product references to a new installation, since the article catalog is read only here and is a lookup rather than something a flow maintains.
Human-in-Loop Highlight
Update Work Order is the gate, at the moment it assigns a technician and moves the job to a new status, because that call is the point where a software decision becomes a person driving to an address. Two things about this connector make it worth stopping there rather than trusting the automation. First, job status, job type and job priority are not enums. They are GUID foreign keys into per tenant lookup tables, so the status an agent writes is a GUID that means whatever this account decided it means, and a GUID resolved from a test tenant, a sister company or a stale mapping is a perfectly valid identifier pointing at the wrong state. A job moved into a status the dispatch board does not filter on has not been dispatched, it has been hidden, and nobody gets an error. Second, there is no undo of the ordinary kind: this API exposes no DELETE verb for these entities, so a job assigned to the wrong technician is corrected by another update rather than removed, and by the time the correction runs the first technician may already be on the road. Add to that the fact that the job must reference an installation to exist at all, which means a badly matched project on creation puts today's visit on the wrong machine's service history, and that record is what the next contract renewal is priced from. So the agent does the resolution work and then stops. It posts to the dispatcher: "14 jobs ready to dispatch for tomorrow. For each I have resolved the installation through Get Project, the customer site address, and a candidate technician from List Users based on region and current task load. 11 are straightforward. 3 are not. Job for Van Dijk Koeling: two technicians are equally close and one already has 4 tasks open at that site. Job at Meridiaan 12: the installation I matched was last serviced 3 years ago and the customer has a newer unit at the same address, so I may have the wrong project. Job for Brouwer BV: the status you normally use for dispatch resolves to two entries in this tenant's status lookup, Gepland and Ingepland, and I do not know which one your board filters on. Confirm the 11, and answer those 3, and I will write the assignments." The dispatcher answers once, in their own vocabulary. This is the human-in-the-loop moment in field service: an agent can resolve a GUID, calculate travel and read a service history, and only a person can commit a named human to a customer's site tomorrow morning.
Agent Capabilities
28 actionsCompanies
4- List Companies Lists customer companies with OData filtering, ordering, column selection and paging. Filter on `modified_dateutc` for change detection.
- Get Company Returns a single company addressed by its GUID using the OData key syntax `/Company(id)`.
- Create Company Creates a customer company. Note that companies cannot be deleted through this API at all, so a duplicate created here is permanent.
- Update Company Updates a company, sending only the fields you provide. Additional documented fields, including the `udf1..N` user defined fields and full address blocks, go through the Additional Fields object.
Contacts
4- List Contacts Lists contacts with OData filtering, ordering and paging.
- Get Contact Returns a single contact by GUID.
- Create Contact Creates a contact against a company.
- Update Contact Updates a contact, sending only the fields provided.
Work Orders
4- List Work Orders Lists work orders with OData filtering. This is the scheduled poll that stands in for the events this connector does not receive, filtered on `modified_dateutc gt` the last seen timestamp.
- Get Work Order Returns a single work order by GUID, with its status, type, priority and assignment.
- Create Work Order Creates a job. It must reference an installation through `project_id` or a matching `reference_back_office`, or the API rejects it with HTTP 422, which is the rule that keeps service history attached to equipment.
- Update Work Order Updates a job, including moving it to a new status GUID and reassigning the technician. Statuses are per tenant lookup GUIDs rather than enums, and there is no delete to fall back on, so a dispatch write runs behind an approval.
Tasks
4- List Tasks Lists the tasks sitting under work orders, with OData filtering.
- Get Task Returns a single task by GUID.
- Create Task Creates a task, the individual work item a technician completes on site.
- Update Task Updates a task, including its status GUID from this tenant's task status lookup table.
Projects
4- List Projects Lists projects, the installations and assets that jobs are logged against. Filtering by company is how a symptom at an address is resolved to a machine.
- Get Project Returns a single project by GUID, with the installation detail behind a job.
- Create Project Registers an installation or asset so field jobs can be logged against the right equipment.
- Update Project Updates an installation record, sending only the fields provided.
Articles
2- List Articles Lists the article catalog, the products and parts. Read only: there is no create or update for articles in this connector, so this is a lookup rather than a catalog you maintain from here.
- Get Article Returns a single article by GUID. Read only.
Users
2- List Users Lists users, the technicians a job can be assigned to. Read only, and the resolution step before any assignment is proposed.
- Get User Returns a single user by GUID. Read only.
Meetings
2- List Meetings Lists meetings booked against projects.
- Create Meeting Books a meeting against a project, for example a survey or a handover visit that is not a service job.
Purchasing
2- List Purchase Orders Lists purchase orders. Read only: this connector cannot raise, amend or approve a purchase order, so purchasing data is available for reporting and reconciliation rather than for ordering.
- List Purchase Order Details Lists the lines of a purchase order. Read only, and useful for matching parts arriving against the jobs waiting on them.
Frequently Asked Questions
What can FlowRunner do with Odyssee Field Service?
FlowRunner agents can run List Companies, Get Company, and Create Company in Odyssee Field Service, plus 25 more actions.
Does connecting Odyssee Field Service to FlowRunner require OAuth?
No. Odyssee Field Service connects to FlowRunner with basic authentication (a username and password), no OAuth flow required.
Can Odyssee Field Service trigger a FlowRunner workflow automatically?
Odyssee Field Service doesn't currently expose triggers in FlowRunner. It connects as an action step inside workflows started by another trigger.
Start building with Odyssee Field Service
$100 in credits. No card required. Connect in minutes.