Skip to main content
maintainx-reference-architecture Production-grade architecture patterns for MaintainX integrations.
Use when designing system architecture, planning integrations,
or building enterprise-scale MaintainX solutions.
Trigger with phrases like "maintainx architecture", "maintainx design",
"maintainx system design", "maintainx enterprise", "maintainx patterns".
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/jeremylongshore/claude-code-plugins-plus-skills --skill maintainx-reference-architecture명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... jeremylongshore
jeremylongshore/claude-code-plugins-plus-skills
GitHub 저장소 열기 name maintainx-reference-architecture description Production-grade architecture patterns for MaintainX integrations.
Use when designing system architecture, planning integrations,
or building enterprise-scale MaintainX solutions.
Trigger with phrases like "maintainx architecture", "maintainx design",
"maintainx system design", "maintainx enterprise", "maintainx patterns".
allowed-tools Read, Write, Edit version 1.11.0 license MIT author Jeremy Longshore <jeremy@intentsolutions.io> tags ["saas","maintainx","scaling"] compatibility Designed for Claude Code, also compatible with Codex and OpenClaw
MaintainX Reference Architecture
Overview
Production-grade architecture patterns for building scalable, maintainable integrations between MaintainX and enterprise systems (ERP, SCADA, data warehouses).
Prerequisites
Understanding of distributed systems
Cloud platform experience (GCP, AWS, or Azure)
MaintainX API familiarity
Instructions
Step 1: Event-Driven Sync Architecture
The recommended architecture for most MaintainX integrations. Uses webhooks for real-time updates and scheduled jobs for reconciliation.
MaintainX API ──webhook──→ Cloud Run ──→ Pub/Sub ──→ Cloud Functions
│
├──→ BigQuery (analytics)
├──→ ERP System (SAP, Oracle)
└──→ Notification Service
import express from 'express' ;
import { PubSub } from '@google-cloud/pubsub' ;
const app = express ();
const pubsub = new PubSub ();
const topic = pubsub.topic ('maintainx-events' );
app.post ('/webhooks/maintainx' , async (req, res) => {
const { event, data } = req.body ;
await topic.publishMessage ({
data : Buffer .from (JSON .stringify ({ event, data })),
attributes : { event, resourceId : (data. ) },
});
res. ( ). ({ : });
});
subscription = pubsub. ( );
subscription. ( , (message) => {
{ event, data } = . (message. . ());
(event) {
:
(data);
(data);
;
:
(data. === ) {
(data);
}
;
}
message. ();
});
String
id
status
200
json
status
'queued'
const
subscription
'maintainx-events-sub'
on
'message'
async
const
JSON
parse
data
toString
switch
case
'workorder.completed'
await
syncToERP
await
updateAnalytics
break
case
'workorder.created'
if
priority
'HIGH'
await
sendUrgentNotification
break
ack
Step 2: Bi-Directional Sync Gateway For integrating MaintainX with ERP systems (SAP, Oracle) where changes flow both ways.
ERP (SAP/Oracle) ←──→ Sync Gateway ←──→ MaintainX API
│
Conflict Resolution
+ Audit Trail
+ Sync State DB
interface SyncRecord {
externalId : string ;
maintainxId : number ;
lastSyncAt : string ;
syncDirection : 'inbound' | 'outbound' | 'bidirectional' ;
hash : string ;
}
class SyncGateway {
constructor (
private maintainx : MaintainXClient ,
private erp : ERPClient ,
private db : SyncStateDB ,
) {}
async syncToERP (workOrder : any ) {
const existing = await this .db .findByMaintainxId (workOrder.id );
if (existing && this .hash (workOrder) === existing.hash ) {
return ;
}
const erpRecord = this .mapToERP (workOrder);
if (existing) {
await this .erp .update (existing.externalId , erpRecord);
} else {
const created = await this .erp .create (erpRecord);
await this .db .create ({
externalId : created.id ,
maintainxId : workOrder.id ,
lastSyncAt : new Date ().toISOString (),
syncDirection : 'outbound' ,
hash : this .hash (workOrder),
});
}
}
async syncFromERP (erpRecord : any ) {
const existing = await this .db .findByExternalId (erpRecord.id );
const woData = this .mapFromERP (erpRecord);
if (existing) {
await this .maintainx .updateWorkOrder (existing.maintainxId , woData);
} else {
const created = await this .maintainx .createWorkOrder (woData);
await this .db .create ({
externalId : erpRecord.id ,
maintainxId : created.id ,
lastSyncAt : new Date ().toISOString (),
syncDirection : 'inbound' ,
hash : this .hash (created),
});
}
}
private mapToERP (wo : any ) {
return {
title : wo.title ,
status : this .mapStatus (wo.status ),
priority : wo.priority ,
completedAt : wo.completedAt ,
};
}
private mapFromERP (erp : any ) {
return {
title : erp.description ,
priority : erp.urgency === 'HIGH' ? 'HIGH' : 'MEDIUM' ,
};
}
private mapStatus (status : string ) {
const map : Record <string , string > = {
OPEN : 'PLANNED' ,
IN_PROGRESS : 'ACTIVE' ,
COMPLETED : 'FINISHED' ,
CLOSED : 'ARCHIVED' ,
};
return map[status] || 'UNKNOWN' ;
}
private hash (obj : any ): string {
return require ('crypto' ).createHash ('md5' )
.update (JSON .stringify (obj)).digest ('hex' );
}
}
Step 3: Analytics Data Pipeline MaintainX API ──scheduled──→ Cloud Functions ──→ BigQuery
│
Looker / Metabase
│
KPI Dashboards:
- MTTR (Mean Time to Repair)
- PM Compliance %
- Work Order Backlog
- Asset Downtime
interface MaintenanceKPIs {
mttr : number ;
pmCompliance : number ;
backlog : number ;
completionRate : number ;
}
async function calculateKPIs (client : MaintainXClient ): Promise <MaintenanceKPIs > {
const completed = await paginate (
(cursor ) => client.getWorkOrders ({ status : 'COMPLETED' , limit : 100 , cursor }),
'workOrders' ,
);
const open = await paginate (
(cursor ) => client.getWorkOrders ({ status : 'OPEN' , limit : 100 , cursor }),
'workOrders' ,
);
const repairTimes = completed
.filter ((wo : any ) => wo.createdAt && wo.completedAt )
.map ((wo : any ) => {
const created = new Date (wo.createdAt ).getTime ();
const completed = new Date (wo.completedAt ).getTime ();
return (completed - created) / 3600000 ;
});
const mttr = repairTimes.length > 0
? repairTimes.reduce ((a : number , b : number ) => a + b, 0 ) / repairTimes.length
: 0 ;
const pmOrders = completed.filter ((wo : any ) =>
wo.categories ?.includes ('PREVENTIVE' ),
);
const allPM = [...pmOrders, ...open.filter ((wo : any ) =>
wo.categories ?.includes ('PREVENTIVE' ),
)];
const pmCompliance = allPM.length > 0 ? (pmOrders.length / allPM.length ) * 100 : 100 ;
return {
mttr : Math .round (mttr * 10 ) / 10 ,
pmCompliance : Math .round (pmCompliance),
backlog : open.length ,
completionRate : completed.length / (completed.length + open.length ) * 100 ,
};
}
Step 4: Multi-Site Architecture Site A (Plant) Site B (Warehouse) Site C (Office)
└── Local Agent └── Local Agent └── Local Agent
│ │ │
└─────────── Central Hub (Cloud Run) ────────────────┘
│
MaintainX API
(Org-level access)
const siteConfigs = {
'plant-austin' : { orgId : 'org-1' , apiKey : process.env .MX_KEY_PLANT },
'warehouse-dallas' : { orgId : 'org-2' , apiKey : process.env .MX_KEY_WAREHOUSE },
'office-houston' : { orgId : 'org-3' , apiKey : process.env .MX_KEY_OFFICE },
};
function getClientForSite (siteId : string ): MaintainXClient {
const config = siteConfigs[siteId as keyof typeof siteConfigs];
if (!config) throw new Error (`Unknown site: ${siteId} ` );
return new MaintainXClient (config.apiKey , config.orgId );
}
Output
Event-driven architecture with Pub/Sub for decoupled processing
Bi-directional sync gateway with conflict resolution and audit trail
Analytics pipeline calculating maintenance KPIs (MTTR, PM compliance)
Multi-site architecture with per-site API key isolation
Error Handling Pattern Failure Mode Mitigation Event-driven Pub/Sub delivery failure Dead letter queue, retry policy Bi-directional sync Conflict on same record Last-write-wins or manual resolution Analytics pipeline Incomplete data fetch Retry with backfill, validate counts Multi-site One site API key expired Independent health checks per site
Resources
Next Steps For multi-environment setup, see maintainx-multi-env-setup.
Examples SCADA integration (pulling sensor data into MaintainX work orders):
async function handleSensorAlert (sensorId : string , value : number , threshold : number ) {
const asset = await findAssetBySensorId (sensorId);
await client.createWorkOrder ({
title : `Sensor Alert: ${asset.name} - ${sensorId} exceeded threshold` ,
description : `Value: ${value} (threshold: ${threshold} ). Auto-generated from SCADA.` ,
priority : value > threshold * 1.5 ? 'HIGH' : 'MEDIUM' ,
assetId : asset.maintainxId ,
categories : ['CORRECTIVE' ],
});
}