Dunning Letters
Dunning Letters are formal written communications used by businesses to remind or notify customers of overdue payments. These letters are typically part of a sequence, growing progressively firmer in tone as the debt remains unpaid. The dunning process aims to recover the debts in a systematic and professional manner without alienating or losing the customer. Dunning Letters serve not only as reminders but can also be used as evidence in case legal action becomes necessary.
The BMS-Paperless app implements 4 stages in the dunning process, which include:
1. Friendly Reminder: The first letter is often polite and friendly, giving the customer the benefit of the doubt that the non-payment could be an oversight. It generally includes information about the outstanding invoice, the amount due, and a request for payment.
2. More Urgent Reminder: If the payment is not received within a certain time frame, a second letter is sent which is somewhat more firm. It reminds the customer of the overdue payment and might include a warning of the potential consequences of non-payment.
3. Final Notice: This letter is more stern and makes it clear that this is the last communication before further action is taken. It should include a final request for payment, a deadline, and a notice of the actions that will be taken if the payment is not received, such as late fees, reporting to credit agencies, or legal action.
4. Letter Before Action or Legal Notice: This is typically the final letter in the dunning sequence and indicates that the company is prepared to take legal action to recover the debt. It is meant to serve as a final warning to the debtor.
In the BMS-Paperless app, part of the logic for the Dunning Letters is embedded inside the actual Dunning Letters Report Template (RDL File). You can define different groups based on the number of 'Days Overdue' and then assign different wording to each group. See example below.
Dunning Letter vs. Statement
It's important to distinguish between a dunning letter and a month-end statement. A statement is a summary of all unpaid invoices sent to customers at the end of each month, regardless of whether the invoices are overdue. Unlike dunning letters, statements are not considered harassment but are still effective tools for prompting payment.
Sql Query inside the rdl file:
--declare @oPARAMETER1 varchar (40)
--declare @oPARAMETER2 varchar (40)
--declare @oPARAMETER3 varchar (40)
--declare @oPARAMETER4 varchar (40)
--set @oPARAMETER1 ='CENGRO' -- CUSTOMER_ID
--set @oPARAMETER2 ='(USD) $' -- CURRENCY_ID
--set @oPARAMETER3 ='MMC' -- SITE_ID
--set @oPARAMETER4 ='2023/06/10' --CUT-OFF-DATE STRING
declare @TimeBucket1 int
declare @TimeBucket2 int
declare @TimeBucket3 int
set @TimeBucket1 = 1 --Less than this is considered current
set @TimeBucket2 = 14
set @TimeBucket3 = 30
--Logic for DaysOverdueGroup
-- Less than @TimeBucket1 is is considered current ==> DaysOverdueGroup = 100
-- Between TimeBucket1 and @TimeBucket2 ==> DaysOverdueGroup = 1
-- Between TimeBucket2 and @TimeBucket3 ==> DaysOverdueGroup = 2
-- Greater than @TimeBucket4 ==> DaysOverdueGroup = 3
SELECT
RECEIVABLE.CUSTOMER_ID,
RECEIVABLE.CURRENCY_ID,
RECEIVABLE.SITE_ID,
RECEIVABLE.INVOICE_ID,
CUSTOMER.NAME AS CUST_NAME,
RECEIVABLE.INVOICE_DATE,
RECEIVABLE.TERMS_NET_DAYS,
DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE) AS DUE_DATE,
DATEDIFF(d, DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE), CONVERT(DATETIME, @oPARAMETER4)) AS DAYS_OVERDUE,
CASE
WHEN DATEDIFF(d, DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE), CONVERT(DATETIME, @oPARAMETER4)) < @TimeBucket1 THEN 100
WHEN DATEDIFF(d, DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE), CONVERT(DATETIME, @oPARAMETER4)) BETWEEN @TimeBucket1 AND @TimeBucket2 THEN 1
WHEN DATEDIFF(d, DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE), CONVERT(DATETIME, @oPARAMETER4)) BETWEEN @TimeBucket2 AND @TimeBucket3 THEN 2
WHEN DATEDIFF(d, DATEADD(day, ISNULL(RECEIVABLE.TERMS_NET_DAYS, 0), RECEIVABLE.INVOICE_DATE), CONVERT(DATETIME, @oPARAMETER4)) > @TimeBucket3 THEN 3
END AS DaysOverdueGroup,
RECEIVABLE.TOTAL_AMOUNT - RECEIVABLE.PAID_AMOUNT AS Balance,
CUSTOMER.ADDR_1,
CUSTOMER.ADDR_2,
CUSTOMER.ADDR_3,
CUSTOMER.CITY,
CUSTOMER.STATE,
CUSTOMER.ZIPCODE,
CUSTOMER.COUNTRY,
Aux_1.PO_REF
FROM
RECEIVABLE
INNER JOIN CUSTOMER ON RECEIVABLE.CUSTOMER_ID = CUSTOMER.ID
LEFT OUTER JOIN (
SELECT
TOP (100) PERCENT RECEIVABLE_LINE.INVOICE_ID,
MIN(CUSTOMER_ORDER.CUSTOMER_PO_REF) AS PO_REF
FROM
RECEIVABLE_LINE
INNER JOIN CUSTOMER_ORDER ON RECEIVABLE_LINE.CUST_ORDER_ID = CUSTOMER_ORDER.ID
GROUP BY RECEIVABLE_LINE.INVOICE_ID
ORDER BY RECEIVABLE_LINE.INVOICE_ID DESC
) AS Aux_1 ON RECEIVABLE.INVOICE_ID = Aux_1.INVOICE_ID
WHERE
RECEIVABLE.STATUS <> 'X'
AND RECEIVABLE.TOTAL_AMOUNT - RECEIVABLE.PAID_AMOUNT <> 0
AND RECEIVABLE.CUSTOMER_ID LIKE @oPARAMETER1
AND RECEIVABLE.CURRENCY_ID LIKE @oPARAMETER2
AND RECEIVABLE.SITE_ID LIKE @oPARAMETER3
ORDER BY DaysOverdueGroup, RECEIVABLE.INVOICE_DATE
Note: in version v23.9.x a timestamp is automatically added to the Customer Statements and Dinning Letters