51 min readDeterministic automation

Implementation Guide: Trigger reminder workflows for upcoming filing deadlines across all clients

Step-by-step implementation guide for deploying AI to trigger reminder workflows for upcoming filing deadlines across all clients for Accounting & Bookkeeping clients.

Hardware Procurement

No dedicated hardware required

No dedicated hardware required

N/AN/AQty: 0

$0 — This is a fully cloud/SaaS-based deployment

This project is entirely cloud-hosted. All automation, storage, and notification delivery are handled by SaaS platforms (Karbon, Microsoft 365, Twilio). The client's existing business workstations with web browsers and reliable internet (25+ Mbps) are sufficient. Confirm the client has a business-class firewall (e.g., Fortinet FortiGate 40F or SonicWall TZ270) and endpoint detection/response (e.g., SentinelOne or CrowdStrike Falcon Go) already deployed as part of baseline MSP services — these are compliance prerequisites, not project-specific procurements.

Software Procurement

Karbon — Business Plan

Karbon, Inc.Business PlanQty: 5 users

$89/user/month (annual billing) or $99/user/month (monthly billing). For a 5-user firm: ~$445/month (annual) MSP cost / suggested resale $575/month

Primary practice management and workflow automation engine. The Business plan (not Team) is required because it includes automatic client reminders, task automation, time tracking, and budget reporting. Provides the deadline calendar, recurring workflow templates, multi-stage reminder triggers, client CRM, and staff task assignments.

Microsoft 365 Business Premium

Microsoft CorporationSaaS per-seat monthly (CSP program)Qty: 5 users

$22/user/month via CSP. For 5 users: ~$110/month MSP cost / suggested resale $140/month

Provides Outlook email (for sending automated reminder emails), Teams (for internal staff notifications), SharePoint (for deadline calendar data backup and document storage), Azure AD/Entra ID (for SSO and MFA enforcement), and Microsoft Intune (for endpoint compliance). Required for security compliance under FTC Safeguards Rule.

Twilio Programmable SMS

Twilio, Inc.Usage-based APIQty: ~500 messages/month

$0.0079 per outbound SMS + carrier surcharges (~$0.003). Estimated 500 messages/month = ~$5.45/month MSP cost / suggested resale $25/month

Delivers SMS text message reminders directly to client mobile phones for high-priority deadline alerts (e.g., 7-day and 3-day warnings). Provides reliable, programmable SMS delivery with delivery receipts and webhook callbacks.

Twilio SendGrid — Essentials 50K Plan

Twilio, Inc.Essentials 50K PlanQty: 50,000 emails/month

$19.95/month (MSP cost); suggested resale $35/month

Transactional email API for automated deadline reminder emails. Provides deliverability optimization, email templates, open/click tracking, and bounce handling. Used as the email delivery backend when sending high-volume reminder emails outside of Outlook (optional — can use Outlook native send for lower volumes).

Zapier — Professional Plan (Optional)

Zapier, Inc.SaaS monthlyQty: 750 tasks/month

$29.99/month

Middleware integration platform to connect Karbon with non-natively-supported applications (e.g., Drake Tax, specific state filing portals, or custom spreadsheets). Typically not needed if using Karbon + M365 + Twilio as the core stack. Only needed if Karbon lacks a native integration with a specific tool in the client's stack.

Prerequisites

  • Reliable business-class internet connection with minimum 25 Mbps download/upload speed at all office locations
  • Microsoft 365 Business Premium (or higher) deployed for all staff with Azure AD/Entra ID configured — this is the identity backbone for SSO and MFA
  • Multi-factor authentication (MFA) enforced on ALL user accounts that access client information — mandatory under FTC Safeguards Rule / GLBA. Verify via Azure AD Conditional Access policies
  • BitLocker (Windows) or FileVault (macOS) full-disk encryption enabled on all endpoints that access the practice management system — AES-256 encryption at rest required under GLBA
  • Business-grade firewall with active threat protection subscriptions (e.g., Fortinet FortiGate with FortiGuard, SonicWall TZ with security services) deployed at the network perimeter
  • Endpoint Detection and Response (EDR) solution deployed on all workstations (e.g., SentinelOne Complete, CrowdStrike Falcon Go, or Microsoft Defender for Business via M365 Business Premium)
  • Complete client roster with the following data for each client: legal entity name, entity type (individual/S-Corp/C-Corp/partnership/non-profit/trust), EIN or SSN (last 4 only for system reference), fiscal year end date, state(s) of filing obligation, applicable filing types (1040, 1120, 1120-S, 1065, 990, 941, 940, state equivalents)
  • Written Information Security Plan (WISP) document — either existing or to be created as part of this engagement. Must be updated to include the new automation platform as a covered system
  • Designated Security Coordinator at the firm (required by FTC Safeguards Rule) — typically a partner or office manager
  • Firm's current IRS e-file PTIN and EFIN numbers documented (for reference in workflow configuration, not for system access)
  • DNS access for email authentication: ability to add SPF, DKIM, and DMARC records to the firm's domain (required for SendGrid email deliverability and anti-spoofing)
  • Client consent documentation: template consent form compliant with IRS Section 7216 for any automated communications that reference specific tax return types or filing statuses

Installation Steps

Step 1: Discovery & Client Data Audit

Conduct a thorough discovery session with the accounting firm to inventory their current technology stack, client base, and filing obligations. This is the foundation for the entire project — incomplete data here means missed deadlines later.

  • Meet with the managing partner and office manager for 2–3 hours.
  • Document every software tool currently in use (accounting, tax prep, email, calendar, document management).
  • Export or compile the complete client roster with entity types and filing obligations.
  • Identify all federal, state, and local filing deadlines applicable to their client base.
  • Determine the firm's preferred reminder schedule (e.g., 30/14/7/3/1 days before each deadline).
  • Identify who receives reminders: staff only, clients only, or both.
Note

Use a structured intake questionnaire. Key data points to capture per client: entity type, fiscal year end, states of operation, filing types (1040, 1120, 1120-S, 1065, 990, 941, 940, state income tax, state sales tax, property tax, etc.). For firms with 100+ clients, request a CSV export from their current system. This step typically takes 1–2 weeks including data cleanup.

Step 2: Build Master Deadline Calendar

Create a comprehensive master deadline calendar that maps every applicable filing deadline for the current and next tax year. This calendar is the data backbone of the entire automation system. Start with the IRS annual tax calendar (Publication 509) for federal deadlines. Add state-specific deadlines for every state where the firm's clients have filing obligations. Include quarterly deadlines (941 payroll tax, estimated payments), annual deadlines (1040, 1120, 1065, etc.), and informational return deadlines (1099, W-2). Note extension deadlines separately. Account for weekends and holidays (when a deadline falls on a weekend/holiday, the due date shifts to the next business day).

1
Download IRS Publication 509 (Tax Calendar) for reference: https://www.irs.gov/pub/irs-pdf/p509.pdf
Example deadline data structure (CSV format for import)
csv
deadline_name,entity_types,due_date,extended_due_date,frequency,federal_or_state,notes
"Form 1040 - Individual Income Tax Return","Individual","2025-04-15","2025-10-15","Annual","Federal",""
"Form 1120 - Corporate Income Tax Return","C-Corp","2025-04-15","2025-10-15","Annual","Federal","Calendar year filers"
"Form 1120-S - S Corp Income Tax Return","S-Corp","2025-03-15","2025-09-15","Annual","Federal","Calendar year filers"
"Form 1065 - Partnership Return","Partnership","2025-03-15","2025-09-15","Annual","Federal","Calendar year filers"
"Form 990 - Exempt Organization Return","Non-Profit","2025-05-15","2025-11-15","Annual","Federal","Calendar year filers"
"Form 941 - Quarterly Payroll Tax","All with employees","2025-04-30","","Quarterly","Federal","Q1 due date"
"Form 940 - Annual FUTA Tax","All with employees","2025-01-31","","Annual","Federal",""
Note

