Apache Fineract webhooks and hooks

Apache Fineract hooks can notify external systems when client, loan or savings records change. This page explains how to configure them safely and when a broker-based event flow is the stronger design for core banking.

On this page

Apache Fineract webhooks: when hooks fit and when they don't

Use Fineract hooks when another system needs a simple notification that an entity changed and you can confirm exactly how that notification is delivered. Hooks are one notification mechanism in Fineract. A hook template defines the outbound call, and registered events decide which entity changes trigger it. Before you rely on either, read the hook section of the Apache Fineract platform documentation for version 1.15.0 and confirm the payload fields, the webhook headers sent with each request, and what Fineract does when the receiving endpoint fails. Do not assume retry, ordering or deduplication behavior until those points are documented and tested in your environment.

Hooks also carry message gateway processors. The documented Twilio processor and the generic message gateway processor send notifications through an external messaging provider when a registered event fires. For each one, confirm which processors ship in 1.15.0, which credentials and sender settings they require, and where those credentials are stored. Keep provider secrets out of templates and version control, and plan a sandbox test with a provider account you control. SMS campaigns and activation messages are covered on the separate notifications page, so decide here only whether a hook-driven message is the right trigger for the flow at hand.

External business events are a separate route. Fineract can publish events such as ClientCreated to ActiveMQ, other JMS brokers or Apache Kafka, but this is disabled by default. Choose this route when a core flow must reach several consumers, when a consumer may be offline for a period, or when you need an event stream your team can replay and monitor. Test the failure case before you choose. Stop a receiving service during a test run, create records in Fineract, and confirm what each route delivers when the consumer returns. That result, not the feature list, should decide whether hooks are enough for the flow.

What you need before enabling Fineract hooks

Fineract hooks are only as dependable as the platform, endpoint and ownership model behind them. The cards below cover the Fineract baseline, the receiving side, the security defaults to change and the people accountable for each downstream system. Work through them before any hook template is registered in a live tenant.

Fineract 1.x on PostgreSQL

Confirm the deployed version against the current stable release on the Fineract website, which lists 1.15.0, and note that official releases ship quarterly at the end of each quarter. Hook behavior, template fields and event payloads can change between releases, so the test plan should pin one version. PostgreSQL is the recommended database, and MariaDB and MySQL are deprecated, so hook testing should run on the same database engine as production. Confirm the tenant header, Fineract-Platform-TenantId, is sent on every API call that manages hooks.

Tested HTTPS receiving endpoint

Each hook delivers outbound HTTP calls to an endpoint you own, so that endpoint must exist before registration. Serve it over HTTPS with a certificate your downstream team manages, and confirm the Fineract host can reach it through your egress rules and proxies. Test with a sample payload, check that it returns a clear success or failure code, and log every request with the entity and event identifiers. Plan how the endpoint behaves when it is down, since Fineract hook delivery failures need to be visible to your operations team.

Default admin login replaced

The Fineract README ships a development login of mifos with a default password, and it must be changed before any real deployment. Hook registration is an administrative action, so the account that creates templates and webhooks needs its own named identity, a strong credential and an audit trail. Confirm that the basic authentication path is disabled or restricted to the accounts that need it, and plan to move that identity onto OAuth2 if your organization is standardizing on it. Test the change in a non-production tenant first.

Transport encryption enabled

Fineract documentation strongly encourages HTTPS only and documents SSL settings through environment variables such as FINERACT_SERVER_SSL_ENABLED. Hook payloads often carry customer identifiers, loan and savings balances and status changes, so the connection from Fineract to each receiver must be encrypted as well as the connection to Fineract itself. Confirm which certificate authority your receivers use, and document how certificate renewal will be handled for both sides of each hook.

A named owner for each receiver

