Automation platforms can turn application and SaaS actions into GraphJSON events without a dedicated integration service. The platform still becomes part of your data pipeline: it must protect the workspace key, preserve event time, map fields deliberately, retry safely, and expose failures.
GraphJSON does not provide managed Zapier, Make, n8n, or Pipedream connectors. Use each platform's generic HTTP request or code step.
Decide when this pattern fits#
Use an automation platform for:
- low- or moderate-volume business events
- a fast integration pilot
- scheduled imports of compact records
- provider actions already available as platform triggers
- workflows with an owner who monitors failures
Use a durable queue or stream adapter instead when:
- events are high volume
- ordering matters
- recovery objectives are strict
- the platform cannot keep the API key secret
- batch and retry behavior cannot be controlled
- the event is a financial or entitlement authority
Start with the GraphJSON request#
Single-event endpoint:
POST https://api.graphjson.com/api/log
Content-Type: application/json
Body:
{
"api_key": "secret platform variable",
"collection": "business_events",
"timestamp": 1785110400,
"json": "{\"event\":\"deal_closed\",\"deal_id\":\"deal_42\",\"account_id\":\"acct_91\",\"amount_minor\":490000,\"currency\":\"usd\",\"source\":\"crm\",\"schema_version\":1}"
}
json is a serialized JSON string, not a nested object. timestamp is a whole
Unix second. The serialized event must remain within the documented
10,000-character limit.
Store the key safely#
Use the platform's encrypted credential, secret, environment-variable, or private connection feature. Never place the key in:
- a public workflow template
- a shared screenshot
- a trigger URL
- a browser form
- step notes
- an event property
- a failure notification
If a platform cannot prevent editors or viewers from seeing the key, route the workflow through a small server endpoint you control instead of calling GraphJSON directly.
Normalize before sending#
Do not forward the complete trigger object. Build a small allowlisted event:
const event = {
event: "deal_closed",
event_id: input.deal_id + ":" + input.closed_at,
deal_id: input.deal_id,
account_id: input.account_id,
amount_minor: Math.round(Number(input.amount) * 100),
currency: String(input.currency).toLowerCase(),
source: "crm",
schema_version: 1
};
Remove:
- credentials and authorization fields
- contact names, emails, and phone numbers unless explicitly required
- free-form notes
- complete provider records
- unstable display labels
- raw HTML
- arbitrary URL query strings
Prefer provider record IDs and bounded codes.
Preserve occurrence time#
Use the source's event or record timestamp:
const timestamp = Math.floor(
new Date(input.closed_at).getTime() / 1000
);
Validate that it is finite, whole, and within an expected range. Use the automation execution time only when the event genuinely occurred when the workflow ran.
Keep the provider timestamp string inside the event only when reconciliation needs it.
Create deterministic identity#
Automation platforms can retry a trigger or replay history. Prefer a stable source ID:
event_id = provider + ":" + source_record_id + ":" + source_revision
If the source event is immutable, the provider event ID may be enough. If a record can update, include the revision or effective timestamp.
GraphJSON stores accepted retries as additional events. Use stable identity to deduplicate in SQL, or place a stateful idempotency layer in front when duplicate storage is unacceptable.
Configure the HTTP step#
The labels vary by platform, but the contract is the same:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://api.graphjson.com/api/log |
| Header | Content-Type: application/json |
| Body type | Raw JSON or equivalent structured builder |
| Key | Secret variable inserted into api_key |
| Success | Any documented 2xx response |
| Timeout | Bounded and visible |
Relevant platform references:
Review the platform's current retry and error behavior. A convenient HTTP action may stop the workflow on failure without providing the dead-letter or retry guarantees your event requires.
Handle response classes#
| Response | Action |
|---|---|
2xx |
Mark the delivery accepted |
400 |
Quarantine; fix key, timestamp, JSON, size, or collection |
429 |
Retry with backoff and jitter |
5xx |
Retry with backoff and jitter |
| timeout/network | Treat as unknown; retry safely with stable event ID |
Cap retries. When exhausted, route a redacted failure record to a platform error workflow or an operational queue.
Do not include the API key or complete event in email and chat failure alerts.
Use bulk only when the platform forms real batches#
POST /api/bulk-log accepts up to 50 events:
{
"api_key": "secret platform variable",
"collection": "business_events",
"timestamps": [1785110400, 1785110460],
"jsons": [
"{\"event\":\"deal_closed\",\"event_id\":\"crm:42:7\"}",
"{\"event\":\"deal_closed\",\"event_id\":\"crm:43:2\"}"
]
}
The arrays must be non-empty and the same length. Do not add a complex stateful batch step for a tiny workflow unless it improves reliability or cost. A failed batch needs enough metadata to retry or quarantine its members.
Design a platform-neutral workflow#
provider trigger
→ filter relevant action
→ normalize fields
→ validate required values
→ construct deterministic event ID
→ call GraphJSON
→ branch on response
├─ accepted
├─ retryable
└─ quarantine + notify owner
Keep normalization logic in one reusable subworkflow or code module when the platform supports it. Copying field mapping into dozens of automations creates schema drift.
Test before activation#
Create a short-retention test collection and verify:
- normal event
- missing required source ID
- malformed timestamp
- optional field absent
- duplicate trigger
- transient GraphJSON failure through a mock
- permanent
400 - platform replay
- secret redaction in execution history
- production collection routing
Inspect the exact GraphJSON Sample. Confirm names, types, occurrence time, and identity before building a chart.
Operate the adapter#
Record outside the business-event collection:
- workflow executions
- GraphJSON accepted deliveries
- retries
- quarantined records
- oldest failed record age
- last successful delivery
- mapping version
Reconcile source records with accepted and quarantined outcomes over a settled window. The platform's green workflow status does not prove that the correct event arrived in the correct collection.
Adapter checklist#
- The event volume and recovery need fit an automation platform.
- The workspace key is stored as a protected platform secret.
- The workflow sends an allowlisted event, not the complete trigger.
-
jsonis serialized correctly and remains within the size limit. - Occurrence time is converted to whole Unix seconds.
- Stable source identity supports retries and deduplication.
- Response classes have explicit retry or quarantine behavior.
- Retries are bounded and use backoff.
- Failure notifications are redacted.
- Test and production collections are separated.
- Execution history cannot expose secrets or sensitive payloads.
- Source, accepted, retried, and quarantined counts reconcile.