Hospital BPJS Receivables Management: A Comprehensive Strategy for Accelerating Payments
N
Back to Blog

Hospital BPJS Receivables Management: A Comprehensive Strategy for Accelerating Payments

Industri Kesehatan
Nugroho Setiawan · Konsultan IT & Full Stack Developer 27 Apr 2026 9 min baca 2,814 kata 495 views
Managing BPJS Kesehatan receivables is a crucial challenge for hospitals, often hindering cash flow. This article examines comprehensive strategies, from optimizing information systems to implementing BPJS bridging technology, to accelerate the claims and payment process efficiently. Learn concrete

The accumulation of BPJS Kesehatan receivables is one of the most urgent issues facing many hospitals in Indonesia today. This condition is not merely an administrative problem, but the core of a hospital's operational financial health. Delays in BPJS claim payments can significantly disrupt cash flow, hinder the hospital's ability to invest in new medical equipment, pay employee salaries on time, or even meet daily operational needs such as purchasing medicines and consumables. Data shows that the average days sales outstanding (DSO) of BPJS receivables in some hospitals can reach more than 90 days, far exceeding the ideal target of 15 working days after verification. The complexity of regulations, strict verification processes, and lack of system integration are often the culprits behind this problem. This article serves as a practical and in-depth guide, designed for IT Managers, clinic owners, and operational managers, which will discuss concrete strategies and technology solutions, particularly through optimizing the Hospital Management Information System (SIMRS) and implementing BPJS bridging, in order to significantly accelerate the claim and receivable payment process.

Basic Concepts of BPJS Receivable Management & Its Challenges

BPJS Kesehatan receivable management refers to a series of processes ranging from recording claims for health services that have been provided to BPJS patients to tracking and collecting payments from BPJS Kesehatan. The BPJS claim cycle generally includes patient registration, medical services, diagnosis and procedure coding, claim submission, verification by BPJS, and finally payment. Each stage in this cycle has the potential for obstacles that can slow down the payment process.

The main challenges often faced by hospitals in managing BPJS receivables are very diverse. First, the strict verification process by BPJS Kesehatan, which often demands very high completeness and accuracy of medical data. A small error in diagnosis coding (ICD-10) or procedure coding (ICD-9-CM) can cause claims to be rejected or require a time-consuming revision process. Second, the potential for disputes or claim conflicts arising from differences in regulatory interpretation or data discrepancies. Third, delays by BPJS verifiers in processing claims, especially at high claim volumes. Fourth, regulatory changes from BPJS Kesehatan or the Ministry of Health, such as the revision of PMK No. 76 of 2016 concerning INA-CBG's guidelines, which require hospitals to continuously adapt.

The impact of these challenges is strongly felt on hospital liquidity. Disrupted cash flow can hinder the hospital's ability to pay for operations, purchase essential medicines, or even invest in the latest medical technology. As a concrete example, a type C hospital in West Java reported average BPJS receivables of Rp 7 billion per month with an average payment time reaching 100 days. This condition forced management to postpone plans to procure a new MRI machine vital for improving service quality, and to experience difficulties in meeting payment obligations to pharmaceutical vendors on time. This situation underscores the urgency of implementing a more proactive and technology-supported receivable management strategy.

Technology Implementation to Accelerate BPJS Claims

Accelerating BPJS Kesehatan receivable payments cannot be separated from the vital role of technology, particularly through optimizing an integrated Hospital Management Information System (SIMRS) and the BPJS bridging system. A modern SIMRS must be a strong backbone, capable of automating most of the claim process, from registration to submission.

The importance of a robust BPJS claim module in SIMRS is non-negotiable. An effective SIMRS, such as one developed using the Laravel 11.x framework with a PostgreSQL 16 database, must have the ability to: first, automatically generate a Participant Eligibility Letter (SEP) during patient registration, reducing queues and manual errors. Second, facilitate diagnosis and procedure coding in accordance with ICD-10 and ICD-9-CM quickly and accurately, even with the help of AI modules or coding recommendation systems. Third, track claim status in real-time through integration with BPJS Kesehatan's VEDIKA (Digital Claim Verification) system. This integration allows hospitals to immediately know if a claim is rejected or requires revision, so that corrective action can be taken quickly.