Every downstream system that receives a hook needs one accountable owner who approves its event subscriptions, payload fields and retry expectations. Decide who handles payload changes after a Fineract upgrade, who answers when a receiver rejects calls, and who can pause a hook during an incident. Record these owners in the hook register next to the template name, the target URL and the entity events each one consumes. Without this record, a single receiver outage can quietly stop onboarding or notification flows.

Kafka cluster if the broker route is chosen

Fineract can publish business events such as ClientCreated to ActiveMQ, other JMS brokers or Apache Kafka, and this is disabled by default. Choose this route only when core flows need durable, replayable events shared by several consumers. If you do, the Kafka cluster must exist before enabling it, with TLS and SASL authentication, ACLs in the KRaft authorizer, and a Kafka version chosen from the supported release list. Confirm the Java runtime and ownership for the broker before planning Fineract's event publication.

How to configure a hook step by step

This sequence takes a hook from draft to a tested configuration in a non-production tenant. Each step ends with a check that shows the receiver got the right events, from the right tenant, over an authenticated connection.

  1. Define the hook template

    Start by creating a hook template that describes what Fineract sends and which kind of processor will handle it. The integration owner lists the payload fields the receiver needs, and a Fineract administrator creates the template in a non-production tenant first. The step is complete when a sample payload from the template contains every field the receiver uses and no fields it has no use for. Keep the template in version control so later changes can be reviewed.

  2. Choose the registered events

    Select the entity events that should trigger the hook, such as ClientCreated, and attach them to the template. Register only the events the receiving system acts on, because each registered event produces outbound traffic that the receiver must handle. Confirm the event names against the Fineract version you run, since event availability can change between releases. The step is complete when one test action in the tenant produces a single delivery for the expected event and no others.

  3. Set the target URL and webhook headers

    Enter the receiver's HTTPS endpoint as the target URL, then add the headers the receiver needs to authenticate and route each call. Use a dedicated credential for the receiver, generated and stored in the receiver's secrets store, and avoid placing shared secrets in template text that other administrators can read. Confirm the URL uses HTTPS before you save, since the Fineract documentation strongly encourages HTTPS only. The step closes when the receiver's logs show the expected headers on a test delivery.

  4. Select the processor for each message type

    Choose the processor that matches the action, such as Twilio or a message gateway for SMS, or a generic HTTP receiver where your version supports one. Each processor needs its own account settings, so confirm with the provider which sender identifiers, numbers and credentials your agreement covers before you enter them. Keep provider credentials out of the template body. The step is complete when a test message reaches a controlled test number through the chosen processor and the delivery log records a success.

  5. Test the full sequence on a non-production tenant

    Run the complete sequence in a non-production tenant that holds synthetic client data. Trigger each registered event through the API or the user interface, then open the delivery log to confirm one entry per action with the expected status. After fixing any failed delivery, change only one setting at a time, such as the URL, a header or a credential, so you know which change resolved the failure. The step is complete when every registered event produces a logged delivery and the receiver processes each one without manual intervention.

  6. Verify the tenant identifier and payload

    Confirm which tenant identifier arrives with each delivery, and whether your Fineract version includes the Fineract-Platform-TenantId header on hook calls. Test this with a client record in a second tenant, then check that the receiver routes each payload to the correct tenant and never mixes them. Compare the received fields with the template from the first step. The check passes when the receiver can state the tenant for every delivery and rejects or quarantines any delivery where the tenant is missing or unexpected.

  7. Confirm the receiver rejects unauthenticated calls

    Send a request to the receiver's endpoint without credentials, then send another with an incorrect credential. The receiver should refuse both, return an error and record the refusal in its own logs. Only after both refusals should the team accept the configuration. The step closes when unauthenticated and wrongly authenticated calls are refused, the authenticated test delivery is accepted, and the results are saved with the change record.

  8. Record the configuration and review core flows

    Store the template, event list, processor settings and test results together in the change record. For any flow where a lost or duplicated event would break downstream records, such as client or account changes that other systems depend on, compare hook delivery with a broker-based design before go-live. Apache Kafka keeps published messages until consumers read them, so it supports replay and independent consumers, but it also needs its own security and operations plan. Confirm the retention, acknowledgement and failure behavior of the chosen design during testing.

