This campaign sends a follow-up text message to consumers who missed a call from an outbound dialer. The logic block ensures that texts are sent only to active accounts with consent (opted-in) for messaging. Consumers qualify if no text has been sent in the last 30 days, no call was made in the last 3 days, there has been no recent payment, and the preferred contact method is text. The campaign also limits follow-ups based on call attempts to prevent over-contacting.
Please note:
This example configuration showcases the tools in ACE for creating a compliant text campaign. You can also configure the workflow to send an email instead of a text message, if needed.
Always consult your legal or compliance team to ensure your setup adheres to regulations, including TCPA and other relevant laws.
Campaign Steps Overview
Create the Text Message Profile
Dialer Campaign: Use Dialer Results to create the text campaign
Action Path: Set a flag based on the dialer result.
Create A Logic Block: Select eligible accounts based on the dialer flag and other criteria (e.g., no text has been sent in 30 days).
Create an Action Path
Send Text Message: Execute the text message workflow.
Remove Flag: Clear the flag after sending the message
Create Job: Set up a job to trigger workflow based on the action path.
Logic: Select eligible accounts based on the dialer flag and other criteria (e.g., no text has been sent in 30 days).
Send Text Message: Execute the text message workflow.
Remove Flag: Clear the flag after sending the message.
Set Up the Text Message Profile
Category: Information
Identifier: NO_ANSWER_CALL
Send Role ID: Admin
Edit Role ID: Admin
Ignore Time Restriction: False
Message Body: "Sorry, we missed you. Please call ${customer.companyName} at ${customer.phone} or access your account at ${debt.virtualAgentLoginUrl}. Reply HELP for help, STOP to opt out."

Image Displays Example Configuration Text Message Profile for “No Answer Call”
Create an Action Path to Flag Accounts for the No Answer Result Code
This action path adds a flag to accounts that have missed a call. It is triggered by the "No Answer" dialer result code, ensuring the account is marked as eligible for follow-up with a text message.
Go to Setup → Workflow → Action Paths.
Click on "New" to create a new Action Path.
Right Click on the container, click Edit.
Action Path Name: Flag No Answer Result for Text
Save
Add Flow Action:
Right Click on “Flag No Answer Result for Text”, select New
Label: Account Flag Add = ELIGIBLE_FOR_TEXT, DEBT
Description: Set an export flag to indicate that the account is eligible for text message follow-up.
Class Name: Account Flag Add
Flag Identifier: ELIGIBLE_FOR_TEXT
Data Type: Debt
Save

Image Displays Example Configuration for the Flow Action for “Account Flag Add = Eligible For Text”
Caution:
When configuring the dialer result codes (e.g., "No Answer," "Busy," "Answer Machine") to flag accounts for text messaging, be mindful that using the same flag for multiple result codes can lead to unintended text messages. For example, if you call John Smith on Monday and the dialer result is "Busy," then call again on Wednesday with a "No Answer" result, the system could trigger a text message for each result if both are configured with the same flag. This could result in John Smith receiving multiple text messages within a short period.
Add the “Flag No Answer Result for Text” Action Path for Dialer Result Codes
Go to Setup → Vendors → Dialers.
In the Dialer Code section, select the appropriate result code (e.g., "Busy," "No Answer," "Answer Machine").
Set the Action: Flag No Answer Result for Text.
Save.
Repeat for any additional desired dialer result codes.

Image Displays Adding “Flag No Answer Result for Text” Example Dialer Result Code Configuration
Create the "No Answer Follow-Up" Logic Block
This logic block identifies accounts that haven't received a text in the last 30 days. Texts are sent only to active accounts with consent for messaging and follow-up occurs only if no text was sent in the last 30 days and no call was made in the last 3 days. Consumers are eligible if:
Account is active
Consent for texts (opted-in)
No payment within last 30 days
Limited call attempts
Preferred contact method is text
Steps:
Go to Workflow → Logic Blocks → New
Enter Label: No Answer Follow-Up
Add Field: specify the logic and conditions to be applied to the accounts
Add Flag Identifier: ELIGIBLE_FOR_TEXT
Add Additional Criteria if necessary. See our example Custom SQL statement:
AND COALESCE(demographic_phone.last_text_date::date, '1/1/1990') <= CURRENT_DATE - '30 days'::interval AND demographic_phone.debt_id = debt.debt_id AND demographic_phone.last_call_date::date <= CURRENT_DATE - '3 days'::interval AND demographic_phone.demographic_phone_id = ( SELECT demographic_phone_id FROM demographic_phone da, bundle WHERE bundle.primary_debt_id = da.debt_id AND bundle.bundle_id = debt.bundle_id AND da.demographic_type = 'PRIMARY' ORDER BY da.contact_priority, da.last_update DESC LIMIT 1 ) AND demographic_phone.active IS true AND debt.status IN ('ACTIVE', 'NEW') AND COALESCE(debt.last_payment_date::date, '1/1/1990') <= CURRENT_DATE - '30 days'::interval AND debt.do_not_text IS NOT true AND demographic_phone.txt_msg_status = 'OPTED_IN' AND demographic_phone.contact_attempt_count < 3 AND demographic_phone.preferred_contact_method = 'TEXT' AND demographic_phone.last_call_date::date <= CURRENT_DATE - '3 days'::interval
Click Apply
Click Test: review your logic block and make any necessary changes
Click Save when you are satisfied with the Logic Block

