MI Threads — User Guide
Last updated: 2026-09-21
Overview
MI Threads lets you view and respond to SMS conversations that come in through Twilio, with helpful links to related HubSpot contacts. Use the left sidebar to choose a mailbox and the main area to search, browse, and open conversations.
Logging in/out
- Go to
/login.php, enter your email and password, then the 6-digit code from your authenticator app (two-step verification, required for everyone).
- First time: you'll be asked to set up an authenticator app (Google Authenticator, Microsoft Authenticator, 1Password, Authy...). Scan the QR code (or type the key shown under it), enter the code the app shows, then save the 10 recovery codes - they are shown only once.
- Trust this device for 30 days: tick it on your own computer to skip the 6-digit code there. You still enter your password. Don't tick it on a shared computer.
- Lost your phone? Enter one of your recovery codes instead of the 6-digit code; each works once. No codes left? Ask an admin to reset your two-step verification, then set it up again at your next login.
- Forgot your password? Use the link on the login page. The emailed link works once, for 30 minutes. After changing your password you still need your authenticator app.
- You stay logged in for up to 12 hours without activity, and at most 7 days in a row; after that, log in again.
- Too many wrong passwords or codes lock the account for a short, growing wait. Wait and try again, or ask an admin.
- Use Logout in the top-right menu at any time.
Mailboxes
From the left sidebar:
- Live: Active conversations.
- Unsubscribed: Threads where recipients opted out.
- Workflows: Conversations driven by workflows, with optional manual sub-mailboxes.
- Archived: Closed conversations you can revisit.
Searching
Use the search box at the top of the Threads page. You can search by phone, email, first name, or last name. Multi-word searches (e.g., john doe) match across fields.
Viewing threads
- Click a thread to open its conversation view.
- The most recent messages are shown with timestamps. Messages are automatically marked as seen when you open a thread from the Threads page.
- Use the Back button to return to the mailbox list.
Sending messages
- In a thread, type your reply and click Send. Messages are sent via Twilio.
- If delivery fails, an error message will be shown.
- To reuse a saved message, pick it from the Insert snippet... dropdown above the message box. The snippet is inserted at the cursor and can be edited before sending. Placeholders
{first_name}, {last_name} and {full_name} are filled in from the contact; if the contact has no name on file the placeholder is left as-is so you can fix it.
- If a red bar at the top of the page says SMS sending is OFF (dry run), you are on a test system: messages appear in the thread as sent but nobody receives them.
Drafts (the SMS assistant)
- Under the message box, the Draft box writes texts for you to review. Nothing is ever sent automatically: you insert a draft, edit it, and click Send yourself - or ignore it.
- Reply: when the lead writes, a reply draft appears by itself (on opening a thread, only if their message is from the last 7 days; otherwise click Reply). Opener: shown when nobody on staff has texted this person yet (automated texts don't count). Follow up: shown when we sent the last message.
- A draft has one or two texts. Each is editable in the Draft box; Insert puts it in the message box at the cursor. The count under each text turns red over 320 characters, the length the assistant aims for: shorten it before sending. With two texts, Send as two messages sends both, as edited, in order (the second only after the first went out).
- Below the texts: Why (what the draft is doing), If no reply (the angle for a follow-up) and a Suggested deal update. These are notes for you and can't be inserted. A deal update is only a suggestion: make it in HubSpot yourself.
- A yellow Review bar means the draft needs your judgement (for example an older price was quoted, a health or billing issue, or a discount to consider). A red Stop bar means no text should be sent (the person opted out, or the conversation needs a personal response); no draft is shown.
- Type in the guidance box ("keep it short", "she's worried about price") and click Regenerate for a new draft that follows it. Opening the same thread again shows the saved draft; it isn't written again until the conversation changes or you regenerate.
- The draft sees the whole conversation, the lead's HubSpot details (first name, time zone, client status, quiz answers, their recent deals, up to five, and form submissions) and Macros' reference documents. Check prices, links and policies before sending: you are the final check.
- Before a draft is shown, the app checks it against Macros' fixed texting rules: a mention of the free trial must also say it needs a card and becomes $199/mo; a first text to someone who has never texted us must include "Reply STOP to unsubscribe."; each text stays under 320 characters. If a draft leaves out the card, the $199/mo or the STOP line, the app asks for a new draft once, automatically (it takes longer). A text that is only too long is not redrafted: it is shown with its counter in red for you to shorten. Anything still wrong is shown in a yellow Check before sending list of what to fix: you can edit the draft as usual.
- A draft usually takes 10-30 seconds, and occasionally over a minute for a long or tricky conversation. You can type and send meanwhile; the message box never waits for a draft.
Rules the app enforces on every send
- Opted out (the person texted STOP or a similar word, Twilio reported them unsubscribed, or the thread was moved to Unsubscribed): no drafts, and Send is refused. Texting START, or moving the thread back to Live, lifts it.
- First text to someone who has never texted us (a form submission doesn't count): it must include Reply STOP to unsubscribe., or the send is refused. Replies to people who texted us first don't need it.
- Texting hours: outside 8am-8pm in the lead's local time (from HubSpot, else their area code, else Central time) you are asked to confirm before it sends.
- If an admin turned on Require SMS consent for openers (System Stats), an opener or a first text also needs the quiz SMS consent or the contact's SMS opt-in on file.
HubSpot links
Where available, a link to the related HubSpot contact is shown on the thread view.
Workflows (Manual sub-mailboxes)
Under the Workflows mailbox, you may see manual sub-mailboxes. Unread counts are displayed next to each sub-mailbox. Click any sub-mailbox to filter threads accordingly.
Use the Mark all as read button in the Workflows header to clear unread indicators for the current folder; if no folder is selected, it clears unread across all Workflows.
Sub-mailboxes are backed by action_names. Admins can create or delete them from the Manage Folders page (see below).
Archive & Unsubscribe
- Archive a thread to remove it from Live while keeping its history.
- Unsubscribed lists threads where the recipient opted out; you cannot send messages to unsubscribed numbers.
Move threads between folders
From the thread view page, above the Owner dropdown, use the new Folder dropdown to move the conversation to any folder:
- Live: Sets the thread as active (opted-in), unarchives it, and disables workflows.
- Unsubscribed: Marks the contact as opted-out and removes it from Live/Workflows.
- Workflows: Enables workflows for the contact and unarchives it.
- Archived: Archives the thread.
Changes take effect immediately and you will see a confirmation message at the top of the thread view.
Managing folders (Admins)
- Admins see a icon in the top-right menu that links to
/manage_folders.php.
- Create a new folder by entering a name and clicking Create. Names must be unique.
- Delete a folder by clicking Delete and confirming the prompt. Messages retain their history; any references to this folder are cleared by the database constraints.
- Folders appear under the Workflows mailbox as sub-mailboxes.
Managing snippets (Admins)
- Admins see a icon in the top-right menu that links to
/manage_snippets.php.
- Create a snippet by giving it a name and a message, then clicking Create. Names must be unique; messages are limited to 1600 characters.
- Use Edit to change a snippet, or Delete to remove it. Messages already sent are not affected.
- Snippets are shared: every user sees them in the Insert snippet... dropdown on each chat.
Auto-responder (Admins)
- Open Auto-responder in the top-right menu (
/manage_autoresponder.php).
- When it is on, a client who texts in gets your reply message automatically; it shows in the thread like any sent message. It is off until you turn it on.
- Cooldown (default 12 hours): a contact gets at most one auto-reply in that time.
- When to reply: always, or only outside business hours (the days and times you set there).
- It never replies to STOP / START / HELP-type messages or to contacts who have opted out. The bulk sending window doesn't apply - the client just texted.
Exporting conversations (Admins)
- Admins see a icon in the top-right menu that links to
/export_conversations.php.
- Pick a date range (the form starts at the last 90 days), and optionally a folder and a person (name, phone number or email), then click Download.
- Spreadsheet (CSV) gives one row per message with the person's name, phone, email, date/time, who sent it and the folder - open it in Excel or Google Sheets and filter by name. Readable transcript (TXT) gives one section per person, each with their contact details at the top and the conversation underneath.
- Dates and times use the timezone set on your user account.
- Choosing a folder exports the full conversation, within the dates, of everyone who has a message in that folder.
- The file contains client contact details and message history - store and share it with care.
Managing users (Admins)
- Admins see a icon in the top-right menu linking to
/manage_users.php.
- Use it to add or remove users and adjust roles. New passwords need at least 12 characters; new users set up two-step verification at their first login.
- The Two-step column shows who has set up an authenticator. Reset two-step (for a lost phone) removes the user's authenticator, recovery codes and trusted devices and logs them out everywhere; they set up a new authenticator at their next login. Every reset is recorded.
System stats (Admins)
Admins can view live system and database statistics.
- Open the top-right menu and click System Stats (visible to admins only), or go to
/admin_stats.php.
- What you'll see:
- Live charts: auto-updating graphs for load (1m/5m/15m), memory (used/available), and network (RX/TX KB/s).
- System info: server time, uptime, load average, memory totals/available.
- App info: environment name and test mailbox settings.
- Database: counts for key tables like
messages, contacts, users, and action_names.
- Messages: sent/received in the last 24 hours and total unread.
- SMS draft assistant: the sales user (whose messages the assistant reads as "Dylan"; other staff show as "Team"; not set = every staff message is Dylan's) and Require SMS consent for openers (off by default).
- Bulk Sender: whether the sending worker is running (last heartbeat), the sending window, and every campaign with sent / failed / unknown / remaining counts and Pause, Resume and Cancel buttons (see below).
- Meta conversions: the "Conversation Started" event sent to Meta (for ad reporting) when someone texts us for the first time. Shows whether it is switched on, how many were sent, and any that are stuck, with Meta's error and a Retry button. Nothing from the message itself is sent to Meta; replying STOP is never counted.
- Bulk ingestion: total jobs, jobs by status, recipients by state, rows ready to send now, and recent jobs with progress.
- PHP error log: a viewer for the PHP
error_log at the bottom of the page. Use the Recent lines control to view the last N lines (default 200; up to 5,000). Large files are truncated to the last ~2 MiB for performance. You may see a warning if the log path is not configured or not readable by the web process.
- Sending window: bulk messages go out only between these times (default 09:00-20:00, Central time), every day. Outside it campaigns wait and continue on their own. Change it in the Bulk Sender box.
- Pause stops a campaign before its next message (a message already being sent finishes). Resume continues it. Cancel means the messages not yet sent are never sent; this can't be undone.
- Needs a decision: if the sender stopped in the middle of a message, or Twilio didn't answer clearly, we don't know whether that one message went out, so it is never sent again automatically. For each one: Check with Twilio (looks it up and marks it sent if Twilio has it), Mark sent, Mark not sent, or Resend (the person may get it twice if the first try did arrive).
- Bulk messages are never sent to contacts who have opted out (texted STOP), even if they opted out after the campaign was queued.
- Stop all bulk sending (emergency stop): stops every campaign before its next message, straight away - a message already being sent finishes. Campaigns keep their place; Resume all bulk sending continues them. While it is on, everyone sees a "Bulk SMS sending is disabled" bar at the bottom of the screen.
- Priority lane: small sends (by default 10 recipients or fewer, such as a HubSpot workflow follow-up to one person) go out ahead of a large campaign instead of waiting for it to finish. Change the number in the Bulk Sender box; 0 turns it off.
- Cancel all pending (Bulk ingestion box): cancels every queued, running and paused campaign at once, as if you pressed Cancel on each. A message already being sent finishes; nothing is deleted, and the campaigns stay listed as cancelled. This can't be undone. (It replaces the old Clear Queue button.)
Bulk CSV upload (Admins)
Admins can upload a CSV of recipients and queue a bulk send using the built-in UI.
- Open the top-right menu and click Bulk CSV Upload (visible to admins only), or go to
/admin_bulk_upload.php.
- Download the sample file:
/samples/bulk_recipients_sample.csv.
- CSV requirements:
- Required headers:
name, phone, email.
- Optional:
contact_id and any additional personalization fields (e.g., coupon).
- Scale & limits:
- Supports up to 10,000 valid recipients per CSV/job. If you have more, split into multiple files/jobs.
- The preview is streamed from the uploaded CSV on disk and paginated at 100 rows. We do not keep all rows in memory.
- Step 1: Upload the CSV and (optionally) set metadata fields:
mailbox (e.g., bulk_sms or test_api for safe test mode)
title (optional)
template_id (optional)
external_job_id (optional; preferred for idempotency)
force_new_job (optional; create a new job even if payload is identical)
- Step 2: On the preview page (100 rows per page), enter the
message that will be sent to all recipients. Placeholders use double braces: {{first_name}}, {{last_name}}, {{name}} (the first and last name are taken from the name column or the contact), {{email}}, or any CSV column such as {{coupon}}. If a recipient has no first name, {{first_name}} becomes "there" (e.g. "Hi there!"); choose your own with {{first_name|friend}}. Other empty placeholders become blank unless you give one: {{coupon|none}}. Click Preview Payload to view the first 5 recipient objects exactly as they will be sent to ingestion.
- Step 3: Click Confirm & Queue to create the job. Invalid numbers are dropped during ingestion; duplicates are ignored per job. The confirmation says how many recipients got a placeholder fallback. Sending starts within the sending window, about one message per second; follow it on System Stats.
- See also: Bulk Ingestion docs for advanced behavior (normalization, idempotency, test mode).
Tips
- Use multi-word search to quickly find contacts across first/last name or email.
- Use the pagination controls to navigate long lists of threads.
Troubleshooting
- If you’re unexpectedly logged out, sign in again at
/login.php.
- If messages aren’t loading, refresh the page. If the issue persists, contact your administrator.
What’s new (2025-10-18)
- More reliable HubSpot syncing: The system automatically retries when HubSpot briefly rate limits (HTTP 429). This is transparent to you; operations may take a few extra seconds during heavy load.
- Cleaner activity logs: Timeline notes and internal logs are clearer about what happened (e.g., reusing an existing HubSpot contact instead of creating a new one).
- Less noise on counters: We avoid repeating identical updates to HubSpot counters (like SMS totals), so you’ll see fewer duplicate updates.
- Email notifications: When a request comes from an internal automation (it includes an action name), we skip sending extra email notifications to avoid spammy alerts. Manual actions still behave the same.
Bulk SMS and rate limiting
- During large sends, Twilio or HubSpot may enforce short rate limits. The app now backs off and retries automatically.
- If a bulk send is already running and the system is busy, new requests may be delayed automatically. This helps prevent failed sends and improves throughput overall.
- No changes are required from users; just keep the page open and allow a little extra time during heavy traffic.
Notifications and unread counts
- Outbound messages you send do not increase unread counts.
- Inbound replies do increase unread counts and can trigger notifications per your existing settings.
- Automation-triggered actions that include an action name will not send additional email notifications.
Need more help? Contact your system administrator.