Mapping Fineract events to receiving systems

This table maps each kind of Fineract business event to its receiving system, the key used to reconcile records, the tenant it belongs to, and whether it only notifies or moves money. Read the last column first: events that drive a financial action need a durable route, and each row needs a named owner before go-live. Confirm the exact event names and payload fields in your Fineract version before you build consumers.

Fineract eventReceiving system and routeReconciliation key and tenantNotification or financial action, and failure owner
ClientCreated (named in the Fineract README as an example)CRM, KYC screening or onboarding service, delivered through ActiveMQ or Kafka when event publishing is enabledClient ID from the payload, carried with the Fineract-Platform-TenantId valueNotification only in most designs. Owner: the team that runs the receiving onboarding service
Loan disbursement (illustrative)General ledger feed or payment switch, through a broker route with replayLoan account ID and transaction ID, scoped to the tenantFinancial action, so a broker route is required. Owner: finance operations, with the integration team on call
Loan repayment (illustrative)Receivables reporting or data warehouse loadLoan account ID, repayment transaction ID and business dateFinancial action in the receivables view. Owner: finance operations for mismatches
Savings deposit or withdrawal (illustrative)Customer messaging service and balance consumersSavings account ID and transaction ID, per tenantMixed: a customer message plus a balance effect. Owner: the product team for messages, finance for balances
Client or document update (illustrative)Document store, identity or case management systemClient ID and document ID, per tenantNotification only if the receiver is read-only. Owner: compliance operations
Close of Business or batch outcome eventsMonitoring and alerting platformJob run identifier and business date, per tenantNotification only. Owner: platform operations, who act on failed or late runs
Tenant or configuration changesAudit log and security monitoringTenant ID and the user who made the changeNotification only, but evidence-relevant. Owner: information security
Any event with no receiver owner assignedNot routed until an owner is namedConfirm the reconciliation key with each receiving teamTreat as undeliverable at design time. Owner: the implementation lead, until assigned

Securing webhook traffic from Fineract

Webhook traffic leaves Fineract for systems outside the core banking boundary, so the controls sit on both ends of each call. The cards below cover the Fineract side (transport, credentials, outbound destinations and processor secrets) and the receiver side that your team must assess on its own.

Serve every callback over HTTPS

Fineract's documentation strongly encourages HTTPS only and documents SSL settings through environment variables such as FINERACT_SERVER_SSL_ENABLED. Apply the same rule to the endpoint each hook template calls. Check that the receiving URLs use https, that certificates are validated against a trusted chain, and that no hook template points at a plain HTTP address left over from testing. Confirm the exact SSL variables for your release in the platform documentation before you set them.

Replace default Fineract credentials

The Fineract README ships a default development login, mifos with a known password, that must be changed for any real deployment. Hooks run under an account too, so review which user performs webhook-triggering actions and remove any test accounts that can create or edit clients and loans. Store the replacement credentials in your secrets manager, not in the hook configuration screens or the deployment repository.

Use one authentication method across the stack

Fineract exposes OAuth2 and HTTP basic authentication, and the choice affects the other components that call the same API. Pick one method for staff access, service accounts and the Mifos web app, and document it. Mixing basic credentials in some integrations with bearer tokens in others makes revocation and audit inconsistent. Confirm with your identity team how token lifetimes and service client rotation will work before go-live.

Authenticate receiver calls with custom headers

Hook templates let your team define the HTTP headers sent with each callback. Use a header that the receiver can verify, such as a shared-secret or signature value generated by your team and checked on arrival. Do not rely on the source IP alone, and do not assume the receiver can trust the body until the header is verified. Reject unsigned or stale requests on the receiving side, and rotate the shared value through the same process as other service secrets.

