Build Flows

Integrations · October 10, 2026 · 15 min read

Build vs Buy for Construction Integrations: Code, iPaaS or Connector

A vendor-neutral comparison of the five ways to connect construction systems, with the technical questions that decide between them: authentication, webhooks vs changed-data queries, API requirements, error handling and ownership cost.

By Charley Forey, founder of Build Flows

The short answer: There are five realistic ways to connect construction systems: point-to-point code you write and run, a native integration one of the vendors already offers, a general iPaaS with pre-built connectors, a custom connector built on an iPaaS SDK, and a low-code flow tool such as Power Automate or n8n. None is right everywhere. Use a native integration when it covers your workflow, an iPaaS when you have several systems and want shared authentication, monitoring and reuse, a custom connector when the platform you already use is missing one system, low-code for simple and well-bounded flows, and your own code when the logic is genuinely unusual or performance-critical. The decision turns less on how fast you can build the first version and more on who handles authentication, change detection, failures and API changes for the next five years.

This guide compares the options side by side, then walks through the technical questions that decide between them: authentication, how changes are detected, what an API needs before a good connector is even possible, error handling, and the ownership cost after go-live. It ends with a decision checklist. Our view comes from building integrations on both sides of the line: connectors in C# on an iPaaS SDK (for HCSS, Ramp, Bluebeam, Workyard and Power BI, among others, built while we worked on Trimble App Xchange), flows on that platform, custom integration services, and Power Automate and n8n builds for contractors.

If your question is the broader one of buying construction software versus building it, start with build vs buy for construction software. This article is only about the connections between systems.

The five options compared

OptionWhat it isBest whenWatch out for
Point-to-point codeYour own service calls both APIs directlyUnusual logic, high volume, strict performance or hosting requirements, an in-house team to run itYou own auth, retries, monitoring, logging and every API change, forever
Native vendor integrationA connection one of the two vendors builds and supportsIt covers your workflow as-is and both vendors stand behind itFixed field mappings, limited control over timing and errors, one-directional or partial coverage
iPaaS with pre-built connectorsA platform that hosts connectors and flows between many systemsSeveral systems, recurring integration needs, desire for shared monitoring and reuseConnector coverage of the specific endpoints you need, platform data limits, cache freshness
Custom connector on an iPaaS SDKYou build the missing connector to the platform's SDK, then use normal flowsYou already use the platform and one system is missing or only partly coveredYou (or your builder) maintain the connector when the vendor's API changes
Low-code flows (Power Automate, n8n)Visual flows using the tool's connectors or HTTP stepsSimple, bounded flows; Microsoft 365 or self-hosted shops; prototypesLogic sprawl across many flows, weak version control, auth and paging hand-built in HTTP steps

Most contractors end up with a mix. A common healthy shape is native integrations where they exist and are good enough, one iPaaS or flow platform for the rest, and custom code only where it earns its place. The unhealthy shape is the same five tools each holding a different copy of the vendor list.

Who carries the work after go-live for each option. Point-to-point code: auth, failure handling and API changes are all yours. Native integration: the vendor handles auth and API changes, with limited control over errors. iPaaS connectors: the platform handles auth and API changes, and failure handling is often built in. Custom connector: the platform handles auth and often failure handling, but API changes are yours or your builder's. Low-code flows: built-in connectors handle auth but HTTP steps are yours, failure handling is yours and often skipped, and API changes fall to whoever built the flowThe same five options, viewed by who does the work after go-live.

For software vendors: native integration or embedded platform

Construction software companies face a mirror image of this decision. Customers ask you to connect your product to their ERP, their PM system and their payroll provider. Building each as a native integration gives you full control over the experience, but every one adds an API you must learn, an auth flow you must maintain and a support queue. Building one connector for your product on an iPaaS your customers already use, and letting flows handle each customer's specifics, trades some control for reach. The technical questions below apply either way.

Authentication: the cost nobody estimates

Authentication looks like a day's work in a proof of concept and becomes a permanent job in production.

The patterns you will meet in construction APIs:

PatternHow it worksOperational burden
API keyA static key sent with each requestRotation, storage, and keys that never expire if nobody rotates them
HTTP BasicUsername and password per requestSame as API keys, plus password policies breaking integrations
OAuth 2.0 client credentialsThe integration exchanges a client ID and secret for a short-lived tokenToken caching and refresh, secret rotation
OAuth 2.0 authorization codeA user signs in and grants access; the integration holds a refresh tokenRefresh tokens that expire or are revoked, re-consent when the user leaves the company

The difference between the last two is bigger than it looks. When we built connectors, HCSS used client credentials, so the connection belongs to the integration. Ramp used the authorization code flow, so a person at the customer had to authorize the connection, and the integration depends on that grant staying valid. In the SDK it was close to a one-flag difference; in operations it decides who gets the call when the connection breaks.

What to ask of any option:

  • Who stores the credentials, and where? A platform with a managed credential store, or your own secrets vault. Never a config file on a server.
  • Who refreshes tokens? Each vendor sets its own expiry rules. Something has to refresh before expiry and handle a refresh failure gracefully.
  • What happens when a token is revoked? The right answer is a clear alert to a named owner, not a week of silently failed syncs.
  • Is access scoped? The integration identity should have only the permissions its flows need, in line with least privilege. An integration user with full admin in the ERP is a common audit finding.
  • Multi-tenant? If you are a vendor connecting to many customers, you are managing one set of tokens per customer, each with its own expiry and failure modes.

An iPaaS takes most of this on: it stores the credentials, refreshes tokens, and surfaces failed connections in one place. With point-to-point code, all of it is yours. With low-code tools, the built-in connectors handle it, but custom HTTP steps often push you back to hand-managed keys.

Change detection: webhooks, polling and changed-data queries

Every integration has to answer "what changed since last time?" There are three ways, and the API decides which you can use.

Three ways to detect changes, shown with three of twelve source records changed. Webhooks: the source pushes only the three changes, near real time and low load, but missed deliveries need a recheck. Full polling: all twelve records are read and compared, at high load, but any list API works. Changed-data queries: the integration asks for records modified since a time and receives only the three changes, at low to moderate load, but deletes are missed. Deletes need delete events, status changes or a periodic full comparisonWhat each method moves across the wire when three records have changed.

Webhooks

The source system calls your endpoint when something changes. Webhooks are the fastest option and the least wasteful, but in practice:

  • Not every system offers them, and those that do rarely cover every object and event you need.
  • Deliveries get missed during outages, so you still need a periodic reconciliation to catch what was dropped.
  • Your receiving endpoint must be public, authenticated, and able to handle duplicates and out-of-order events, which means designing writes for idempotency.

Polling full lists

On a schedule, read everything and compare with what you saw last time. It works with any API that can list records, but it is slow and expensive at construction volumes. Reading every job cost transaction every 15 minutes to find the three that changed is how integrations hit rate limits and data caps.

Changed-data queries

The middle ground, and the one we look for first: the API lets you ask for records modified since a timestamp or after a change token. You poll, but you only receive what changed. This is what makes scheduled replication into an iPaaS cache practical, and it is the single most important feature to check in an API before committing to an integration design.

MethodFreshnessLoad on the sourceWhat the API must supportStill need reconciliation?
WebhooksNear real timeLowEvent subscriptions for the objects you needYes, for missed deliveries
Full pollingAs often as you can affordHighList endpoints with paginationBuilt in, but expensive
Changed-data queriesAs often as you scheduleLow to moderateA reliable modified-since filter or change tokenOccasionally, for deletes

Deletes are the gap in most changed-data designs. A record that was deleted does not show up in "modified since" results. Ask whether the API exposes deleted records, a status change or a delete event; if not, plan a periodic full comparison for the objects where deletes matter. In construction systems, most "deletes" should really be status changes (closed job, inactive vendor), which is easier to sync anyway.

Whatever the method, remember that "real time" on an iPaaS often means "as fresh as the last replication". We cover that cache-versus-action distinction, and why the schedule interval must exceed the replication run time, in the anatomy of a construction integration flow.

What an API must support for a good connector

Before choosing any option, assess the API itself. When we scoped a new connector, these were the things that decided what it could do reliably:

CapabilityWhy it mattersIf it is missing
Create, read, update, delete endpoints for the objects in scopeA flow can only write what the API lets it writeRead-only integration, or manual steps for writes
Filtering by job, company, status and datePull open jobs, not every job since 1998Large reads, slow syncs, data limits
Pagination with stable orderingReliable reading of large listsMissed or duplicated records on large sets
Changed-data queries (modified since, change tokens)Efficient incremental syncFull polling or webhooks only
Clear errors with useful messages and status codesFailures can be routed to the person who can fix the dataGeneric failures that need an engineer to diagnose
Documented rate limitsThe client can pace itselfUnexplained throttling under load
A published OpenAPI specificationFaster, more accurate client generation and testingHand-reading docs endpoint by endpoint
A sandbox or test companyWrites can be tested safelyTesting against production, or not testing writes

The iPaaS connector requirements we worked to asked for exactly this: HTTP/REST endpoints, supported authentication (API key, Basic or OAuth 2.0 client credentials or authorization code), documentation covering CRUD operations and parameters for filtering, pagination and changed-data queries, and an OpenAPI 3.0 specification preferred but not mandatory. Those are good requirements for any integration, platform or not.

API readiness checklist. CRUD endpoints, filtering, pagination and changed-data queries decide what a connector can do; without them you get read-only integrations, large reads, missed or duplicate records, or full polling. Clear errors, documented rate limits, an OpenAPI specification and a sandbox make it faster and safer; without them engineers diagnose each failure, throttling is unexplained, client builds are slower and writes are tested in productionThe eight API capabilities to check before committing to a design, and what happens without each.

An API that lacks changed-data queries and filtering is not a dead end, but it pushes you toward custom code with careful paging and local state, or toward file-based exchange. Know that before you promise anyone a 15-minute sync.

Designing the connector around the business, not the endpoints

If you do build a connector, model it around records people recognize. Name data objects after the business record ("Vendor", "Timecard", "Equipment Hours"), not the endpoint path. Separate list objects from single-record objects where the API does, because they replicate differently. Handle rate limits and retries once, in the client, so no flow has to. Test against recorded responses so a vendor API change shows up as a failing test, not a failing customer flow. And follow two guidelines that save the most pain later: avoid hardcoding values, and keep schemas backward compatible so existing flows do not break when you add fields.

Error handling and remediation

Every integration fails. A vendor is missing in the target, a cost code is inactive, a job is closed, a required field is blank, an API returns a 500. The options differ sharply in what happens next.

The pattern to insist on, whatever you build with:

  1. Validate before writing. Check that the job is open, the cost code exists and the amount is non-zero before sending anything. A refused write is cheaper than a bad record in the ERP.
  2. Retry only what is transient. Timeouts, rate limits and 5xx errors deserve retries with backoff. A validation error will fail the same way every time.
  3. Turn failures into owned work items. A failed write should create a task with the record, the error, the flow and version, and an owner, sent to the person who can fix the data. "Invoice 4471 failed: vendor V1029 does not exist" belongs with the AP clerk, not in a log file an engineer reads weekly.
  4. Make retries safe. After the data is fixed, re-running the record must not create a duplicate. That needs a crosswalk of source and target IDs and idempotent writes.
  5. Reconcile. A periodic check that counts and totals match between systems catches the failures nobody saw.

On an iPaaS, steps 3 and 4 are often built in as remediation flows and work items. In Power Automate or n8n, you build them yourself, and they are frequently skipped. In custom code, they are entirely your design. Our guide to construction data quality rules covers the validation side in more depth.

Maintenance and ownership cost

The first version of an integration is the cheap part. The cost that decides build versus buy is everything after go-live:

  • API changes. Vendors deprecate endpoints, add required fields and change pagination. Someone has to notice, update the client and retest.
  • Credential churn. Secrets expire, the person who authorized an OAuth connection leaves, an admin password policy changes.
  • Volume growth. A flow that handles 50 jobs comfortably can struggle at 500, especially around month-end and payroll week.
  • Business changes. New cost codes, a new company in the ERP, an acquisition, a change in who approves what.
  • Knowledge. Point-to-point code written by one person is a single point of failure. So is a tangle of low-code flows nobody documented.

