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".
الانتقال إلى التثبيت سوق المهارات اكتشف واستكشف مهارات الذكاء الاصطناعي التي بناها المجتمع.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
نسخ Promptعرض تفاصيل Prompt يتجاوز الأمر المباشر Prompt المخصّص للمراجعة. افحص المصدر قبل تشغيله.
npx skills add https://github.com/jeremylongshore/claude-code-plugins-plus-skills --skill maintainx-reference-architectureيبقى الأمر في سطر واحد. مرّر أفقيًا لمراجعته كاملًا قبل النسخ.
تفضّل نسخة محلية؟ نزّل الملفات المتاحة حاليًا لدى SkillsMP.
تحميل Zip جاري التحميل... المهن ذات الصلة SOC
استنادا إلى تصنيف SOC المهني
المزيد من هذا المستودع Implement user sign-up and sign-in flows with Clerk.
Use when building authentication UI, customizing sign-in experience,
or implementing OAuth social login.
Trigger with phrases like "clerk sign-in", "clerk sign-up",
"clerk login flow", "clerk OAuth", "clerk social login".
Implement session management and middleware with Clerk.
Use when managing user sessions, configuring route protection,
or implementing token refresh and custom JWT templates.
Trigger with phrases like "clerk session", "clerk middleware",
"clerk route protection", "clerk token", "clerk JWT".
Configure enterprise SSO, role-based access control, and organization management.
Use when implementing SSO integration, configuring role-based permissions,
or setting up organization-level controls.
Trigger with phrases like "clerk SSO", "clerk RBAC",
"clerk enterprise", "clerk roles", "clerk permissions", "clerk organizations".
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' ],
});
}