The BPJS bridging system is the connecting bridge between the hospital's SIMRS and various BPJS Kesehatan API services, including SEP, VEDIKA, Online Queue, P-Care, and INA-CBG's. The implementation of this bridging not only reduces administrative workload, but also improves data accuracy and process speed. For example, when a patient registers, SIMRS can directly call the BPJS API to verify membership data and automatically create a SEP. This data is then immediately recorded in SIMRS and the BPJS system, minimizing the potential for duplicate input errors.

For technical implementation, a middleware application based on Node.js 20 LTS or PHP with the Guzzle HTTP client is a very relevant choice. This middleware is responsible for handling RESTful API communication with the BPJS server, including authentication (using Consumer ID, Secret Key, and User Key), generating HMAC-SHA256 signatures, and encrypting/decrypting data if needed. With a microservices architecture, this bridging module can stand alone and interact with SIMRS through internal APIs, providing flexibility and scalability. Ensure the implementation follows strict API security standards and always updates the library versions used to avoid vulnerabilities.

Example Code for BPJS Bridging Implementation (SEP)

Understanding how BPJS bridging works technically is key. Here is an example implementation in two popular programming languages to interact with the BPJS Kesehatan API, specifically in the process of creating or retrieving SEP data. This code is designed to be runnable and provide a concrete picture of the integration.

Example 1: Retrieving SEP Data Using PHP (Laravel/Guzzle)

<?php
namespace App\Services;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Facades\Log;

class BpjsService
{
protected $client;
protected $baseUrl;
protected $consId;
protected $secretKey;
protected $userKey;

public function __construct()
{
$this->baseUrl = env('BPJS_BASE_URL', 'https://apijkn-dev.bpjs-kesehatan.go.id/vclaim-kdev');
$this->consId = env('BPJS_CONS_ID');
$this->secretKey = env('BPJS_SECRET_KEY');
$this->userKey = env('BPJS_USER_KEY');

$this->client = new Client([
'base_uri' => $this->baseUrl,
'timeout' => 10.0,
'headers' => [
'X-cons-id' => $this->consId,
'X-user-key' => $this->userKey,
'Accept' => 'application/json',
],
]);
}

protected function generateSignature()
{
$timestamp = round(microtime(true) * 1000); // Current timestamp in milliseconds
$data = $this->consId . '&' . $timestamp;
$signature = hash_hmac('sha256', $data, $this->secretKey, true);
$encodedSignature = base64_encode($signature);

return [
'timestamp' => $timestamp,
'signature' => $encodedSignature
];
}

public function getSep($noSep)
{
try {
$signatureData = $this->generateSignature();
$response = $this->client->get("SEP/{$noSep}", [
'headers' => [
'X-timestamp' => $signatureData['timestamp'],
'X-signature' => $signatureData['signature'],
],
]);

$body = json_decode($response->getBody()->getContents(), true);
return $body['response'];
} catch (RequestException $e) {
Log::error("BPJS SEP Request Error: " . $e->getMessage());
if ($e->hasResponse()) {
Log::error("BPJS SEP Response Body: " . $e->getResponse()->getBody()->getContents());
}
throw new \Exception("Gagal mengambil data SEP: " . $e->getMessage());
}
}
}

The PHP code above shows how to create a service to interact with the BPJS VClaim API using the Guzzle HTTP client, which is very commonly used in Laravel projects. The generateSignature function is responsible for creating the timestamp and HMAC-SHA256 signature that must be included in every request to the BPJS API. This ensures authentication and data integrity. The getSep function then uses that signature to make a GET request to the BPJS SEP endpoint. Basic error handling with try-catch is also included to log issues and provide an informative message if a communication failure or unexpected API response occurs. Make sure to configure the environment variables BPJS_BASE_URL, BPJS_CONS_ID, BPJS_SECRET_KEY, and BPJS_USER_KEY with the correct values.

Example 2: Node.js Endpoint to Create a New SEP

const express = require('express');
const axios = require('axios');
const crypto = require('crypto');
const app = express();
const port = 3000;

app.use(express.json());

const BPJS_BASE_URL = process.env.BPJS_BASE_URL || 'https://apijkn-dev.bpjs-kesehatan.go.id/vclaim-kdev';
const BPJS_CONS_ID = process.env.BPJS_CONS_ID;
const BPJS_SECRET_KEY = process.env.BPJS_SECRET_KEY;
const BPJS_USER_KEY = process.env.BPJS_USER_KEY;