Image Displays Example Configuration for “No Answer Follow-Up” Logic Block
Create the “Send Text = No Answer Follow-Up” Action Path
Go to Setup → Workflow → Action Paths.
Click on "New" to create a new Action Path.
Right Click on the container, click Edit.
Action Path Name: Send Text Message = No Answer Follow-Up
Add Flow Action:
Right Click on “Send Text Message = No Answer Follow-Up, select New
Label: Send Text Message = NO_ANSWER_CALL
Description: Sends a text message to the consumer based on the dialer result code.
Class Name: Send Text Message
Text Message Profile: NO_ANSWER_CALL
Save
Add Second Flow Action:
Right Click on “Send Text Message = No Answer Follow-Up, select New
Label: Flag for Export Remove = ELIGIBLE_FOR_TEXT
Description: Removes the export flag after the message is sent.
Class Name: Account Flag Remove
Flag Identifier: ELIGIBLE_FOR_TEXT
Data Type: Debt
Save

Image Displays Example Action Path Configuration for “Send Text Message = No Answer Follow-Up”
Configure the No Answer Follow Up Text Campaign Job
Job Name: No Answer Follow Up Text Campaign
Label: No Answer Follow Up Text Campaign
Description: Sends a text message to a consumer if they did not answer a call.
Schedule: Set it Daily during business hours.
Active: True
Task Type: Workflow: Action Path
Active: True
Selection Logic: Use the 'No Answer Follow-Up' logic block.
Action Path: Send Text = No Answer Follow-Up
Save

Image Displays Example Job Configuration for “No Answer Follow Up Text Campaign”
Text Message Campaign Performance Report
You can use the following SQL report to evaluate the return on investment (ROI) for your text campaigns. The query compares the cost of sending text messages to the actual and estimated fees collected through associated payment plans. It provides both current ROI and projected ROI based on scheduled payments.
This report summarizes:
The number of texts sent by date and template.
The total cost of sending texts.
The total payments received and scheduled through payment plans linked to the messages.
The earned and estimated fee amounts.
ROI and projected ROI as percentages, showing how well the campaign is performing financially.
SELECT
a.*,
to_char(100.0*(("Currency:Fee" - "Currency:Cost") / "Currency:Cost" ),'999,990D99%') as "ROI",
to_char(100.0*(("Currency:Fee" - "Currency:Cost" + COALESCE("Currency:Estimated Fee Remaining",0.0)) / "Currency:Cost"), '999,990D99%') as "~ROI"
FROM
(
SELECT
date_trunc('day', txt_msg_log.sent_date) as "Sent Date",
txt_msg_template.identifier "Template",
count(*) as "Long:# Sent",
(sum(txt_msg_log.txt_msg_parts) * 3)::int as "Currency:Cost",
sum((SELECT
sum(amount)
FROM
payment_plan_schedule
WHERE
payment_plan.active is true
AND payment_plan_schedule.active IS TRUE
AND payment_plan_schedule.payment_plan_id = payment_plan.payment_plan_id)) as "Currency:Remaining in Plan",
sum((SELECT
sum(payment_plan_schedule.commission_amount)
FROM
payment_plan_schedule
WHERE
payment_plan.active is true
AND payment_plan_schedule.active IS TRUE
AND payment_plan_schedule.payment_plan_id = payment_plan.payment_plan_id)) as "Currency:Estimated Fee Remaining",
sum((select sum(payment.amount) from payment where payment_plan.payment_plan_id=payment.payment_plan_id AND payment.status_code_group IN ('PAID','PENDING','SETTLED'))) as "Currency:Payments $",
sum((select sum(commission_amount) from debt_trans, payment where debt_trans.operator = 'RECEIVED' and debt_trans.payment_trans_id = payment.payment_trans_id and payment_plan.payment_plan_id=payment.payment_plan_id)) as "Currency:Fee"
FROM
txt_msg_template, txt_msg_log left outer join payment_plan on (payment_plan.source_id = txt_msg_log.txt_msg_log_id and payment_plan.source ='TXT_MSG')
WHERE
date_trunc('day', txt_msg_log.sent_date) between ${DateRange:Range}
AND txt_msg_log.txt_msg_template_id = txt_msg_template.txt_msg_template_id
group by
date_trunc('day', txt_msg_log.sent_date), txt_msg_template.identifier
) as a
ORDER BY "Sent Date"
Final Review and Testing
Testing: Thoroughly test each logic block and action path to ensure the campaigns are working as expected.
Documentation: Keep a record of all configurations for future reference and updates.
Monitoring: Regularly monitor the campaign performance to adjust logic or messages as needed.
Consult: Always consult your compliance or legal team to ensure your messaging aligns with applicable laws and regulations.
Adhere to Best Practices and Compliance. For more information read ITMS Text Message Compliance and Best Practices