This is the most labor-intensive step. For a firm operating in 3–5 states, expect 50–100 unique deadline entries. Fiscal year-end clients require custom date calculations. Create the calendar in a spreadsheet first (Google Sheets or Excel) for review with the firm before importing into Karbon. The firm's partners MUST review and approve this calendar — the MSP should not be the sole authority on tax deadlines.

Step 3: Provision Karbon Business Plan Licenses

Set up the Karbon account with Business plan licenses for all staff members. The Business plan (not Team) is required because it includes automatic client reminders and task automation features that are essential for this project.

1
Go to https://karbonhq.com and initiate a Business plan trial or direct purchase.
2
Provision licenses for all staff who will use the system (preparers, reviewers, admin staff, partners).
3
Configure the organization profile with the firm's legal name, address, and branding.
Note

Karbon offers a 14-day free trial on all plans — use this for the pilot phase. Annual billing saves approximately 10% vs. monthly. The Team plan ($59/user/month) does NOT include automatic client reminders — confirm Business plan ($89/user/month annual) is selected. Karbon requires a minimum of 2 users. If the firm has fewer than 5 users, consider TaxDome Pro ($58/user/month annual with 3-year commitment) as a more cost-effective alternative with similar capabilities.

Step 4: Configure Identity, SSO, and MFA in Karbon

Set up secure authentication for all Karbon users using Azure AD/Entra ID SSO and enforce multi-factor authentication. This is a compliance requirement under the FTC Safeguards Rule.

1
In Karbon, navigate to Settings > Authentication.
2
Enable SSO via SAML 2.0 with Azure AD as the identity provider.
3
In Azure AD (Entra ID), create an Enterprise Application for Karbon.
4
Configure SAML settings with Karbon's Entity ID and Reply URL (provided in Karbon's SSO setup wizard).
5
Assign users/groups in Azure AD.
6
Enable Azure AD Conditional Access policy requiring MFA for all sign-ins to the Karbon enterprise application.
Azure AD (Entra ID)
powershell
# Create Conditional Access Policy requiring MFA for Karbon

Install-Module -Name Microsoft.Graph -Force -Scope CurrentUser
Connect-MgGraph -Scopes 'Policy.ReadWrite.ConditionalAccess,Application.Read.All'

# Get the Karbon Enterprise Application Object ID after registering it:
$karbonApp = Get-MgServicePrincipal -Filter "displayName eq 'Karbon'"