const generateSignature = () => {
const timestamp = Math.floor(new Date().getTime()); // Current timestamp in milliseconds
const data = `${BPJS_CONS_ID}&${timestamp}`;
const signature = crypto.createHmac('sha256', BPJS_SECRET_KEY)
.update(data)
.digest('base64');
return { timestamp, signature };
};

app.post('/api/bpjs/sep', async (req, res) => {
try {
const { request: sepRequestData } = req.body; // Expecting { request: { t_sep: {...} } }
const { timestamp, signature } = generateSignature();

const response = await axios.post(`${BPJS_BASE_URL}/SEP/2.0/insert`, sepRequestData, {
headers: {
'X-cons-id': BPJS_CONS_ID,
'X-timestamp': timestamp,
'X-signature': signature,
'user_key': BPJS_USER_KEY,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});

res.json(response.data);
} catch (error) {
console.error("Error creating SEP:", error.response ? error.response.data : error.message);
res.status(error.response ? error.response.status : 500).json({
message: "Failed to create SEP",
error: error.response ? error.response.data : error.message
});
}
});

app.listen(port, () => {
console.log(`BPJS Bridging API listening at http://localhost:${port}`);
);

This Node.js code uses Express to create a local API endpoint that can receive requests from the internal SIMRS to create a SEP. Axios is used as the HTTP client to send requests to the BPJS API. Just like the PHP example, the generateSignature function generates the required signature. The endpoint /api/bpjs/sep receives a JSON payload from SIMRS, adds authentication headers, and forwards it to the BPJS VClaim API. Error handling here also includes detailed error logging, including error responses from BPJS if any, which is very helpful in the debugging and troubleshooting process. This implementation allows SIMRS to trigger SEP creation programmatically, reducing manual intervention and speeding up the patient registration workflow.

Example Payload and Error Handling

Understanding the correct payload structure and how to handle error messages from the BPJS API is crucial for a robust bridging implementation. Errors in the payload format or the system's inability to interpret errors can cause delayed or even failed claims.

Example JSON Payload for Creating a SEP (Endpoint /SEP/2.0/insert)

{
"request": {
"t_sep": {
"noKartu": "0001234567890",
"tglSep": "2023-11-20",
"ppkPelayanan": "0901R001",
"jnsPelayanan": "1",
"klsRawat": {
"kodeKelas": "1"
},
"noMR": "1234567",
"rujukan": {
"asalRujukan": "1",
"tglRujukan": "2023-11-19",
"noRujukan": "1234567890123456",
"ppkRujukan": "0901R002"
},
"catatan": "Pasien rawat jalan dengan diagnosa demam tifoid",
"diagAwal": "A01.0",
"poli": {
"tujuan": "INT",
"eksekutif": "0"
},
"cob": {
"cob": "0"
},
"katarak": {
"katarak": "0"
},
"jamainan": {
"lakaLantas": "0",
"penjamin": {
"tglKejadian": "",
"keterangan": "",
"suplesi": {
"suplesi": "0",
"noSepAwal": "",
"kdPropinsi": "",
"kdKabupaten": "",
"kdKecamatan": ""
}
}
},
"tujuanKunj": "0",
"flagProcedure": "",
"kdPenunjang": "",
"assesmentPel": "2",
"skdp": {
"noSurat": "00001/SKDP/XII/2023",
"kodeDPJP": "31668"
},
"dpjpLayan": "31668",
"noTelp": "081234567890",
"user": "Nugroho Setiawan"
}
}
}

The JSON payload above is a realistic example for creating a new SEP. Note the request.t_sep structure, which contains complete details about the patient, referral, type of service, initial diagnosis, and insurance information. Each field must be filled in according to the BPJS API specification. An error in any field, such as an incorrect date format or an unregistered PPK code, will result in failure.

Example Error Message from the BPJS API:

{"metaData":{"code":"400","message":"No. Kartu Tidak Ditemukan atau Tidak Aktif"}}

This error message indicates that the entered BPJS card number is invalid or the membership status is no longer active. The code 400 indicates Bad Request, meaning the BPJS server cannot process the request due to an input error.

How to Handle Errors Effectively:

  1. Client/Server Input Validation: Perform data validation on the SIMRS side before sending requests to the BPJS API. For example, ensure the BPJS card number format is correct (13 digits), the date is valid, and the facility code matches. This reduces the load on the BPJS API and speeds up problem identification.
  2. Implement try-catch: Always use try-catch blocks in your code to catch network exceptions (such as RequestException in PHP or Axios errors in Node.js) and error responses from the API.
  3. Check metaData.code and metaData.message: After receiving a response, always check the code and error message provided by the BPJS API. Code 200 usually means success, while other codes (e.g., 400, 401, 500) indicate a problem.
  4. In addition to checking codes, it is also important to log every error response along with a timestamp and request payload. That way, the IT team and casemix team can trace failure patterns, for example errors that always appear during peak hours or for certain types of claims. Neat logs also make it easier during internal audits and when communicating with BPJS verifiers. If the error is temporary (e.g., 500 or timeout), implement a retry mechanism with staggered delays, for example 3 attempts with intervals of 5, 15, and 30 seconds. However, do not retry without limits because it can actually worsen the server load and trigger blocking.

    Equally important, document every error code along with its meaning and handling steps in an internal knowledge base. Thus, new staff do not need to guess when facing the same error message. The combination of input validation, structured error handling, and good documentation will make the BPJS API integration process much more stable, thereby speeding up the claim submission flow and ultimately accelerating hospital receivable payments.

    Practical Tips to Accelerate BPJS Receivable Payments

    Accelerating BPJS receivable payments does not only depend on smooth API integration, but also on disciplined claim governance. First, ensure claim files are complete from the start: diagnosis, procedures, ICD-10 and ICD-9CM codes, as well as supporting documents such as laboratory results and medical resumes. Claims that are complete from the first submission will reduce the potential for verification pending. Implement a digital checklist in SIMRS so that doctors and nurses can fill in data in real-time, rather than waiting until the end of the month.

    Second, perform layered internal verification before claims are sent to BPJS. Form an internal verifier team tasked with checking code suitability, completeness of signatures, and consistency of data between medical records and bills. Use a double check system with random samples to detect recurring error patterns. If a claim with dispute potential is found, immediately communicate with the BPJS verifier through official channels before the submission deadline ends.

    Third, utilize the receivable monitoring dashboard feature. Create daily or weekly reports that display claim status: submitted, verified, pending, or paid. With this data, management can identify stalled claims and take quick action. Do not forget to always update the team's understanding of the latest BPJS regulations, because rules and tariffs can change at any time. Regular training and API error handling simulations will improve the team's readiness in facing technical obstacles.

    FAQ

    How long is the ideal time to submit a BPJS claim after the patient is discharged?

    Ideally, claims are submitted at most 3 days after the patient is discharged or after the file is complete. The sooner it is submitted, the faster the verification and payment process. However, make sure all documents are correct and complete so that there is no pending that actually slows down payment.

    What should be done if the BPJS API returns error 401?

    Error 401 means an authentication problem, usually because the token or credentials used have expired or are wrong. Recheck the API key, secret key, and token expiration time. Perform the refresh token process according to official BPJS documentation, then try resending the request.

    How to reduce pending claims due to code errors?

    Perform automatic validation of ICD-10 and ICD-9CM codes in SIMRS by referring to the latest code dictionary. Involve the casemix team to perform re-coding if there is a mismatch, and hold regular briefings with doctors regarding the importance of writing specific diagnoses.

    Is automatic retry safe to do for all types of errors?

    No. Retry is safe for temporary errors such as timeout or 5xx errors. For 4xx errors caused by input errors, retry without correction will only produce the same failure. Fix the wrong data first, then resend.

    Effective BPJS receivable management is a combination of reliable technical integration, disciplined claim governance, and continuous monitoring. By implementing a comprehensive strategy starting from input validation, API error handling, internal verification, to dashboard utilization, hospitals can accelerate the payment cycle and maintain healthy cash flow. Do not let receivables pile up just because of technical or administrative obstacles that can actually be anticipated.

    Need assistance to optimize BPJS receivable management at your hospital? Our team is ready to help conduct claim audits, API integration, and prepare SOPs for accelerating payments. Consult your needs now and feel the impact on your hospital's financial efficiency.

    This article is part of the knowledge base of Nugroho Setiawan, an IT consultant in Jogja (Yogyakarta). Related solutions: SIMRS (Hospital Information System) Clinic Management System BPJS & SatuSehat Integration. Need a free consultation?

Terakhir diperbarui 18 Oct 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!

Butuh bantuan implementasi?

Saya membantu konsultasi IT & pengembangan aplikasi untuk rumah sakit, klinik, dan bisnis di Yogyakarta (DIY), Magelang, dan sekitarnya.

Produk & Solusi SIMRS ERP Portfolio Konsultasi Gratis