Skip to main content

Overview

When a customer completes an Imprint application, you learn the outcome in two complementary ways:
  1. The SDK result — returned client-side, in the browser or mobile app, the moment the customer exits the Imprint application experience (see Step 3 of Apply for a loan or credit card).
  2. The application event notification — a signed, server-to-server webhook Imprint POSTs to your configured endpoint when a credit decision is reached.
Both report on the same application, but they are designed for different jobs. Use the SDK result to update the customer’s experience immediately. Use the webhook as the source of truth for your backend systems.
New to event notifications? Start with Subscribe to event notifications for setup, signature verification, and retry/idempotency handling.

SDK result vs. event notification

Why the status sets differ

The two channels answer different questions:
  • The SDK result answers “What happened in this browser/app session?” — including the customer walking away or launching with a bad token.
  • The webhook answers “Where is this application in Imprint’s pipeline?” — it fires at each server-side milestone, both intermediate (e.g. IDV_REQUIRED, OFFERS_AVAILABLE) and terminal (OFFER_ACCEPTED, REJECTED).
A bad launch (ERROR) is a session outcome, not an application event — so it exists only on the SDK side and never produces a webhook. IN_PROGRESS is also never a webhook status, but it appears in two other places with different meanings, so do not treat them as the same signal:
  • The SDK result IN_PROGRESS means the customer exited before finishing (abandonment). Abandonment is not an application event and never produces a webhook.
  • The Application API status IN_PROGRESS means the application is a draft: it has been created and not yet submitted. No webhook is sent for a draft. The first webhook for an application is EVALUATING, sent when decisioning starts after submit.
OFFER_ACCEPTED and REJECTED are terminal decisions that appear in both channels. Use this mapping to decide what to expect from an SDK result:
OFFER_ACCEPTED and REJECTED are the same strings in both channels — but they are not interchangeable. The SDK result is client-reported and best-effort; the webhook is authoritative. Two consequences:
  • Don’t treat the client-side OFFER_ACCEPTED as final for fulfillment, accounting, or provisioning. Confirm it against the webhook (or the API).
  • Don’t wait for a webhook on an abandoned or errored session — there will never be one. Handle IN_PROGRESS and ERROR entirely client-side.
A customer can also close their browser between accepting the offer and the SDK returning, so you may receive the webhook with no client-side result at all. Always treat the webhook as the source of truth.

When the webhook fires

Imprint sends an APPLICATION event notification when decisioning starts after an application is submitted and when it reaches a terminal state, plus intermediate notifications when the applicant must complete identity verification, when an application is pended for manual review, when at least one offer becomes available, and, for secured / funding products, when their deposit is funded: EVALUATING is an application-level notification — it fires once when decisioning starts after submit, and its payload is not scoped to a specific product. There is no notification before it: a draft application (Application API status IN_PROGRESS) and an abandoned SDK session (SDK result IN_PROGRESS) never produce a webhook. IDV_REQUIRED is an application-level notification — its payload is not scoped to a specific product. It is recoverable: once the applicant finishes identity verification the application returns to underwriting, so expect a later notification (OFFERS_AVAILABLE, OFFER_ACCEPTED, or REJECTED). PENDING_REVIEW is an application-level notification — its payload is not scoped to a specific product. It is recoverable: once manual underwriting review clears, the application returns to underwriting, so expect a later notification (OFFERS_AVAILABLE, OFFER_ACCEPTED, or REJECTED). FROZEN is an application-level notification — its payload is not scoped to a specific product. It is recoverable: once the applicant lifts the credit-bureau freeze the application can re-enter underwriting, so expect a later notification (OFFERS_AVAILABLE, OFFER_ACCEPTED, or REJECTED). OFFERS_AVAILABLE is an application-level notification — it fires once every product on the application has been decisioned and at least one offer is available, not when the first offer is produced, and its payload is not scoped to a specific product. ACCOUNT_FUNDED is only emitted for secured / funding products. After the EVALUATING notification, the interval before the next one is usually seconds, but it can occasionally be longer while Imprint completes decisioning. No notification is sent in the meantime and no action is required on your side: keep the application open and wait for the next notification. If you poll Get Application in the applicant’s session, stop after 30 seconds and show an under-review state; the webhook delivers the result. Do not submit the application again or create a new one for the same applicant. This applies only to a submitted application that is being decisioned; a draft that has not been submitted produces no notification at all, however long the applicant takes.
A REJECTED notification is only delivered when Imprint can give you enough context to act on it — i.e. the application carries a partner_customer_id and/or maps to a known customer. If neither is available, the rejection is not sent, because it would not be actionable on your side.

Payload

See also the Application Event reference.
1

Update the UI from the SDK result

On SDK exit, react to the client-side result immediately — for OFFER_ACCEPTED, show a success banner or route the customer to a page to learn more about the credit card rewards. Treat this as provisional.
2

Confirm and persist from the webhook

When the APPLICATION webhook arrives, verify the signature, then record the decision against the customer_id / partner_customer_id as the source of truth for fulfillment, accounting, and downstream systems. When present, store expires_at so you can re-engage customers who have not finished before the application expires.
3

Deduplicate

Use application_id, status, and updated_at to ignore duplicate deliveries (Imprint retries until you acknowledge with a 2XX).
4

Don't block on a webhook for non-decisions

IN_PROGRESS and ERROR SDK results never produce a webhook. Handle them entirely client-side.