Restrict egress to approved endpoints

A hook that can reach any address turns a Fineract compromise into a data exfiltration path. Limit outbound traffic from the Fineract application tier to a list of approved webhook receivers, Twilio or the message gateway, and your payment or event brokers. Enforce the list with network policy or egress firewall rules in your environment, and review the list whenever a hook is added. Confirm the outbound rules with your network team, since they depend on your topology.

Keep processor secrets out of templates

Twilio or gateway processors need account identifiers and tokens. Keep these values out of hook message templates, which staff can view and edit, and out of logs. Load them from your secrets store at runtime and restrict who can edit the processor configuration. Rotate credentials after staff changes, and confirm with the gateway provider how to revoke a key without stopping unrelated services.

Assess the receiving system separately

Fineract's controls end where the payload leaves its network. The security of each receiving system, including its authentication, storage, retention, logging and access model, is outside Fineract and must be assessed on its own. Include every receiver in your threat model and in your third-party risk process. Ask each receiver owner how they validate signatures, handle replays and protect personal data in the payload.

Why a broker may be the better choice for core flows

A direct HTTP hook is simple to reason about: Fineract sends a request to a receiver when an entity changes, and the receiver either accepts it or does not. That model works for a single consumer with low volume, but it puts delivery guarantees, retries and ordering on the receiving system. For core flows such as client creation, loan disbursement or repayment posting, the consumer needs to see every change in the order it happened, and a plain request-response hook gives no durable record to replay from if the receiver was down for an hour or a deployment changed its URL. Fineract's external business events, such as ClientCreated, can instead be published to ActiveMQ or another JMS broker, or to Apache Kafka. That route is disabled by default, so the team must enable it deliberately and document which events are published and who owns each consumer.

Publishing to Kafka changes the trade-offs in three specific ways. Kafka keeps an ordered log per partition, so ordering depends on how events are keyed (for example, by client or loan identifier), and retention lets a new consumer or a repaired one re-read past events instead of asking Fineract to resend them. Each consumer group also advances at its own pace, so a slow reporting service does not hold back a payment switch. The cost is operational. Apache Kafka is licensed under Apache-2.0 and the project offers no paid edition, so the software is free but the people, hosting, monitoring and upgrades are not. Kafka 4.x runs only in KRaft mode, brokers require Java 17, and access is controlled through SSL or SASL with ACLs. Confirm with your platform team whether they can run a KRaft cluster and an authorization model before choosing this path.

Before committing, decide per event whether a lost or late message is acceptable. Notifications may tolerate a direct hook, while a ledger-affecting or payment-related event usually justifies a broker with explicit replay and monitored consumer lag. Plan for a dead-letter pattern, idempotent consumers keyed on event identifiers, and alerts on broker health. If the team cannot staff that operation, a narrower design with a few direct hooks for low-risk events may be the safer starting point. Ask any implementation partner to show the event catalogue, the ordering keys and the recovery runbook as part of the written scope.

Common hook failures and how to fix them

This table lists the failures teams most often hit when Fineract hooks notify external receivers, with the likely cause, a diagnostic check and a fix for each. Read it while a hook is misbehaving, and treat every item marked for confirmation as something to verify in your own environment before relying on it.

