External Integration Modules
External Integration Modules
Integration modules require OAuth2 or API key credentials configured via the Links API. Reference the link in the flowlet via linkIdsByType.
Clio — Legal Practice Management
9 modules covering all major Clio entities.
Setup: Configure an OAuth2 link for Clio, then reference it: "linkIdsByType": {"clio": "65link-id"}
// List contacts{"appId": "clio-list-contacts", "args": {"query": "{{ $prev.args.searchName }}", "limit": 25}}// Output: {"contacts": [{"id":123,"name":"Jane Smith","email":"jane@law.com"},...], "count": 5}
// Get single contact{"appId": "clio-get-contact", "args": {"id": "{{ $prev.args.clioContactId }}"}}
// Create task{ "appId": "clio-create-task", "args": { "name": "Review contract for {{ $prev.getMatter.description }}", "dueDate": "{{ $date.addDays 3 }}", "assigneeId": "{{ $prev.args.assigneeId }}", "matterId": "{{ $prev.args.matterId }}" }}
// List matters{"appId": "clio-list-matters", "args": {"status": "open", "clientId": "{{ $prev.args.clientId }}"}}
// Get matter detail{"appId": "clio-get-matter", "args": {"id": "{{ $prev.args.matterId }}"}}
// Upload file to matter{ "appId": "clio-upload-file", "args": { "matterId": "{{ $prev.args.matterId }}", "filename": "invoice-{{ $prev.args.invoiceId }}.pdf", "content": "{{ $prev.generatePdf.content }}", "mimeType": "application/pdf" }}QuickBooks Online
Setup: OAuth2 link for QuickBooks, then "linkIdsByType": {"quickbooks": "65link-id"}
// Query entities (invoices, customers, vendors, etc.){ "appId": "qbo-query", "args": { "entity": "Invoice", "query": "SELECT * FROM Invoice WHERE DueDate < '{{ $date.format '2006-01-02' }}' AND Balance > 0", "limit": 100 }}// Output: {"entities": [...], "count": 12}
// Create invoice{ "appId": "qbo-create-invoice", "args": { "customerId": "{{ $prev.getCustomer.qboId }}", "lineItems": [ {"description": "Consulting services", "amount": 2500, "quantity": 1} ], "dueDate": "{{ $date.addDays 30 }}", "memo": "Invoice for January 2024" }}
// Get invoice as PDF{"appId": "qbo-invoice-pdf", "args": {"invoiceId": "{{ $prev.createInvoice.id }}"}}// Output: {"content": "<base64 PDF>", "path": "tmp/qbo-invoice-123.pdf"}
// Get exchange rates{"appId": "qbo-exchange-rates", "args": {"baseCurrency": "USD"}}// Output: {"rates": {"EUR": 0.92, "GBP": 0.79, ...}}Bexio — Swiss Business Software
Setup: API key link for Bexio, then "linkIdsByType": {"bexio": "65link-id"}
// List/search contacts{"appId": "bexio-list-contacts", "args": {"query": "{{ $prev.args.searchTerm }}", "type": "company"}}// Output: {"contacts": [{"id":1,"name":"ACME AG","email":"info@acme.ch"},...]}
// Create invoice{ "appId": "bexio-create-invoice", "args": { "contactId": "{{ $prev.getContact.bexioId }}", "title": "Invoice {{ $prev.args.invoiceRef }}", "positions": [ {"text": "Software development", "unit_price": 150, "amount": 8, "unit": "hours"} ], "paymentType": "bank_transfer", "dueInDays": 30 }}Microsoft Graph — Office 365
Setup: Microsoft OAuth2 (configured via MICROSOFT_CLIENT_ID/SECRET env vars), then "linkIdsByType": {"microsoft": "65link-id"}
// Get new/changed emails (delta query){ "appId": "msgraph-mail-delta", "args": { "userId": "me", "folder": "inbox", "deltaToken": "{{ $kv.get 'mailDeltaToken' }}", "filter": "isRead eq false" }}// Output: {"messages": [...], "nextDeltaToken": "abc123"}
// Create calendar event{ "appId": "msgraph-calendar-create", "args": { "subject": "Review: {{ $prev.args.documentName }}", "startDateTime": "{{ $prev.args.meetingDate }}", "endDateTime": "{{ $date.addHours 1 }}", "attendees": [{"email": "colleague@company.com"}], "body": "Please review the attached document before this meeting." }}
// Delete calendar event{"appId": "msgraph-calendar-delete", "args": {"eventId": "{{ $prev.args.eventId }}"}}Google Sheets
Setup: Google OAuth2 link, then "linkIdsByType": {"google": "65link-id"}
// Create new spreadsheet{"appId": "gsheets-create", "args": {"title": "Report {{ $date.format '2006-01' }}", "folderId": "drive-folder-id"}}// Output: {"spreadsheetId": "1BxiM...", "url": "https://docs.google.com/spreadsheets/..."}
// Add columns (headers){"appId": "gsheets-add-columns", "args": {"spreadsheetId": "{{ $prev.createSheet.spreadsheetId }}", "sheet": "Sheet1", "columns": ["Date","Customer","Amount","Status"]}}
// Update cells / append rows{ "appId": "gsheets-update-cells", "args": { "spreadsheetId": "{{ $prev.createSheet.spreadsheetId }}", "sheet": "Sheet1", "range": "A2", "values": "{{ $prev.formatData.rows }}" }}
// Read cells{"appId": "gsheets-read", "args": {"spreadsheetId": "1BxiM...", "range": "Sheet1!A1:D100"}}// Output: {"values": [[...rows...]], "rowCount": 42}