# Create Conditional Access Policy requiring MFA for Karbon:
$params = @{
    displayName = 'Require MFA for Karbon Access'
    state = 'enabled'
    conditions = @{
        applications = @{
            includeApplications = @($karbonApp.AppId)
        }
        users = @{
            includeUsers = @('All')
        }
    }
    grantControls = @{
        operator = 'OR'
        builtInControls = @('mfa')
    }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
Note

If Azure AD SSO is not available or the firm uses Google Workspace, Karbon also supports Google SSO. The critical requirement is that MFA is enforced — this is non-negotiable under GLBA. Document the SSO and MFA configuration in the firm's WISP. Test login with at least two users before proceeding.

Step 5: Import Client Roster into Karbon

Import the complete client roster into Karbon as Contacts and Organizations. Each client record must include entity type, filing obligations, fiscal year end, and state(s) of filing — this data drives the automation rules. Prepare a CSV file matching Karbon's import template. Map columns: Organization Name, Primary Contact Name, Email, Phone, Entity Type (use a custom field), Fiscal Year End (custom field), Filing Types (custom field, comma-separated), States (custom field).

1
Navigate to Contacts > Import in Karbon
2
Upload the CSV and map fields
3
Verify import accuracy by spot-checking 10–15 records
Example CSV structure for Karbon import
csv
org_name,contact_first,contact_last,email,phone,entity_type,fiscal_year_end,filing_types,states
"Acme Corp","John","Smith","john@acmecorp.com","555-0100","S-Corp","12/31","1120-S,941,940,CA-100S","CA,NV"
"Jane Doe","Jane","Doe","jane.doe@email.com","555-0200","Individual","12/31","1040,CA-540","CA"
"Smith Family Trust","Bob","Smith","bob@smith.com","555-0300","Trust","12/31","1041,CA-541","CA"
Note

Karbon supports custom fields — create custom fields for Entity Type, Fiscal Year End, Filing Types, and States BEFORE importing. These fields are the backbone of the automation rules. Data quality is critical: garbage in = missed deadlines. Budget 4–8 hours for data cleanup on a 200-client roster. If the firm uses QuickBooks Online or Xero, Karbon has native integrations that can pull client data automatically — check if this covers the needed fields.

Step 6: Create Work Templates for Each Filing Type

In Karbon, create reusable Work (project) templates for each type of filing the firm handles. Each template defines the workflow stages, task checklists, assigned roles, and — critically — the reminder schedule. For example, create a '1040 Individual Tax Return' template with stages: Collect Documents > Prepare Return > Review > Client Approval > E-File > Confirmation. Each stage has tasks with relative due dates (e.g., 'Send document request list' = deadline minus 60 days).

1
Navigate to Settings > Work Templates.
2
Create one template per filing type.
3
Within each template, define work items (tasks) with relative due dates based on the filing deadline.
Note

Start with the 5–7 most common filing types first (1040, 1120, 1120-S, 1065, 990, 941, state equivalents). You can add more templates incrementally. Karbon's template system supports relative dates — set task due dates as 'X days before work due date' so the same template works regardless of the specific deadline date. The firm's senior staff should review and approve all templates before deployment — they know the actual workflow steps.

Step 7: Configure Automated Client Reminders in Karbon

Set up Karbon's built-in automated client reminder system. This is the core of the deadline reminder workflow. Karbon Business plan allows you to configure automatic email reminders that are sent to clients when they have outstanding client tasks (e.g., 'Please upload your W-2s').

1
Navigate to Settings > Client Tasks > Automations.
2
Enable automatic reminders.
3
Configure reminder cadence: send reminders at 30 days, 14 days, 7 days, 3 days, and 1 day before the client task due date.
4
Customize the email template for each reminder stage — the tone should escalate from friendly to urgent.
5
Configure the 'From' address (use the assigned staff member's email for a personal touch, or a firm-wide address like reminders@firmname.com).
Note

Karbon's built-in reminders are email-based. For SMS reminders, we will configure Twilio integration in a later step. Important IRS Section 7216 consideration: reminder emails should reference the deadline type generically (e.g., 'Your annual tax filing deadline is April 15') and NOT include specific return data (income amounts, refund amounts, etc.) unless the firm has obtained written §7216 consent from the client. Draft reminder templates and have the firm's compliance person approve them.

Step 8: Set Up Twilio Account for SMS Reminders

Create and configure a Twilio account for sending SMS deadline reminders to clients. SMS has significantly higher open rates than email (98% vs 20%), making it ideal for critical deadline reminders at the 7-day and 3-day marks.

1
Go to https://www.twilio.com/try-twilio and create an account.
2
Verify the account with a valid payment method.
3
Purchase a local phone number in the firm's area code ($1.15/month).
4
Register for A2P 10DLC messaging (required for business SMS in the US) — this involves registering the brand (the accounting firm) and the campaign (deadline reminders).
5
Configure the messaging service with the purchased phone number.

After account creation, note these values from the Twilio Console: Account SID, Auth Token, and Phone Number.

Test SMS delivery via Twilio CLI
bash
# Test SMS delivery using Twilio CLI:
npm install -g twilio-cli
twilio login
twilio api:core:messages:create \
  --from '+1XXXXXXXXXX' \
  --to '+1YYYYYYYYYY' \
  --body 'Test reminder: This is a filing deadline test message from [Firm Name].'
Test SMS delivery via curl API call
bash
curl -X POST https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json \
  --data-urlencode 'From=+1XXXXXXXXXX' \
  --data-urlencode 'To=+1YYYYYYYYYY' \
  --data-urlencode 'Body=Test: Your upcoming filing deadline is approaching. Please contact [Firm Name] at (555) 555-0100.' \
  -u ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:your_auth_token
Note

A2P 10DLC registration is MANDATORY for business SMS in the US. Without it, messages will be filtered by carriers. The registration process takes 1–5 business days for brand approval. Register the campaign type as 'Account Notification'. Twilio charges ~$4 for brand registration and $15 for campaign registration (one-time). Keep SMS messages under 160 characters to avoid multi-segment charges. Never include sensitive financial data in SMS messages — this is both a §7216 and general security concern.

Step 9: Build Twilio SMS Integration with Karbon via Zapier or Make.com

Connect Karbon's workflow events to Twilio SMS delivery. When a client task reaches specific reminder thresholds (7 days, 3 days, 1 day before deadline), trigger an SMS to the client's mobile number. Since Karbon does not have a native Twilio integration, use Zapier or Make.com as the middleware. In Zapier: Create a new Zap with trigger 'Karbon — Work Status Changed' or use Karbon's webhook/API to detect upcoming deadlines. Set the action to 'Twilio — Send SMS'. Map the client's phone number and a templated reminder message. Alternatively, use Make.com for higher volume at lower cost.

Zapier Configuration

1
Trigger: Karbon Webhook (or Schedule trigger polling Karbon API)
2
Filter: Only continue if work due date is 7, 3, or 1 days from today
3
Action: Twilio — Send SMS
Twilio Send SMS action field mapping in Zapier
plaintext
To: {{client_phone_number}}
From: +1XXXXXXXXXX
Body: 'Reminder from [Firm Name]: Your {{filing_type}} filing deadline is {{due_date}}. Please ensure all documents are submitted. Questions? Call us at (555) 555-0100.'

Make.com Configuration

1
Module 1: HTTP GET to Karbon API /v3/works?filter[status]=active
2
Module 2: Iterator — loop through works
3
Module 3: Filter — due date within 7 days
4
Module 4: Twilio Send SMS with mapped fields

Power Automate Configuration

1
Trigger: Recurrence (daily at 8:00 AM)
2
Action: HTTP GET to Karbon API
3
Condition: due_date - today <= 7
4
Action: Send SMS via Twilio connector (premium)
Note

Karbon's API is available on Business plan. API documentation: https://developers.karbonhq.com/. You will need to generate an API key in Karbon Settings > Integrations. Zapier Professional ($29.99/month) supports multi-step Zaps needed for this workflow. Make.com Core ($10.59/month) is more cost-effective for higher volumes. If using Power Automate, it is included with M365 Business Premium but the Twilio connector requires Power Automate Premium ($15/user/month) — typically only one user (the service account) needs this license.

Step 10: Configure Microsoft Teams Notifications for Internal Staff

Set up automated Microsoft Teams notifications to alert firm staff about upcoming deadlines and overdue tasks. This provides an internal awareness layer separate from client-facing reminders. In Karbon, enable the Microsoft Teams integration (Settings > Integrations > Microsoft Teams). Configure channel notifications: create a dedicated Teams channel called '#deadline-alerts' in the firm's primary Team. Map Karbon work status changes and upcoming deadlines to post notifications in this channel. Configure @mentions for the assigned staff member on each work item.

1
Create the Teams channel via PowerShell (Microsoft Teams module)
2
Get the Team ID
3
Create the deadline alerts channel
4
If using Power Automate for Teams notifications instead of Karbon native: Create a Flow: Recurrence (daily 8AM) > HTTP to Karbon API > Condition (deadlines within 7 days) > Post Message to Teams Channel
Create the #deadline-alerts Teams channel via PowerShell using the Microsoft Teams module
powershell
Install-Module -Name MicrosoftTeams -Force -Scope CurrentUser
Connect-MicrosoftTeams

$team = Get-Team -DisplayName 'Firm Operations'

New-TeamChannel -GroupId $team.GroupId -DisplayName 'Deadline Alerts' -Description 'Automated filing deadline reminders and alerts' -MembershipType Standard
Note

Karbon has a native Microsoft Teams integration that can post notifications when work items are updated. For the most reliable deadline-specific alerts, supplement with a Power Automate flow that runs daily and posts a summary of all deadlines due in the next 7 days. This gives the team a single daily digest rather than individual notifications. Configure Teams notification settings so that #deadline-alerts posts trigger desktop/mobile push notifications for key staff.

Step 11: Configure Email Authentication (SPF, DKIM, DMARC)

Ensure all automated reminder emails pass email authentication checks and are not flagged as spam. This is critical for client-facing reminder deliverability. Add SPF, DKIM, and DMARC DNS records for the firm's domain to authorize both Microsoft 365 and SendGrid (if used) as legitimate senders.

1
Add SPF TXT record to firmname.com
2
Configure DKIM in Microsoft 365 Admin Center > Settings > Domains > [domain] > DNS Records
3
Configure DKIM in SendGrid: Settings > Sender Authentication > Domain Authentication
4
Add DMARC TXT record to _dmarc.firmname.com
DNS records to add to the firm's domain (example: firmname.com)
dns
# SPF Record (TXT record on firmname.com):
# If using M365 only:
v=spf1 include:spf.protection.outlook.com -all

# If using M365 + SendGrid:
v=spf1 include:spf.protection.outlook.com include:sendgrid.net -all

# DMARC Record (TXT record on _dmarc.firmname.com):
v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@firmname.com; pct=100
Note

SPF, DKIM, and DMARC are essential for email deliverability. Without them, automated reminder emails may land in spam folders — defeating the entire purpose. Start with DMARC policy 'p=none' for 2 weeks to monitor, then move to 'p=quarantine'. Use a DMARC monitoring service like Valimail or dmarcian (free tier available) to track results. Verify configuration with https://mxtoolbox.com/spf.aspx and https://mxtoolbox.com/dkim.aspx.

Step 12: Build and Import the Annual Work Schedule

Using the master deadline calendar (Step 2) and client roster (Step 5), create the actual work items in Karbon for the current tax year. This is where deadline dates are assigned to specific clients using the work templates created in Step 6. For each client, create recurring Work items based on their entity type and filing obligations. Apply the appropriate work template (e.g., '1040 Individual Tax Return' template for individual clients). Set the work due date to the actual filing deadline. Assign the responsible staff member (preparer and reviewer). This can be done via Karbon's bulk work creation feature or via API for large client bases.

1
For firms with 100+ clients, use Karbon's API for bulk work creation: POST https://api.karbonhq.com/v3/Works
2
Headers: Authorization: Bearer {api_key}, Content-Type: application/json
3
Example API call to create a work item (see code block below)
4
Script to bulk-create works from CSV: Use Python, PowerShell, or Node.js to loop through client CSV and POST to API
Karbon API: Create a single work item via curl
bash
curl -X POST https://api.karbonhq.com/v3/Works \
  -H 'Authorization: Bearer YOUR_KARBON_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "Title": "2024 Form 1040 - John Smith",
    "WorkTemplateKey": "TEMPLATE_KEY_HERE",
    "ClientKey": "CLIENT_KEY_HERE",
    "DueDate": "2025-04-15",
    "AssigneeKey": "STAFF_KEY_HERE",
    "Description": "Individual income tax return for John Smith, filing year 2024"
  }'
Note

For a 200-client firm with an average of 3 filings per client, this means ~600 work items to create. Manual creation is feasible for smaller firms (under 50 clients) but API-based bulk creation saves significant time for larger rosters. Karbon also supports recurring work — configure annual filings to auto-recreate each year. Budget 4–8 hours for this step depending on firm size. Verify every work item has the correct due date — a single date error can mean a missed deadline and IRS penalties.

Step 13: Create Escalation Workflow for Overdue Items

Configure an escalation path for deadlines that are approaching without completion. If a client has not responded to reminders and the deadline is imminent, the system should escalate to a partner or manager for personal outreach. In Karbon, create an automation rule: if a work item is within 3 days of its due date and client tasks are still outstanding, automatically reassign or add a partner as a collaborator and send an internal notification. Configure a separate urgent SMS via Twilio for the partner's mobile. Create a final escalation at 1 day before deadline that triggers a phone call task for the assigned staff member.

Note

Escalation is critical for risk management. The reminder system is only effective if someone acts on unresponsive clients. Define clear escalation tiers: Tier 1 (automated reminders at 30/14/7 days) > Tier 2 (add partner + urgent internal alert at 3 days) > Tier 3 (manual phone call task at 1 day). Document this escalation policy and include it in the firm's WISP as part of their operational risk management.

Step 14: Update the Firm's WISP (Written Information Security Plan)

Update the accounting firm's Written Information Security Plan to document the new automation system, its data flows, vendor relationships, and security controls. This is a legal requirement under both the FTC Safeguards Rule and IRS guidelines.

1
Karbon as a new system processing client PII, including its SOC 2 Type II certification
2
Twilio as a communication service provider processing client phone numbers
3
Zapier/Make.com as a data middleware processing client identifiers
4
Data flow diagram showing how client data moves between systems
5
Access controls (who has admin access, who can view client data)
6
Incident response procedures for the new systems
Note

The IRS provides a sample WISP template at https://www.irs.gov/tax-professionals/sample-security-plan-for-tax-professionals. Use this as the starting point if the firm does not have an existing WISP. The MSP should offer WISP creation/update as a billable service ($1,500–$3,000). This is a high-value compliance deliverable that also deepens the client relationship. The WISP must be reviewed and signed by the firm's Designated Security Coordinator.

Step 15: Pilot Testing with Subset of Clients

Before full rollout, run a 1–2 week pilot with a small subset of clients (10–20) to validate that reminders are firing correctly, emails are being delivered, SMS messages are arriving, and the timing logic is accurate.

  • Select a diverse test group: include at least one of each entity type (individual, S-Corp, C-Corp, partnership, non-profit).
  • Include clients in different states to test state-specific deadlines.
  • Monitor the automation engine daily during the pilot.
  • Check email delivery logs in Karbon and SendGrid.
  • Check SMS delivery receipts in Twilio.
  • Verify Teams notifications are posting to the correct channel.
  • Collect feedback from firm staff on workflow usability.
Check Twilio SMS delivery status via API
bash
curl -X GET 'https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json?DateSent>=2025-01-01&To=+1YYYYYYYYYY' \
  -u ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:your_auth_token
Check SendGrid email delivery stats
bash
curl -X GET 'https://api.sendgrid.com/v3/stats?start_date=2025-01-01' \
  -H 'Authorization: Bearer YOUR_SENDGRID_API_KEY'
Note

The pilot period should ideally include at least one actual upcoming deadline so you can validate end-to-end. If no natural deadline is imminent, create test work items with artificial deadlines set 7–30 days in the future. Common issues found during pilot: incorrect timezone settings (reminders firing at wrong time of day), email going to spam (SPF/DKIM not configured), SMS blocked by carrier (A2P 10DLC not registered), staff not receiving Teams notifications (notification settings). Document all issues and resolutions.

Step 16: Full Rollout and Staff Training

After successful pilot, roll out the system to all clients and conduct formal training for all firm staff. Create all remaining work items for the full client roster. Conduct a 90-minute training session covering: how to view and manage the deadline dashboard in Karbon, how to handle client responses to reminders, how to manually send additional reminders, how to mark tasks as complete, how to use the escalation workflow, how to add new clients and their deadlines, and how to handle mid-year changes (new client onboarding, entity type changes, fiscal year changes).

Note

Record the training session for future reference and new staff onboarding. Create a 1-page quick reference guide with screenshots showing the most common daily tasks. Schedule a follow-up check-in at 2 weeks post-launch to address questions and fine-tune reminder frequency based on staff and client feedback. Some clients may request to opt out of SMS reminders — ensure there is a process to flag these clients and disable their SMS notifications while keeping email active.

Custom AI Components

Master Deadline Calendar Engine

Type: workflow A structured data model and annual refresh process for maintaining the comprehensive filing deadline calendar across all federal and state jurisdictions. This is the core data source that drives all reminder triggers. It maps entity types to filing obligations and calculates actual due dates accounting for weekends, holidays, and fiscal year variations.

Data Structure (SharePoint List or Karbon Custom Fields)

deadline_id

Auto-increment

1001

filing_type

Text

Form 1040

entity_types

Multi-select

Individual

jurisdiction

Text

Federal / CA / NY

base_due_date

Date

2025-04-15

extended_due_date

Date

2025-10-15

frequency

Choice

Annual / Quarterly / Monthly

fiscal_year_offset

Number

0 (calendar year) or number of months offset

weekend_holiday_rule

Choice

Next Business Day

notes

Text

Calendar year filers only

Core Federal Deadlines (Partial — Top 15)

1
Form 1040 (Individual) — April 15 / Oct 15 extended
2
Form 1120 (C-Corp, calendar year) — April 15 / Oct 15 extended
3
Form 1120-S (S-Corp, calendar year) — March 15 / Sep 15 extended
4
Form 1065 (Partnership, calendar year) — March 15 / Sep 15 extended
5
Form 990 (Non-Profit, calendar year) — May 15 / Nov 15 extended
6
Form 1041 (Trust/Estate, calendar year) — April 15 / Sep 30 extended
7
Form 941 (Quarterly Payroll) — Apr 30, Jul 31, Oct 31, Jan 31
8
Form 940 (Annual FUTA) — January 31
9
Form 1099-NEC (Nonemployee Compensation) — January 31
10
Form 1099-MISC (Miscellaneous) — February 28 (paper) / March 31 (e-file)
11
Form W-2 (Wage Statements) — January 31
12
Estimated Tax Payments (1040-ES/1120-W) — Apr 15, Jun 15, Sep 15, Jan 15
13
Form 5500 (Employee Benefit Plan) — July 31 (calendar year)
14
FBAR / FinCEN 114 — April 15 / Oct 15 auto-extended
15
Form 8809 (Extension for Info Returns) — January 31

Annual Refresh Process

1
November each year: Download IRS Publication 509 for the upcoming year
2
November-December: Update all federal deadlines with confirmed dates
3
December: Check each state's Department of Revenue website for state deadline updates
4
January 1: Activate the new year's deadline calendar
5
Ongoing: Monitor IRS and state announcements for disaster-related extensions (e.g., hurricane, wildfire deadline extensions)

Weekend/Holiday Adjustment Logic

Adjusts any deadline date to the next valid business day, skipping weekends and US federal holidays
python
import datetime
from pandas.tseries.holiday import USFederalHolidayCalendar

def adjust_deadline(base_date: datetime.date) -> datetime.date:
    cal = USFederalHolidayCalendar()
    holidays = cal.holidays(start=base_date - datetime.timedelta(days=7), 
                            end=base_date + datetime.timedelta(days=7)).to_pydatetime()
    holiday_dates = [h.date() for h in holidays]
    
    adjusted = base_date
    while adjusted.weekday() >= 5 or adjusted in holiday_dates:  # 5=Sat, 6=Sun
        adjusted += datetime.timedelta(days=1)
    return adjusted

# Example:
# If April 15, 2028 falls on a Saturday:
# adjust_deadline(datetime.date(2028, 4, 15)) returns April 17, 2028 (Monday)

Fiscal Year Client Handling

For clients with non-calendar fiscal year ends, calculate deadlines as:

  • S-Corp/Partnership: 15th day of 3rd month after fiscal year end
  • C-Corp: 15th day of 4th month after fiscal year end
  • Non-Profit: 15th day of 5th month after fiscal year end
Calculates the filing deadline for any entity type based on fiscal year end date, then adjusts for weekends and holidays
python
from dateutil.relativedelta import relativedelta

def calculate_filing_deadline(fiscal_year_end: datetime.date, entity_type: str) -> datetime.date:
    offsets = {
        'S-Corp': 3,
        'Partnership': 3,
        'C-Corp': 4,
        'Individual': 4,  # Always calendar year (12/31)
        'Non-Profit': 5,
        'Trust': 4,
    }
    months = offsets.get(entity_type, 4)
    deadline = fiscal_year_end + relativedelta(months=months)
    deadline = deadline.replace(day=15)
    return adjust_deadline(deadline)

Multi-Stage Reminder Workflow Template

Type: workflow Defines the complete multi-stage, multi-channel reminder workflow that triggers at 30, 14, 7, 3, and 1 days before each filing deadline. Each stage has different messaging tone, delivery channels, and escalation behavior. This is implemented as Karbon work templates with automated client tasks, supplemented by Zapier/Make.com triggers for SMS delivery.

Multi-Stage Reminder Workflow — Complete Specification

Stage 1: 30 Days Before Deadline (Informational)

  • Channel: Email only
  • Recipient: Client primary contact
  • Tone: Friendly, informational
  • Internal Action: Create Karbon work item from template; assign to preparer
  • Escalation: None
Stage 1 — Email Subject
text
Upcoming Filing Deadline — {{filing_type}} due {{due_date}}
Stage 1 — Email Body Template
text
Dear {{client_first_name}},

This is a friendly reminder that your {{filing_type}} filing deadline is {{due_date}}, which is approximately 30 days away.

To ensure timely filing, please begin gathering the following documents:
{{document_checklist}}

You can upload documents securely through your client portal or email them directly to {{staff_email}}.

If you have any questions, please don't hesitate to reach out.

Best regards,
{{staff_name}}
{{firm_name}}
{{firm_phone}}

Stage 2: 14 Days Before Deadline (Action Required)

  • Channel: Email
  • Recipient: Client primary contact
  • Tone: Professional, action-oriented
  • Internal Action: Karbon automated reminder fires; Teams notification to preparer
  • Escalation: None
Stage 2 — Email Subject
text
Action Required — {{filing_type}} due in 14 days ({{due_date}})
Stage 2 — Email Body Template
text
Dear {{client_first_name}},

Your {{filing_type}} filing deadline is {{due_date}} — just two weeks away.

{{#if outstanding_documents}}
We are still waiting for the following items:
{{outstanding_documents_list}}

Please submit these at your earliest convenience so we can complete your filing on time.
{{else}}
Thank you for submitting your documents. We are actively working on your filing and will be in touch if we need anything additional.
{{/if}}

Best regards,
{{staff_name}}
{{firm_name}}
{{firm_phone}}

Stage 3: 7 Days Before Deadline (Urgent)

  • Channel: Email + SMS
  • Recipient: Client primary contact + client secondary contact (if on file)
  • Tone: Urgent
  • Internal Action: Teams notification to preparer AND reviewer; work item flagged as "At Risk"
  • Escalation: Add manager/partner as collaborator on Karbon work item
Stage 3 — Email Subject
text
URGENT — {{filing_type}} due in 7 days ({{due_date}})
Stage 3 — SMS Template (under 160 chars)
text
[Firm Name] REMINDER: Your {{filing_type}} is due {{due_date}}. Outstanding items needed. Please call us at {{firm_phone}} or upload docs to your portal.

Stage 4: 3 Days Before Deadline (Critical)

  • Channel: Email + SMS + Teams (internal)
  • Recipient: Client primary contact + all client contacts on file
  • Tone: Critical/Formal
  • Internal Action: Partner notified via Teams @mention; phone call task created for assigned staff
  • Escalation: Partner review required; decision to file extension if needed
Stage 4 — Email Subject
text
CRITICAL — {{filing_type}} filing deadline in 3 days ({{due_date}})
Stage 4 — SMS Template
text
CRITICAL from [Firm Name]: Your {{filing_type}} is due {{due_date}}. Immediate action required. Call {{firm_phone}} today.

Stage 5: 1 Day Before Deadline (Final Warning)

  • Channel: Email + SMS + Phone call (manual)
  • Recipient: Client primary contact
  • Tone: Final notice
  • Internal Action: Mandatory partner sign-off; decision: file return, file extension, or document non-response in client file
  • Escalation: Full escalation — partner takes over client communication
Stage 5 — Email Subject
text
FINAL NOTICE — {{filing_type}} due TOMORROW ({{due_date}})
Stage 5 — SMS Template
text
FINAL NOTICE [Firm Name]: {{filing_type}} due TOMORROW {{due_date}}. Call {{firm_phone}} IMMEDIATELY to avoid penalties.

Post-Deadline (if unfiled)

Note

Internal Only: Generate report of unfiled returns; partner review within 24 hours; determine if extension was filed; document outcome in Karbon work item notes.

Karbon Implementation

1
Create Work Template with 5 client tasks corresponding to each stage
2
Set client task due dates as relative: -30, -14, -7, -3, -1 days from work due date
3
Enable automatic reminders on client tasks (Karbon Business plan feature)
4
For SMS stages (7, 3, 1 day), use Zapier/Make.com trigger on Karbon work status or client task status change

Zapier Zap Configuration for SMS (Stage 3, 4, 5)

  • Trigger: Schedule by Zapier (Every Day at 8:00 AM firm local time)
  • Action 1: Karbon — Find Work Items (filter: due date within 7 days AND status != Complete)
  • Action 2: Filter — only proceed if days until due = 7 OR 3 OR 1
  • Action 3: Twilio — Send SMS (map client phone, compose message per stage template)
  • Action 4: Karbon — Add Note to Work (log that SMS was sent)

Bulk Work Item Creator Script

Type: integration

A Python script that reads the client roster CSV and master deadline calendar, then bulk-creates work items in Karbon via API. This eliminates hours of manual data entry for firms with 100+ clients and ensures consistent, error-free work item creation.

Implementation:

python
#!/usr/bin/env python3
"""
Bulk Work Item Creator for Karbon
Reads client roster CSV and creates work items for each client's filing obligations.
Designed for MSP technicians deploying deadline reminder systems.

Prerequisites:
  pip install requests python-dateutil pandas

Usage:
  python bulk_create_works.py --clients clients.csv --api-key YOUR_API_KEY
"""

import argparse
import csv
import datetime
import json
import sys
import time
from dateutil.relativedelta import relativedelta
import requests

# Karbon API base URL
KARBON_API_BASE = "https://api.karbonhq.com/v3"

# Mapping of filing types to Karbon Work Template Keys
# UPDATE THESE with actual template keys from the client's Karbon instance
TEMPLATE_KEYS = {
    "1040": "TEMPLATE_KEY_1040",
    "1120": "TEMPLATE_KEY_1120",
    "1120-S": "TEMPLATE_KEY_1120S",
    "1065": "TEMPLATE_KEY_1065",
    "990": "TEMPLATE_KEY_990",
    "1041": "TEMPLATE_KEY_1041",
    "941": "TEMPLATE_KEY_941",
    "940": "TEMPLATE_KEY_940",
}

# Federal deadline rules: entity_type -> (months_after_fye, day_of_month)
DEADLINE_RULES = {
    "1040": {"months_offset": 4, "day": 15},       # April 15 for calendar year
    "1120": {"months_offset": 4, "day": 15},       # April 15 for calendar year
    "1120-S": {"months_offset": 3, "day": 15},     # March 15 for calendar year
    "1065": {"months_offset": 3, "day": 15},       # March 15 for calendar year
    "990": {"months_offset": 5, "day": 15},        # May 15 for calendar year
    "1041": {"months_offset": 4, "day": 15},       # April 15 for calendar year
    "941": {"quarterly_dates": ["04-30", "07-31", "10-31", "01-31"]},
    "940": {"months_offset": 1, "day": 31},        # January 31
}


def adjust_for_weekends_holidays(date_obj):
    """Adjust deadline to next business day if it falls on weekend.
    Note: For production, add federal holiday checking."""
    while date_obj.weekday() >= 5:  # Saturday = 5, Sunday = 6
        date_obj += datetime.timedelta(days=1)
    return date_obj


def calculate_due_date(filing_type, fiscal_year_end_str, tax_year):
    """Calculate the filing due date based on entity type and fiscal year end."""
    fye_month, fye_day = map(int, fiscal_year_end_str.split('/'))
    fiscal_year_end = datetime.date(tax_year, fye_month, fye_day)
    
    rule = DEADLINE_RULES.get(filing_type)
    if not rule:
        return None
    
    if "quarterly_dates" in rule:
        # Return list of quarterly dates for the tax year
        dates = []
        for qd in rule["quarterly_dates"]:
            month, day = map(int, qd.split('-'))
            year = tax_year if month > 1 else tax_year + 1
            dates.append(adjust_for_weekends_holidays(datetime.date(year, month, day)))
        return dates
    
    due_date = fiscal_year_end + relativedelta(months=rule["months_offset"])
    due_date = due_date.replace(day=rule["day"])
    return [adjust_for_weekends_holidays(due_date)]


def create_work_item(api_key, title, template_key, client_key, due_date, assignee_key, description):
    """Create a single work item in Karbon via API."""
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    }
    payload = {
        "Title": title,
        "WorkTemplateKey": template_key,
        "ClientKey": client_key,
        "DueDate": due_date.isoformat(),
        "AssigneeKey": assignee_key,
        "Description": description,
    }
    
    response = requests.post(f"{KARBON_API_BASE}/Works", headers=headers, json=payload)
    
    if response.status_code in (200, 201):
        work = response.json()
        print(f"  ✓ Created: {title} (Due: {due_date}) [ID: {work.get('Key', 'N/A')}]")
        return True
    else:
        print(f"  ✗ FAILED: {title} — {response.status_code}: {response.text}")
        return False


def main():
    parser = argparse.ArgumentParser(description='Bulk create Karbon work items for filing deadlines')
    parser.add_argument('--clients', required=True, help='Path to clients CSV file')
    parser.add_argument('--api-key', required=True, help='Karbon API key')
    parser.add_argument('--tax-year', type=int, default=datetime.date.today().year - 1,
                        help='Tax year (default: previous calendar year)')
    parser.add_argument('--dry-run', action='store_true', help='Print what would be created without calling API')
    args = parser.parse_args()

    print(f"\n{'='*60}")
    print(f"Karbon Bulk Work Creator — Tax Year {args.tax_year}")
    print(f"{'='*60}\n")

    created = 0
    failed = 0
    skipped = 0

    with open(args.clients, 'r', encoding='utf-8-sig') as f:
        reader = csv.DictReader(f)
        for row in reader:
            org_name = row['org_name'].strip()
            client_key = row.get('karbon_client_key', '').strip()
            assignee_key = row.get('karbon_assignee_key', '').strip()
            fiscal_year_end = row.get('fiscal_year_end', '12/31').strip()
            filing_types = [ft.strip() for ft in row.get('filing_types', '').split(',')]

            print(f"\nProcessing: {org_name}")
            
            if not client_key:
                print(f"  ⚠ Skipping — no Karbon client key")
                skipped += 1
                continue

            for filing_type in filing_types:
                template_key = TEMPLATE_KEYS.get(filing_type)
                if not template_key:
                    print(f"  ⚠ No template for filing type: {filing_type}")
                    skipped += 1
                    continue

                due_dates = calculate_due_date(filing_type, fiscal_year_end, args.tax_year)
                if not due_dates:
                    print(f"  ⚠ Could not calculate due date for {filing_type}")
                    skipped += 1
                    continue

                for i, due_date in enumerate(due_dates):
                    quarter_label = f" Q{i+1}" if len(due_dates) > 1 else ""
                    title = f"{args.tax_year} {filing_type}{quarter_label} — {org_name}"
                    description = f"{filing_type} filing for {org_name}, tax year {args.tax_year}"

                    if args.dry_run:
                        print(f"  [DRY RUN] Would create: {title} (Due: {due_date})")
                        created += 1
                    else:
                        if create_work_item(args.api_key, title, template_key,
                                           client_key, due_date, assignee_key, description):
                            created += 1
                        else:
                            failed += 1
                        time.sleep(0.5)  # Rate limiting: 2 requests/second

    print(f"\n{'='*60}")
    print(f"Summary: {created} created, {failed} failed, {skipped} skipped")
    print(f"{'='*60}\n")


if __name__ == '__main__':
    main()

Daily Deadline Monitor & SMS Dispatcher

Type: integration A Make.com (or Zapier) scenario that runs daily at 8:00 AM, queries Karbon for work items approaching their deadlines, and dispatches SMS reminders via Twilio for items at the 7-day, 3-day, and 1-day thresholds. This bridges the gap between Karbon's email-based reminders and SMS delivery.

Make.com Scenario: Daily Deadline SMS Dispatcher

Scenario Overview

  • Trigger: Schedule (Every day at 8:00 AM Eastern)
  • Module 1: HTTP — GET Karbon API for active work items
  • Module 2: Iterator — Loop through work items
  • Module 3: Router — Branch based on days until deadline - Route A: 7 days → Send informational SMS - Route B: 3 days → Send urgent SMS - Route C: 1 day → Send critical SMS
  • Module 4: Twilio — Send SMS
  • Module 5: HTTP — POST note to Karbon work item (log SMS sent)

Module 1: HTTP Request (GET active works from Karbon)

  • URL: https://api.karbonhq.com/v3/Works
  • Method: GET
  • Headers: - Authorization: Bearer {{KARBON_API_KEY}} - Content-Type: application/json
Module 1 Query Parameter: $filter
text
$filter: Status ne 'Completed' and DueDate ge '{{formatDate(now; "YYYY-MM-DD")}}' and DueDate le '{{formatDate(addDays(now; 30); "YYYY-MM-DD")}}'

Module 2: Iterator

  • Array: {{Module1.body.value}}

Module 3: Router with 3 Routes

  • Route A Filter (7 days): Condition: {{formatDate(parseDate(iterator.DueDate); "YYYY-MM-DD")}} equals {{formatDate(addDays(now; 7); "YYYY-MM-DD")}}
  • Route B Filter (3 days): Condition: {{formatDate(parseDate(iterator.DueDate); "YYYY-MM-DD")}} equals {{formatDate(addDays(now; 3); "YYYY-MM-DD")}}
  • Route C Filter (1 day): Condition: {{formatDate(parseDate(iterator.DueDate); "YYYY-MM-DD")}} equals {{formatDate(addDays(now; 1); "YYYY-MM-DD")}}

Module 4: Twilio Send SMS (per route)

Twilio SMS message templates by route
text
Route A (7-day): Reminder from [FIRM NAME]: Your {{iterator.Title}} filing is due {{formatDate(parseDate(iterator.DueDate); "MMM D, YYYY")}}. Please submit outstanding documents. Call (555) 555-0100 with questions.

Route B (3-day): URGENT [FIRM NAME]: Your {{iterator.Title}} is due in 3 DAYS on {{formatDate(parseDate(iterator.DueDate); "MMM D, YYYY")}}. Immediate action needed. Call (555) 555-0100 TODAY.

Route C (1-day): FINAL NOTICE [FIRM NAME]: {{iterator.Title}} due TOMORROW. Call (555) 555-0100 IMMEDIATELY to avoid penalties.
  • Account SID: {{TWILIO_ACCOUNT_SID}}
  • Auth Token: {{TWILIO_AUTH_TOKEN}}
  • From: {{TWILIO_PHONE_NUMBER}}
  • To: {{iterator.ClientPhoneNumber}} (mapped from Karbon client contact)

Module 5: HTTP Request (Log SMS in Karbon)

  • URL: https://api.karbonhq.com/v3/Works/{{iterator.Key}}/Notes
  • Method: POST
  • Headers: Authorization: Bearer {{KARBON_API_KEY}}
Module 5 POST body
json
# log SMS sent as a note on the Karbon work item

{
  "Body": "SMS reminder sent to client ({{iterator.ClientPhoneNumber}}) - {{now}} - Stage: {{route_label}}",
  "NoteType": "Comment"
}

Zapier Implementation Steps

1
Trigger: Schedule by Zapier → Every Day at 8:00 AM
2
Action: Webhooks by Zapier → GET to Karbon API (same URL as above)
3
Action: Looping by Zapier → Loop through results
4
Action: Filter by Zapier → Days until deadline = 7, 3, or 1
5
Action: Twilio → Send SMS (same message templates)
6
Action: Webhooks by Zapier → POST note to Karbon

Power Automate Implementation Steps

1
Trigger: Recurrence → Daily at 8:00 AM
2
Action: HTTP → GET Karbon API
3
Action: Parse JSON → Extract work items
4
Action: Apply to Each → Loop through items
5
Condition: Calculate days until due date
6
Action: Twilio connector → Send SMS
7
Action: HTTP → POST note to Karbon
Note

Power Automate Twilio connector requires Premium license ($15/user/month for the connection account).

Deadline Compliance Dashboard

Type: workflow A weekly summary report delivered to firm partners showing deadline compliance metrics: how many deadlines are upcoming, how many are at risk, how many reminders have been sent, and client response rates. Implemented as a Power Automate flow that queries Karbon and generates an email digest.

Weekly Deadline Compliance Dashboard — Power Automate Flow

Flow Overview

  • Trigger: Recurrence — Every Monday at 7:00 AM
  • Purpose: Generate and email a weekly summary of filing deadline status to firm partners

Power Automate Flow Steps

1
Trigger — Recurrence: Frequency: Week | Interval: 1 | On these days: Monday | At these hours: 7 | Time zone: (firm's local timezone)
2
HTTP — Get Active Work Items: Method: GET | Headers: Authorization: Bearer (Karbon API key)
3
Parse JSON: Content: @body('HTTP') | Schema: (auto-generate from sample Karbon response)
4
Initialize Variables: var_total_active, var_due_this_week, var_due_next_week, var_overdue, var_at_risk, var_report_html
5
Apply to Each (loop through work items): Calculate days_until_due and increment counters based on thresholds and status
6
Compose HTML Report: Build styled HTML email body with summary table and itemized list
7
Send Email (Office 365 Outlook): To partners, with subject line and high importance if overdue or at-risk thresholds are met

Step 2: HTTP — Get Active Work Items

Karbon API call to retrieve all non-completed work items ordered by due date
http
GET https://api.karbonhq.com/v3/Works?$filter=Status ne 'Completed'&$orderby=DueDate asc
Authorization: Bearer (Karbon API key)

Step 4: Initialize Variables

Power Automate variable initialization
plaintext
var_total_active = 0
var_due_this_week = 0
var_due_next_week = 0
var_overdue = 0
var_at_risk = 0
var_report_html = ""

Step 5: Apply to Each — Loop Logic

Per-item deadline classification logic inside the Apply to Each loop
plaintext
days_until_due = dateDifference(utcNow(), item.DueDate)

If days_until_due < 0:                          → increment var_overdue
If days_until_due >= 0 AND <= 7:               → increment var_due_this_week
If days_until_due > 7 AND <= 14:              → increment var_due_next_week
If days_until_due <= 7 AND status != 'In Progress': → increment var_at_risk
Increment var_total_active

Step 6: Compose HTML Report

HTML email body template with dynamic Power Automate expressions for all metrics
html
<html>
<body style="font-family: Arial, sans-serif; max-width: 600px;">
  <h2 style="color: #2c3e50;">📊 Weekly Filing Deadline Report</h2>
  <p>Generated: @{formatDateTime(utcNow(), 'MMMM d, yyyy')}</p>
  
  <table style="border-collapse: collapse; width: 100%;">
    <tr style="background-color: #e74c3c; color: white;">
      <td style="padding: 10px;">⚠️ OVERDUE</td>
      <td style="padding: 10px; text-align: right; font-size: 24px;">@{variables('var_overdue')}</td>
    </tr>
    <tr style="background-color: #f39c12; color: white;">
      <td style="padding: 10px;">🔥 Due This Week</td>
      <td style="padding: 10px; text-align: right; font-size: 24px;">@{variables('var_due_this_week')}</td>
    </tr>
    <tr style="background-color: #3498db; color: white;">
      <td style="padding: 10px;">📅 Due Next Week</td>
      <td style="padding: 10px; text-align: right; font-size: 24px;">@{variables('var_due_next_week')}</td>
    </tr>
    <tr style="background-color: #e67e22; color: white;">
      <td style="padding: 10px;">🚨 At Risk (not started)</td>
      <td style="padding: 10px; text-align: right; font-size: 24px;">@{variables('var_at_risk')}</td>
    </tr>
    <tr style="background-color: #2ecc71; color: white;">
      <td style="padding: 10px;">📋 Total Active</td>
      <td style="padding: 10px; text-align: right; font-size: 24px;">@{variables('var_total_active')}</td>
    </tr>
  </table>
  
  <h3>Items Due This Week:</h3>
  <ul>
    @{variables('var_report_html')}
  </ul>
  
  <p style="color: #7f8c8d; font-size: 12px;">This report is automatically generated by your managed deadline reminder system. Contact [MSP Name] at [MSP Phone] for support.</p>
</body>
</html>

Step 7: Send Email (Office 365 Outlook)

  • To: partner1@firmname.com; partner2@firmname.com
  • Subject: "📊 Weekly Filing Deadline Report — @{formatDateTime(utcNow(), 'MMM d, yyyy')}"
  • Body: HTML composed in Step 6
  • Importance: High (if var_overdue > 0 or var_at_risk > 3)

Metrics to Track Over Time

1
On-time filing rate (target: 100%)
2
Average client response time to document requests
3
Number of extensions filed (lower is better)
4
Reminder-to-action conversion rate
5
SMS vs email response rates

Testing & Validation

Client Handoff

Client Handoff Checklist

Training Session (90 minutes, in-person or video call with recording)

Attendees: All firm staff who will interact with the system (preparers, reviewers, admin, partners)

Topics to Cover:

1
Dashboard overview — How to view all active work items, filter by deadline date, entity type, and status in Karbon
2
Daily workflow — Morning routine: check #deadline-alerts Teams channel, review Karbon dashboard for items due this week, act on escalations
3
Client task management — How to mark client documents as received, how to manually send additional reminder emails, how to reassign work items
4
New client onboarding — Step-by-step process to add a new client: create contact in Karbon, set entity type and filing obligations, create work items using templates
5
Mid-year changes — How to handle: entity type changes, fiscal year changes, new state filing obligations, client departures
6
Extension filing workflow — When and how to create extension work items when the original deadline cannot be met
7
Opt-out handling — Process when a client requests no SMS/email reminders (document in Karbon, update phone/email flags)
8
Escalation response — What to do when a 3-day or 1-day escalation fires: partner decision tree (file return, file extension, document non-response)
9
Annual deadline calendar refresh — November/December process to update next year's deadlines (MSP-assisted)
10
Reporting — How to read the weekly compliance dashboard email; how to pull ad-hoc reports from Karbon

Documentation to Deliver

1
Quick Reference Guide (1-page, laminated) — Daily checklist with screenshots of key Karbon screens
2
Reminder Schedule Matrix — Table showing what gets sent, when, to whom, via which channel, at each stage (30/14/7/3/1 days)
3
Escalation Flowchart — Visual diagram of the escalation path from automated reminder through partner intervention
4
New Client Setup Checklist — Step-by-step with screenshots for adding clients and creating their work items
5
Annual Calendar Refresh Procedure — Document for the November deadline update process
6
Updated WISP — Signed copy with all new systems documented
7
Vendor Contact Information — Karbon support, Twilio support, MSP support contact with SLA details
8
Emergency Procedures — What to do if the system goes down (manual reminder process, MSP escalation phone number)

Success Criteria to Review Together:

Post-Handoff Support Period:

  • Weeks 1–4: MSP available for daily check-ins (15 minutes) via Teams or phone
  • Weeks 5–8: MSP available for twice-weekly check-ins
  • Week 9+: Transition to standard monthly management retainer

Maintenance

Ongoing Maintenance Responsibilities

...

Daily (Automated — MSP monitors alerts)

  • Monitor Make.com/Zapier scenario execution logs for failures. Set up error notifications to MSP ticketing system (e.g., ConnectWise, Autotask). If SMS delivery fails, investigate Twilio delivery status and carrier filtering.
  • Monitor Karbon system health via status page (https://status.karbonhq.com/). Subscribe to incident notifications.
  • Monitor Twilio account balance. Set up auto-recharge at $20 minimum balance with $50 recharge amount to prevent SMS delivery interruption.

Weekly

  • Review the automated compliance dashboard report (sent to firm partners). Flag any anomalies (e.g., sudden spike in at-risk items, delivery failures).
  • Check Zapier/Make.com task/operation usage against plan limits. If approaching 80% of monthly quota, alert MSP account manager to discuss plan upgrade.
  • Spot-check 2–3 recent reminder emails for deliverability (review SendGrid bounce/complaint reports if using SendGrid).

Monthly

  • Review and reconcile Twilio SMS costs against budget. Report to client on message volume and costs.
  • Review Karbon license utilization — are all licensed users active? Are additional licenses needed?
  • Check for Karbon platform updates and new features that could enhance the workflow.
  • Review Azure AD sign-in logs for the Karbon enterprise application — look for failed sign-ins, unusual access patterns, or MFA bypass attempts.
  • Backup the master deadline calendar data (export from Karbon or SharePoint to secure MSP-managed storage).

Quarterly

  • Review and update quarterly filing deadlines (941, estimated payments). Confirm dates for the upcoming quarter accounting for holidays.
  • Conduct a brief (30-minute) review meeting with the firm's office manager to gather feedback on reminder effectiveness, client complaints, and suggested improvements.
  • Review and rotate Karbon API keys and Twilio auth tokens. Update stored credentials in Zapier/Make.com/Power Automate.
  • Test the full reminder pipeline end-to-end by creating a test work item and verifying all channels deliver correctly.

Annually (November–December)

  • Critical: Annual Deadline Calendar Refresh. Download IRS Publication 509 for the new year. Update all federal deadlines. Check each applicable state's revenue department for updated state deadlines. This is a billable service item ($500–$1,000).
  • Bulk-create work items for the new tax year using the Python script or Karbon's recurring work feature.
  • Review and renew Karbon annual licenses (coordinate with client for budget approval).
  • Update the WISP with any changes to systems, vendors, or security controls made during the year. Conduct annual security risk assessment as required by FTC Safeguards Rule.
  • Review IRS and state announcements for any regulatory changes affecting filing requirements (new forms, changed deadlines, new states of obligation for growing clients).
  • Archive completed work items from the prior year per the firm's document retention policy.

Ad-Hoc / Event-Driven

  • Disaster deadline extensions: Monitor IRS disaster relief announcements (https://www.irs.gov/newsroom/tax-relief-in-disaster-situations). When extensions are declared, immediately update affected deadlines in Karbon and notify firm staff.
  • New client onboarding: When the firm adds a new client, create their filing work items within 48 hours of receiving entity information from the firm.
  • Client departure: When a client leaves the firm, archive their work items and remove them from active reminder workflows.
  • Platform incidents: If Karbon, Twilio, or the automation platform experiences an outage, notify the firm immediately and activate the manual reminder backup process (documented in the Emergency Procedures handoff document).

SLA Considerations

  • Response time for system issues: 4-hour response during business hours (M-F 8AM–6PM firm local time)
  • Critical deadline period support (Jan 15 – Apr 15, Sep 15 – Oct 15): Enhanced response — 2-hour response, weekend availability
  • Annual calendar refresh: Completed by December 15 each year
  • New client work item creation: Within 2 business days of receiving client information

Escalation Path

1
Tier 1: Firm staff reports issue via MSP ticketing portal or email
2
Tier 2: MSP technician investigates (Karbon config, Zapier/Make.com logs, Twilio delivery logs)
3
Tier 3: MSP escalates to vendor support (Karbon, Twilio, Microsoft) for platform-level issues
4
Emergency: MSP activates manual reminder process and notifies firm partners directly by phone

Alternatives

Replace Karbon with TaxDome Pro as the primary platform. TaxDome is an all-in-one practice management solution that includes CRM, workflow automation, client portal, e-signatures, invoicing, and automated reminders (email, SMS, and portal notifications) built into a single platform. TaxDome's automated messaging system can send emails, texts, and portal notifications when documents are due, deadlines approach, payments are late, or approvals are needed — eliminating the need for separate Twilio and Zapier/Make.com integrations for basic SMS.

Microsoft Power Automate + SharePoint — No Practice Management Platform

For firms that refuse to adopt a new practice management platform, build the entire deadline reminder system using Microsoft Power Automate with SharePoint as the deadline database and Outlook/Teams as the notification channels. Create a SharePoint list containing all clients, their filing types, and deadline dates. Build Power Automate flows that run daily, compare dates, and send Outlook emails and Teams messages at each reminder threshold. Add Twilio connector for SMS.

Canopy with Workflow Module — Modular Approach

Use Canopy's modular platform, purchasing only the Workflow module ($45/user for firms with 1-3 users, $66/user for larger firms). Canopy is specifically designed for tax professionals and includes task management, workflow automation with conditions and actions, and client communication. The firm only pays for the modules they need rather than a full practice management suite.

Financial Cents Scale Plan — Budget-Friendly Option

Use Financial Cents Scale plan ($49/user/month annual or $69/month monthly) which includes workflow automation, auto-follow-ups for client tasks, and Zapier integration. Financial Cents is the most budget-friendly dedicated practice management tool with automation capabilities, serving over 5,000 accountants globally.

Jetpack Workflow — Pure Task/Deadline Management

Use Jetpack Workflow Organize plan ($36/user/month annual) as a lightweight deadline tracking and task management tool. Jetpack Workflow focuses exclusively on workflow and project management without the overhead of full practice management (no CRM, no billing, no portal). It provides recurring task automation, deadline tracking, and a central project hub.

Want early access to the full toolkit?