FailureLikely causeDiagnostic checkFix
Receiver timeoutsThe receiving endpoint responds slowly or blocks while processing, so the Fineract call times out and the delivery is treated as failed.Compare Fineract hook log entries with receiver access logs for the same event time. Confirm the timeout value your Fineract version applies to outbound hook calls.Return a fast acknowledgement and process the payload asynchronously. Keep the receiver's work off the request thread.
Tenant header missing from callbacksThe hook template or outbound request omits the Fineract-Platform-TenantId header, so the receiver cannot tell which tenant the event came from.Inspect a captured request at the receiver for the tenant header. Check the hook's configured headers against the tenant you expect.Add the tenant identifier as an explicit header on the hook, then confirm the receiver rejects requests without it.
TLS certificate mismatchThe certificate on the receiver does not match the hostname in the hook URL, or the Fineract container does not trust the issuing certificate authority.Test the receiver with a TLS client from the Fineract host. Check the certificate subject and chain against the hook URL.Issue a certificate for the exact hostname used in the hook, and install the internal CA in the Fineract trust store. Confirm the procedure with your platform team.
Duplicate deliveries after a retryA delivery succeeded at the receiver but Fineract did not record the success, so the retry sends the same event again.Compare event identifiers at the receiver for repeated payloads. Confirm how your Fineract version retries failed hooks and whether it records success.Make the receiver idempotent by storing processed event identifiers. Treat repeated events as expected, not as errors.
Processor credentials rejectedThe SMS or email processor key, username or password has expired, was rotated, or is configured for another account.Look for authentication errors in Fineract logs for the processor. Test the credential directly against the provider from the same network.Update the credential in the configured store, restart or reload as your version requires, and retest with one sample message.
Events firing in the wrong tenantA hook is registered or configured under one tenant but triggered by activity in another, or tenant connections are mixed up in configuration.Create a test entity in each tenant and confirm which hook fires. Review the tenants database entries against the intended mapping.Correct the tenant mapping, disable hooks that cross tenants, and add a tenant check at the receiver. Confirm the isolation behavior in a non-production tenant first.

Questions teams ask before building Fineract hooks

How much effort does a Fineract hook integration take?

Effort depends mostly on how many entities and events you publish, how many receiving systems consume them, and how much each receiver must do with the payload. A single hook template that posts one event type to one endpoint is a small task. Each added event, receiver, authentication scheme and retry rule adds design, build and test work. Ask any partner for a written scope that lists each registered event, each receiver, the payload fields each receiver needs, the failure handling expected and the environments where testing runs. Without that list, no meaningful effort estimate is possible.

Can our internal team build Fineract hooks without outside help?

Often yes, if the team already runs Fineract and owns the receiving systems. Hook setup is configuration through the REST API, so the main skill gaps are usually Fineract tenant administration, HTTP and webhook security, and handling retries and duplicate deliveries on the receiver side. Teams without those skills, or without time to test failure cases, often benefit from an external review of the design before go-live. Decide this by listing who will own the template configuration, the receiver code and the on-call response, then checking whether those people have capacity alongside their current work.

What do we need to provide for a hook project?

Plan for three inputs from your side. First, named tenant owners who approve which Fineract tenants publish events and which data may leave them. Second, receiver endpoints that are reachable from the Fineract network, with documented authentication, expected payloads and error responses. Third, test data that covers normal, edge and failure cases, such as clients with missing contact details, repeated updates and receivers that time out. Your staff should also confirm who can change hook templates in production and how those changes are approved. Missing any of these usually delays the schedule more than the build itself.

How long should testing run for a hook integration?

Testing length scales with the number of event types, the number of receivers and the number of distinct outcomes each combination can produce. A useful plan maps every event to every receiver and tests success, timeout, rejected authentication, malformed payloads and repeated delivery for each pair. Add time for the receiver teams to confirm they handle duplicates and out-of-order updates, and for a soak period in a non-production environment that resembles production volume. Ask the partner to state the test matrix and the environments in the written scope, and to name the exit criteria before testing starts.

What does a Kafka or ActiveMQ route add to the cost?

A broker route adds infrastructure you must run: a cluster, its storage, its upgrades and its access controls. Apache Kafka is an Apache Software Foundation project under the Apache License 2.0, so the software itself carries no license fee, but the project does not sell support, and you or a partner must operate the cluster. The broker route is worth its cost when many consumers need the same core events, when delivery must survive receiver outages without losing events, or when you need replay for reconciliation. For a single receiver with simple needs, a hook template may be enough. Ask for a written comparison of both options against your event volume and recovery requirements.

