The retry duplicated the work
A timeout on the client side, a request that actually succeeded on the server, and a retry with no idempotency key. Now there are two documents and two activity records, and no obvious way to tell which is canonical.
Any competent developer can make a Conga API call succeed. What takes engineering is the timeout that already partly committed, the retry that must not duplicate, the credential that expires at 3am, and the failure nobody can see. Twopir Consulting designs Conga integrations for those. Written for architects and engineering leads.
Trusted by 500+ organizations — including engineering teams embedding Conga capability into portals, applications and orchestration layers.












Engineering Coverage
None of these show up in a sandbox with ten records and a patient tester. All of them show up at quarter-end.
A timeout on the client side, a request that actually succeeded on the server, and a retry with no idempotency key. Now there are two documents and two activity records, and no obvious way to tell which is canonical.
Stored in code, in a config file, or in a browser-visible layer. It works perfectly until it is rotated, leaked, or reviewed — and rotating it turns out to require a deployment.
A user-facing request waiting on generation that takes thirty seconds at real data volumes. It was instant in testing because the test record had four line items.
A well-behaved integration polling every minute, alongside everything else in the org. The allocation is shared, and the thing that breaks is rarely the thing that consumed it.
The portal says it failed, the middleware log says it succeeded, and Salesforce has no record either way. Without a correlation id spanning all three, diagnosis is guesswork.
An iPaaS introduced because the integration seemed hard, adding a platform, a licence and a second place for logic to hide — without the underlying design question ever being answered.
Conga publishes APIs that let its capability be embedded into websites, portals and custom applications. Making a call work is straightforward. These six decisions are what determine whether the integration is still sound in two years.
| Decision | The options | Consequence of getting it wrong |
|---|---|---|
| Interaction shape | Synchronous, asynchronous with callback, or batched. | A user-facing request blocked on work that is fast in test and slow in production. |
| Credential handling | Server-side secret store with rotation, versus embedded configuration. | Rotation requires a deployment, and the secret is one code review away from an incident. |
| Idempotency | A caller-supplied key per logical operation, versus none. | Every retry risks duplicating work. This is the decision most often skipped and hardest to retrofit. |
| Failure classification | Transient retried with backoff, permanent recorded and surfaced. | Retrying a permanent failure forever, or abandoning a transient one on first attempt. |
| Observability | A correlation id spanning caller, middleware and Salesforce, versus per-system logs. | Diagnosis becomes archaeology across three systems that disagree. |
| Orchestration home | Salesforce, an iPaaS, or your own service. | Logic split across layers, so no single place describes what the process does. |
The estimating rule
Estimate the failure modes, not the call. The request itself is usually a day. Retry semantics, credential rotation, observability and reconciliation are the rest of the work, and they are the part that gets omitted from optimistic estimates.
An integration scoped on the happy path is not under-engineered by accident — it is under-scoped on purpose, and the difference surfaces in production rather than in review.
Built to Salesforce standards — bulk-safe, governor-aware, security-respecting and configuration-driven — because the code will be read by whoever is on call, not by whoever wrote it.
The document nobody writes and everybody needs: every flow, its shape, its failure behaviour and its observability, agreed before implementation starts.
Credentials held server-side, rotatable without a deployment, and scoped to the minimum the integration actually needs.
Retries that are safe by construction rather than by hope, with transient and permanent failures classified and handled differently.
A correlation id that survives every hop, so an incident is a query rather than an investigation across three systems that each hold part of the story.
Deciding where the logic lives before deciding whether to buy a platform for it. Sometimes an iPaaS is right; sometimes it is a licence buying you a second place to hide logic.
Conga capability surfaced inside a portal or application, with the security model designed first because guest and community contexts behave differently from internal ones.
A Conga integration does not run in isolation. It shares an API allocation, governor limits and a transaction context with everything else in the org, and the thing that breaks is often not the thing that consumed the budget.
Your edition's request allowance covers every integration in the org, not just this one. We model the total consumption rather than this integration's, and design polling out wherever an event-driven alternative exists.
Anything the integration invokes inside Salesforce runs under the same per-transaction governor limits as everything else. Bulk-safe patterns are not a style preference — they are what keeps a batch from failing at the tenth record.
What the integration can read and write is decided by its profile and sharing, not by the code. Over-permissioning it is the quiet default; scoping it to least privilege is a design task that belongs at the start.
Credentials, endpoints and configuration differ per environment and must not be in code. A sandbox refresh should not require a developer, and a promotion should not carry a production secret with it.
Produced before implementation, maintained after it
Every flow with its direction, trigger and interaction shape. Sequence diagrams that include the failure branches rather than only the happy path. The data contract and how it will be versioned. The retry semantics and the idempotency scheme. The correlation id scheme and what each hop logs.
Plus a runbook: the common failure modes, how each one presents, and what to do about it at 3am without needing the person who built it.
Review an architectureConga on Salesforce · Twopir Consulting engagement
A legal team generating client-facing documents with no reliable record of which version went out. Generated output was written back to the matter record with its delivery logged — the same write-back and observability discipline this page argues for, applied at configuration level rather than at API level.
The principle does not change with the integration method. If the calling system cannot later prove what happened, the integration is incomplete however elegant the request was.
Read the full case studyWe help growing and mid-market companies solve complex CRM, integration, and business system challenges, and we work with enterprise organizations facing the same problems at larger scale.
It is the single hardest property to retrofit, because retrofitting means reasoning about every operation already performed. We decide the key scheme before the first call is written.
The allocation is shared across every integration you run. Being a Salesforce practice means we can see what else is consuming it rather than modelling this integration in isolation.
An iPaaS is right when you genuinely need orchestration across several systems. Buying one to avoid making a design decision adds a licence, a platform and a second place for logic to hide.
Correlation ids, structured logs and a runbook. They are the difference between an incident being a query and being an archaeology exercise, and they cost far less designed in than bolted on.
Bulk-safe, governor-aware, security-respecting and configuration-driven rather than hard-coded, to Salesforce standards — because the person maintaining it will not be the person who wrote it.
Yes. Conga publishes APIs specifically so its capability can be embedded into websites, portals and custom applications, which is the route when a customer-facing user needs to produce a document without a Salesforce licence. The API call is the straightforward part; the design work is the security model. Portal, guest and community contexts have different sharing and permission behaviour from internal users, so generation that works for an admin can either fail or expose more data than intended for an external user. We model that first and build the interface second.
Decide it on worst-case latency and on what the user is doing while they wait, not on which is simpler to build. Synchronous is right when a person is waiting and the work is genuinely fast at production data volumes — and that qualifier matters, because generation that returns instantly against a test record with four line items can take far longer against a real one with four hundred. Where the work is variable, large, or batched, asynchronous with a callback and a visible status on the record is the durable choice. The failure mode of getting this wrong is a timeout that has already partly committed.
With an idempotency key supplied by the caller and scoped to the logical operation rather than to the HTTP request, so a repeat of the same logical action is recognised as the same action. Without one, a client-side timeout on a request that actually succeeded produces duplicate work on retry, and you cannot tell afterwards which result is canonical. Pair it with explicit classification — retry transient failures with backoff and a ceiling, record permanent ones and surface them — and with a dead-letter path for exhausted retries. This is the hardest property to add later, because retrofitting it means reasoning about every operation already performed.
Only if you need orchestration that genuinely spans several systems, or transformation and routing complex enough to deserve its own home. For a point-to-point integration between Conga and Salesforce, an iPaaS often adds a platform, a licence and a second place for business logic to hide without answering the underlying design question. The question worth settling first is where the orchestration lives — Salesforce, a platform, or your own service — because splitting logic across two of them is what makes a process nobody can describe in one place. Where a platform is justified, we deliver on it.
By modelling the whole org's consumption rather than this integration's, since the allocation is shared and the thing that breaks is often not the thing that exhausted it. Practically: prefer event-driven patterns over polling, batch where the API supports it instead of issuing one request per record, cache reference data that changes rarely, and monitor headroom continuously rather than discovering the ceiling during a peak. We do not publish specific allowances here because they vary by edition and change — we read your actual current limits and consumption during design.
Yes, and it is a common starting point — particularly where an integration works but nobody is confident about what happens when it does not. The review covers the six decisions on this page: interaction shape, credential handling, idempotency, failure classification, observability and where orchestration lives. The output is a written assessment with prioritised findings, and in our experience the two most frequent gaps are missing idempotency and no correlation id spanning the hops. You keep the assessment whether or not we do the remediation.
Describe the integration you are scoping, or the one that already works and worries you. We will walk the six decisions with you and tell you which ones are unresolved — including the ones that are expensive to change later.
Serving: US | Canada | UK | UAE | Australia | New Zealand