Ask of each option: when the vendor changes its API, who fixes it, and how quickly would we know it broke? With a native integration or a maintained iPaaS connector, the vendor or platform owns that. With a custom connector or your own code, you do, or the firm you hired does. With low-code, it is usually whoever built the flow, who may not be there next year.

None of this means custom is wrong. It means custom needs an owner, version control, tests, monitoring and a budget line for maintenance from day one. We put every integration we build in source control with a version number in each flow's name, so the run history always shows which logic processed a record.

How the low-code tools fit

Power Automate and n8n deserve a fair hearing, because for many contractors they are the right first tool.

The same discipline applies as on any platform: one owner per object, explicit create/update/delete scope, validation before writes, failures routed to people, and flows in version control.

Decision checklist

Work through these in order. The first one that clearly applies usually decides it.

  1. Does a native integration already cover the workflow as-is? If both vendors support it and it does what you need, start there. Check field coverage, direction and timing first.
  2. Do you already run an iPaaS or flow platform? If so, check whether it has connectors for both systems, and whether they cover the specific endpoints you need, not just the system name.
  3. Is only one system missing? Build a custom connector on the platform's SDK rather than a separate point-to-point service. Every future flow can reuse it.
  4. Is the flow simple, bounded and mostly inside Microsoft 365 or a self-hosted stack? Power Automate or n8n is likely enough.
  5. Is the logic genuinely unusual, the volume high, or the hosting constrained? Custom code is justified, with an owner and a maintenance budget.

Decision tree worked top to bottom: if a native integration covers the workflow as-is, use it; otherwise, if you already run an iPaaS or flow platform with both connectors, use them; otherwise, if only one system is missing, build a custom connector on the platform SDK; otherwise, if the flow is simple and inside Microsoft 365 or a self-hosted stack, use Power Automate or n8n; otherwise, if the logic is unusual, the volume high or hosting constrained, write custom code with an owner and budget; if still unsure, run discovery firstWork down the questions; the first clear yes usually decides.

Then check these regardless of option:

  • Does the API support CRUD, filtering, pagination and changed-data queries for the objects in scope?
  • Which authentication pattern applies, who stores credentials, and who is alerted when a token fails?
  • Webhooks, polling or changed-data queries, and how are deletes detected?
  • Which system owns each object and field?
  • Is there a crosswalk of IDs so updates never create duplicates?
  • Do failures become work items with an owner, and are retries safe?
  • Is there a reconciliation check?
  • Who maintains it when the vendor's API changes, and how will you know it broke?
  • Is it in version control, with versions visible in the run history?

If several of those answers are still "we don't know yet", spend a week on discovery before choosing a tool. Our integration discovery questions are the list we use.

Where to go next

Frequently asked questions

When should a contractor use an iPaaS instead of custom code?

When you have several systems to connect, recurring integration needs and want shared authentication, monitoring and reuse. Custom code is justified when the logic is unusual, volumes are high or hosting is constrained, and only with an owner and a maintenance budget.

What is a custom connector?

A connector built to an integration platform's SDK for a system the platform does not yet cover, or covers only partly. It handles authentication, paging and the system's record shapes once, so every flow on the platform can reuse it.

Are webhooks better than polling for construction integrations?

Webhooks are faster, but not every system offers them for every object and deliveries get missed. Changed-data queries, which return only records modified since a timestamp, are often the most reliable option. Either way, keep a periodic reconciliation.

What should an API support before we commit to an integration?

Create, read, update and delete endpoints for the objects in scope, filtering, stable pagination, changed-data queries, clear error messages and documented rate limits. An OpenAPI specification and a sandbox make the build faster and safer.

Is Power Automate good enough for construction integrations?

For simple, bounded flows inside Microsoft 365 it often is. It gets harder with custom HTTP calls, paging, complex mapping and many flows sharing logic, so apply the same discipline: one owner per object, validation before writes and failures routed to people.

Next step

Need this connection in your environment?

Scope one integration: the records, direction, timing, and business rules behind the connection.

Prefer email? charley@buildflows.ai

Get the next guide in your inbox

Field Notes: practical guides and new walkthroughs, about once a month.

Field Notes

Practical guides and new walkthroughs on construction data and automation, roughly monthly.

Keep learning