Do hooks guarantee that every event reaches the receiver?

No, and your design should not assume they do. Hook delivery depends on the receiver being available and responding in time, so outages, timeouts and rejected requests can leave gaps unless your receiver, retry handling and reconciliation cover them. Plan a reconciliation job that compares Fineract records with what each receiver has stored, and make receivers idempotent so repeated deliveries do not create duplicate records. Confirm the exact retry and failure behavior of your Fineract version in its documentation before you design around it.

How do we secure the hook payloads and receiver endpoints?

Start by restricting which tenants and events can leave Fineract, then require HTTPS for every receiver and authenticate each request with a secret or signature that the receiver verifies before processing. Store those secrets in your secrets manager, rotate them on a schedule your security team sets, and limit payload fields to what each receiver needs, since client personal data is sensitive. Review the receiver's logs for what it stores. Confirm how your chosen Fineract version sends headers and signatures before writing verification code.

How to test hooks before production

Run the test plan on a non-production tenant before any hook is registered against live data. Create the test tenant in a separate environment, send requests with the Fineract-Platform-TenantId header set to that tenant, and register each hook from the mapping table there. Then replay every registered event by performing the business action that triggers it, such as creating a client for the ClientCreated event. Compare what the receiver gets with the mapping table row for that event: event name, entity identifier, field names and payload shape. Any event that the table does not cover is a gap to close before go-live. Confirm hook behavior against the Fineract platform documentation and your own build, because details vary by release and you should test the version you will run.

Next, force receiver failures on purpose. Stop the receiver, return server errors, respond slower than your timeout and send malformed bodies. Then observe what Fineract does with each event: whether it retries, how long it waits, whether it gives up, and what evidence remains in the logs. Record each outcome against its mapping table row. A delivery that disappears silently is a risk for the business owner as well as the engineers. Credentials and headers need the same scrutiny. Send a wrong secret, omit a required header and confirm the receiver rejects both. Check that the expected headers arrive exactly as the mapping table specifies. Use dedicated test credentials, never the default development login or a production secret.

Finally, test duplicate deliveries. Replay the same event twice and confirm the receiver processes it once, using the entity identifier and event type from the mapping table as its deduplication key. Then prove isolation. Check that hooks appear only on the test tenant, confirm production tenants show no new registrations or deliveries, and verify through network controls that the test environment cannot reach the production receiver endpoint. Keep a dated test log that records the Fineract version, tester and result for each row, and make a complete passing log a go-live condition. Repeat the full run after every Fineract upgrade and after every change to the receiver.

How DeployOpen scopes and delivers Fineract hook integrations

DeployOpen plans, builds, documents and supports Fineract hook integrations inside your own infrastructure, starting from a written scope. We begin by agreeing which entity changes must reach which systems, then decide with you whether hooks or a broker-based event design fits each flow.

How we scope

  • Inventory the entity changes, such as client and loan events, that downstream systems need to receive.
  • Agree in writing which hook templates, registered events and receiving endpoints are in scope.
  • Confirm the delivery expectations for each flow, including retries, ordering and what happens when a receiver is down.

How we build

  • Configure hook templates, registered events and webhook headers on a non-production Fineract instance first.
  • Build and test the Twilio or message gateway processor integrations that the scope includes.
  • Test failure paths, duplicate deliveries and credential handling before any production rollout.

How we hand over

  • Document each hook, its payload, its receiving system and the owner responsible for it.
  • Provide runbooks for replaying failed deliveries, rotating secrets and disabling a hook safely.
  • Walk your team through the configuration so they can change hooks without rebuilding the integration.

How we support

  • Engagements are fixed-scope, and changes to hooks after handover are scoped separately in writing.
  • Ongoing support, upgrades and continuous testing are available as a retainer for hook integrations.
  • Retainer reviews can cover Fineract upgrades and changes to the receiving systems that affect delivery.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.