Added
Test-send metrics in project statsGET /v1/projects/{id}/stats now returns a test object alongside metrics with test-send activity tracked separately: sent, delivered, failed, replies, clicks_total, and clicks_unique. The metrics object reports production traffic only - most notably, clicks on tracking links in test messages no longer inflate clicks_total/clicks_unique (previously they did). The separation is forward-only: test clicks recorded before this change remain in the production counters.Changed
No minimum lead time on project schedulingPOST /v1/projects/{id}/schedule no longer requires scheduled_at to be at least 60 seconds in the future. Any valid ISO 8601 date-time with an offset is accepted, including the current moment or the recent past - the project starts sending as soon as audience compilation finishes. To start a send immediately, pass the current time; no padding needed. The SCHEDULE_TOO_SOON error code is retired and no longer returned.Added
Delivery error codes referenceA new Delivery error codes page documents everyerror_code the message.failed webhook can deliver: all 67 codes with their exact error_message strings, plus a category table explaining which failures are permanent (remove the recipient), transient (safe to retry), or sender-side (contact support).Fixed
message.failed payloads now match the documented error contractTwo inconsistencies in the message.failed webhook are fixed. Failures reported by the carrier after acceptance omitted error_message entirely; it is now always present alongside error_code. Failures rejected at send time delivered the raw 5-digit upstream code (e.g. "40300") instead of the documented short form ("300"); both paths now emit the short code and the standard error_message from the error codes reference. If you matched on 5-digit codes as a workaround, match on the documented short codes instead.Added
is_test on message webhook eventsAll four message events (message.sent, message.delivered, message.failed, message.replied) now carry an is_test boolean: true for test messages sent from the app’s test flow or POST /v1/projects/{id}/test, and for the dashboard’s synthetic Send test webhook event; false for production traffic. Event identifier semantics are now documented explicitly in a new Identifiers section.Fixed
Every unique click now delivers alink.clicked eventlink.clicked previously used the tracking link’s id as its event id, so delivery deduplication silently suppressed any further unique clicks on the same link (a second device, a forwarded link) for 7 days after the first. Each click now has its own unique id; tracking_link_id continues to identify the link across clicks. If you deduplicate on data.id, no change is needed — you will simply receive the clicks that were previously missing.Dashboard test webhook matches real payloadsThe Send test webhook event now sets id === message_id (as all real message events do) and uses message_text, so an integration validated against the test button matches production traffic exactly.Leaner payloads: no duplicated identity fieldsThe event-specific payload previously repeated the envelope’s id and occurred_at verbatim. Those duplicates are gone — read the event identity from data.id / data.occurred_at (as all documented examples always showed), and correlate resources via message_id / tracking_link_id inside the payload.Outbound webhook payloads now match the documented contractThe message.sent webhook previously leaked raw carrier-vendor structures into customer payloads: to arrived as an array of objects and from as an object (instead of the documented E.164 strings), and timestamps used a +00:00 UTC offset instead of the documented Z suffix. All events now deliver exactly the shapes shown in Event Types — to/from as plain E.164 strings and every timestamp (occurred_at, sent_at, delivered_at, failed_at, received_at, clicked_at) as millisecond-precision ISO-8601 UTC with a Z suffix — enforced at a single choke point so no event can drift from the contract again.Breaking note: integrations that worked around the old undocumented object shape on message.sent (e.g. reading to[0].phone_number) should switch to reading the plain string, per the documented schema.Webhook signature validation now worksThe X-Webhook-Signature header was computed over an internal serialization of the payload whose key order differed from the delivered body, so HMAC verification against the raw request body — exactly what the signature validation guide instructs — always failed. Signatures are now computed over the exact bytes delivered. If you skipped or disabled signature verification because it never passed, re-enable it: it works now, and verifying is strongly recommended.Webhook retries now make all four documented attemptsAn off-by-one ended delivery retries after 3 attempts, so the documented 4th attempt (64-second backoff) never ran. Failed deliveries now retry on the full documented schedule: immediate, +4s, +16s, +64s. The payload envelope’s meta.max_attempts now correctly reads 4.Added
Link parameter placement with{field} placeholdersTracking-link destination URLs can now embed the selected link parameter anywhere instead of always appending it as its own query pair. Put a placeholder named after the selected field in the URL, e.g. https://test.com?utm_content=xyzd_{linkid}, and each recipient’s redirect substitutes their URL-encoded value in place: ...utm_content=xyzd_ABC123&short_id=WPZCLQy. This supports providers that only echo back a specific field (like utm_content). URLs without a placeholder keep the existing append behavior, and validation rejects placeholders that don’t match the selected parameter so a typo can never ship a literal {token} in live links.Opt-out footer control on the APIPOST /v1/projects and PATCH /v1/projects/{id} now accept opt_out_footer_enabled (returned on project responses as well), so API consumers can toggle the automatic STOP=END footer per broadcast project, matching the in-app composer toggle. Defaults to enabled; surveys never carry the footer.Fixed
Link parameter saving reliablyEditing a project no longer silently clears a saved link parameter: a race between form loading and the merge-tag fetch could reset custom-field selections to “None” before the available fields finished loading. Clearing the parameter back to “None” now persists correctly too.Added
Official SDKs, CLI, and MCP ServerFour official packages are now published:@political-comms/sdk (TypeScript, zero runtime dependencies, built-in retries and rate-limit handling), political-comms (Python 3.10+), @political-comms/cli, and @political-comms/mcp — an MCP server that lets Claude and other MCP clients manage projects, contact lists, media, analytics, and billing. Write tools require explicit confirmation and no delete operations are exposed. Source: Political-Comms/political-comms-sdk.Versioning & Deprecation PolicyThe API’s versioning and deprecation guarantees are now documented on a dedicated Versioning & Deprecation page, including the Deprecation/Sunset header commitment and the 90-day sunset window.Fixed
Rate-Limit Documentation CorrectionsSeveral agent-facing documents (the public agents repo, site markdown twins, and llms.txt files) misstated the API rate limit as 100 requests per hour. The actual limits, per key over a 60-second sliding window, are 100 requests/minute for reads, 60/minute for writes, and 30/minute for deletes — matching what the API has always enforced. Quickstart examples in those same surfaces were also corrected to the realPOST /projects and POST /projects/{id}/schedule schemas.Added
Delete Endpoints for Contact Lists and Media FilesDELETE /contact-lists/{id} and DELETE /media/{id} remove a list or media file from your account. Deleted resources disappear from list and read endpoints and are detached from any draft projects that referenced them. Deletion is blocked with a 409 (CONTACT_LIST_IN_USE / MEDIA_IN_USE) while a scheduled, sending, or active project depends on the resource; the error’s details.projects names the blocking projects so you can unschedule or wait, then retry. Media used by already-sent MMS keeps rendering in message history.Copy and Archive ProjectsPOST /projects/{id}/copy duplicates a project: message content, media, phone numbers, link tracking, and survey questions carry over, while contact lists, the schedule, and delivery stats do not. The copy lands as a draft with a versioned name (Fall GOTV becomes Fall GOTV_v2), ready for a fresh audience. POST /projects/{id}/archive archives a completed project; archived projects keep all their stats and remain readable, and the new archived filter on GET /projects lets you include, exclude, or target them in listings (the default listing behavior is unchanged).Create Projects Without a Contact Listcontact_list_ids is now optional on POST /projects for both broadcast and survey projects. Omitting it creates the project as a draft; attach lists later with PATCH /projects/{id} and the project moves to awaiting_test automatically, then test and schedule as usual. The create response’s completeness block shows what is still missing. Drafts left untouched for 14 days are archived automatically.The spec version is bumped to 1.2.0.Improved
Clearer Error Messages Across the PlatformDozens of situations that previously showed “An unexpected error occurred” - two-factor and passkey setup, CSV imports, exports, API key management, user management - now tell you what’s actually wrong and how to fix it.Toll-Free VerificationSubmitting a toll-free verification now surfaces the real reason when something is rejected instead of a generic failure, retries no longer create duplicate drafts, and stuck drafts can be deleted.Added
File URLs on the Media EndpointsGET /media now returns a url for every media file, alongside storage_key, file_size_bytes, content_type, status, and uploaded_via_api. GET /media/{id} returns the same url. Previously the list endpoint returned only identifiers and names, so there was no way to fetch a file directly from the media API.url points at the stored file and is stable for the life of that file: once status is ready, a stored file is never re-processed or rewritten, so the URL always returns the same bytes. That makes it usable as a verification baseline, which is the case this was built for. Two things to know: url is null until status is ready, so poll before relying on it, and it should be treated as opaque rather than reconstructed from name, because the stored filename can differ (video is converted to .mp4). file_size_bytes is the size of the stored file on ready rows, so it doubles as a cheap integrity check against a download’s content-length.All previously returned fields keep their names, so this is additive.Improved
Cost Estimates That Match What Actually BillsThe composer’s cost estimate now reflects real message lengths per recipient - personalization filled in with your actual contact data - and shows a message-parts range (for example “1-2 parts”) with the corresponding cost range, so the estimate lines up with what the send actually bills.Added
Dynamic Lists Tab and Anedot IntegrationContact Management has a new Dynamic Lists tab collecting the lists that keep themselves up to date. Anedot joins WinRed as a donation-platform integration: paste your webhook secret and qualifying donors and leads flow into a list automatically, with donor details available as merge tags.Recent Clickers and Recent Repliers ListsTwo new self-updating lists built from your own campaign engagement: contacts who clicked a tracking link, and contacts who replied, over a 30, 60, or 90-day (or all-time) window. Members come from numbers you’ve already messaged, so the lists are ready to send with no analysis cost.Fixed
API Reference Corrected Against Live BehaviorA full audit of the OpenAPI specification against the production API found that many documented schemas had drifted from live behavior. Every endpoint’s documented request and response now matches what the API actually returns; if your integration was built from the live responses, nothing changes for you. The most significant corrections:- Tracking domains:
GET /tracking-domainsreturns asourcefield (ownorinherited). Inherited domains return onlyid,domain, andsource; the previously documentedstatus,org_id, andorg_namefields appear only on owned domains (status,verified_at,created_at) or not at all (org_id,org_name). - Contact lists: list items use
name(notlist_name) and includebrand_nameandorg_name;contact_countandstatusare not returned on the list endpoint. The single-list response useslist_id,organization_id, and nestedimportandanalysisobjects with their real fields and status enums. - Projects: project reads return
project_id(notid) andorganization_id(notorg_id);PATCH /projects/{id}returns the full project object; per-project stats are nested under ametricskey;GET /projects/statsdocuments its realsummary/paginationshape plus the previously undocumentedlimit,offset, andpausedstatus filter. - Message and ledger stats:
GET /messages/statsand the/ledger/usageendpoints now document their real response shapes, thebrandId/campaignIdfilters on/ledger/usage, and the 31-day range and look-back limits. - Async writes: media import, contact-list import, and contact-list analyze return
202 Accepted(not200) with their real response bodies; project test sends return202with per-message IDs and masked recipient numbers. - Errors: Error Handling now documents the three real error body shapes, including the
correlationIdfield on standard errors, and the corrected error-code list.
Added
Automatic Pause on Carrier BlockingIf carriers start blocking a send as suspected spam, the project now pauses itself automatically instead of burning the rest of the budget on messages that won’t deliver. Managers are notified with the reason, and after you adjust the message and resume, the check evaluates a fresh window rather than re-tripping on old numbers.Added
Lists That Analyze New Contacts AutomaticallyDynamic lists can now analyze new contacts as they arrive (opt-in, billed at the normal analysis rate), so members are ready to message the moment they join. Scheduled projects also pick up contacts their lists gain after scheduling - late additions are folded into the send instead of being left behind.Improved
Shorter Tracking LinksTracking links in messages now drop the “https://” on domains phones still make tappable (.com, .net, .org, .io, .co), saving 8 characters - often the difference that keeps a message inside one billed segment.Added
Survey Report: Response Rate, Nudge History, and Unread BadgesThe survey report now shows an initial response rate (replies to the first question as a share of delivered messages) and a per-question history of nudges sent. “Poke” is now called “Nudge” everywhere. On the projects dashboard, the Chat button shows a red badge when a project has unread conversations.Fixed
Incoming Replies RecoveredA bug introduced in early June silently dropped incoming text replies from contacts who hadn’t messaged you before - the sender saw nothing wrong, and the reply never reached the inbox. The bug is fixed, and the dropped replies were recovered and delivered to their conversations.Added
Survey Projects on the APIThe Projects API can now create and run surveys, not just broadcasts. Sendtype: "survey" to POST /projects with a questions array to build the full flow over the API: up to 30 questions plus intro and outro, numbered response options with per-option branching, a no-match branch for unrecognized replies, per-question SMS or MMS (via media_ids), merge tags and tracking links in question text, and the AI response analysis toggle. GET /projects/{id} returns the questions on survey projects, the project list gains type and status fields plus a ?type= filter, and the new GET /projects/{id}/survey-results endpoint returns topline results - per-option counts and percentages, completion and dropoff rates - matching the survey results page in the dashboard. Test, schedule, and unschedule work the same as for broadcasts.Idempotency Keys on API WritesAll API write endpoints now honor an optional Idempotency-Key header. Retrying a write with the same key within 24 hours returns the stored response of the original call (marked X-Idempotent-Replayed: true) instead of executing it twice - safe retries for network timeouts and at-least-once job runners. See Error Handling for the retry rules.Changed
New Jersey Voter Data PausedVoter-data purchases for New Jersey are paused while the industry works through the state’s new data-broker law (A.5328). Purchases for every other state are unaffected, and existing New Jersey lists you already own are untouched. We’ll re-enable New Jersey as soon as the legal picture is clear.Added
WinRed Report Feeds for Vendor AccountsWinRed vendor-level accounts can now feed contact lists through WinRed’s scheduled report exports - no per-committee webhook setup required. Choose one combined list or a list per committee, and both phone-number columns on the report are imported.Fixed
Merge Tags and Messy CSVsContact files with stray line breaks inside a field could previously push a line break into your message right before a personalized name. Values are now cleaned at import and again when the message renders.Fixed
Personalization on WinRed ListsWinRed lists had no personalization fields available in the composer. Donor fields - first name, last name, city, and the rest - now work on all WinRed lists, including ones created before this fix.Improved
Streamlined Campaign RegistrationThe 10DLC campaign registration form now starts from your organization type: pick it, and the form fills in a sensible default use case, sample messages written for your kind of organization, and the correct compliant opt-in website automatically. Editing a saved draft restores everything, including the organization type it was built from.Changed
Updated Legal AgreementsThe platform agreements have been revised. Everyone is asked to re-accept once at their next sign-in; your account and sends are unaffected in the meantime.Added
Custom Roles and PermissionsOrganizations can now define their own team roles with exactly the permissions they choose, via a new Roles & Permissions page. Navigation and page access follow each member’s permissions automatically.Broadcast / Survey FilterThe projects dashboard can now filter by project type - broadcasts or surveys.Improved
Survey Question Numbering and ReorderingQuestion numbers in reports and CSV exports now match what recipients actually see (“Intro + Q1”, Q2, and so on, then “Outro”). Reordering questions in the builder uses up/down buttons and an insert-below control instead of drag-and-drop, which fought your text selection.Added
Sign In with a PasskeyYou can now sign in with a passkey - Face ID, a fingerprint, or a hardware security key - as a phishing-resistant alternative to password plus authenticator code. Set one up under account security; your existing password and two-factor setup keep working.Added
Template LibrarySave broadcast messages, individual survey questions, or entire surveys as reusable templates, and pull them into new projects right from the project builder. Templates are shared across your organization.Survey NudgesRe-engage participants who started your survey but stalled partway: a nudge re-sends the question they stopped on. You see who’s eligible, a per-question breakdown, and the cost before sending, and each participant can only be nudged once per question.Improved
Redesigned Project CreationThe project creation screen is rebuilt as a two-column layout: your settings on the left, a live phone preview of the actual message on the right, along with a running cost estimate and a readiness checklist showing exactly what’s left before the project can send. Saving a work-in-progress as a draft is now forgiving - nothing is lost, and the checklist tells you what’s missing.Survey Drop-Off ReportingSurvey reports show per-question response totals and drop-off percentages, so you can see exactly where participants stop. Opted-out conversations are no longer counted in survey totals.Added
AI Survey AnalysisSurveys can now use AI to understand free-form replies. When a response doesn’t exactly match one of your answer options (“Yeah, of course, absolutely, 100%”), the platform asks an AI model which option the reply clearly expresses and counts it toward that option instead of dumping it into “Other” - including following that option’s branching to the right follow-up question. Turn it on per survey with the “Use AI to analyze responses” toggle in the survey builder. Priced at $0.05 per analyzed reply; exact matching stays free and unchanged, and only replies that fail exact matching are analyzed.Linc Can Answer Account QuestionsThe Linc support assistant can now look up your own account data to answer questions you’d otherwise send to support: message delivery totals, contact lists and their processing status, opt-out summaries, 10DLC and toll-free registration status, phone number inventory and rental costs, billing history, per-product spend, and aggregate survey results. Billing and spend questions are answered only for owner, admin, and manager roles. Linc never sees individual contacts, recipient phone numbers, message bodies, or free-text survey responses.Performance
Smoother Platform Under Heavy SendingA deep tune-up of the billing and database hot paths removed the biggest source of slowdowns during large sends (a lock bottleneck on wallet updates) and eliminated recurring overnight stalls caused by a background reconciliation job. Also fixed a rare race where duplicate deliveries of the same inbound message could be billed twice - each inbound message now bills exactly once.Added
WinRed IntegrationPipe WinRed donors and leads straight into a contact list. Create a WinRed list under Contact Management, paste the generated webhook URL and secret into WinRed’s integration settings, and every qualifying donation or lead is added to the list automatically, with donor details available as merge tags in your messages. Per-list settings include an SMS opt-in gate (on by default), automatic removal on refunds or disputes, and a rolling retention window (30, 60, 90, or custom days since the donor’s last WinRed activity). The list page shows a WinRed badge, live delivery stats, and a settings panel.Added
Credit Line for Post-Pay BillingOrganizations can now be granted a credit limit, letting sending continue past a $0 balance down to the agreed credit line - post-pay billing for select clients. Your remaining spendable funds (balance plus available credit) appear in the header balance tooltip and on the Payment Methods page. Setting a credit line turns auto-recharge off, since post-pay organizations draw on credit rather than a card. Contact your account representative to set one up.Added
“10DLC Campaign Rejected” Email NotificationA dedicated, configurable notification now fires whenever a campaign is rejected at any stage (registry, compliance review, or carrier). Previously, campaigns rejected before carrier provisioning emailed no one. Find the toggle under Admin, then Notifications.Performance
Projects Dashboard Loads Much FasterThe reply-count aggregation behind the projects list dropped from roughly 3.7 seconds to 23 milliseconds, so the dashboard and its live status updates are dramatically snappier for accounts with long sending histories.Improved
A More Polished InterfaceA design pass across the whole web app: softer rounded corners, layered shadows so cards and menus genuinely float, structured table headers with row hover, and subtle hover motion on clickable cards and buttons. All motion is disabled when your system prefers reduced motion.Recover from Failed Brand RegistrationsWhen a 10DLC brand fails registration, the brand page now shows the failure reasons in plain language (no more raw JSON), and you can edit and resubmit the brand or delete it right from the detail page. Corrections to an already-registered brand are free - only brand-new registrations are charged.Fixed
Custom Domains No Longer Report “Live” Before DNS Is CompleteA custom domain is now marked active only once your final DNS record actually resolves. Until then it shows an amber “Awaiting DNS” state naming the exact CNAME to add, and the platform re-checks every few minutes and activates the domain automatically once the record propagates.Accurate Character and Segment CountsThe composer’s counter now matches exactly what carriers send and what you’re billed. Special characters like brackets, braces, and the euro sign correctly count as two characters; curly quotes, long dashes, and other lookalikes pasted from a word processor are normalized so your message stays in the efficient 160-character encoding; and tracking links are estimated at their real sent length.Correct Signs on Billing ExportsLine items in the billing CSV export and the ledger API now carry their real signs: usage negative, payments positive, adjustments as applied. Previously everything displayed as positive.Added
Organization-Wide SegmentsThe segment builder now supports “All brands” and “All projects” scopes, so you can build audiences like “everyone who clicked a link in any project” across your whole organization. Org-wide segments take longer to compute; the builder tells you when you’ve selected a scope that will take a while.Default Merge-Tag ValuesSet a default per merge tag once, in Organization Settings under Messages (for example{first_name} falls back to “there”), and every send applies it when a recipient is missing that field. Inline fallbacks like {first_name|friend} still win when present.Quiet Hours EnforcementMessages no longer send between 10 PM and 8 AM in your recipients’ local time zone. Scheduling or starting a send outside the window is blocked with a clear message, and a project still sending at 10 PM is automatically paused (with a notification) for you to resume in the morning. The schedule modal shows the detected time zone and allowed window up front.Campaign Verify Expiration TrackingCampaign Verify authorizations are valid for a single two-year election cycle, and the platform now tracks that: a “Valid Until” column on the Campaign Verify list, a warning email about 30 days before expiration, an expired notice once it lapses, and a renewal banner on the detail page. Existing 10DLC brands vetted with a token are never affected by an expiration - only new token generation is.Campaign Goals for Linc Reply DraftsProjects gain two optional fields under the AI responses toggle: a goal (turnout, donations, RSVPs, volunteering) and additional context (poll hours, donation link, event details). Linc drafts now steer replies toward your goal and only state facts you’ve provided. Copying a project carries these AI settings forward.Fixed
Brands Stuck on “Vetting Pending”Vetting scores now land automatically when external vetting completes; affected brands were repaired.Test Sends Use the Project’s Current Phone NumbersRe-testing a project after changing its assigned numbers now sends from the live pool instead of a previously used, removed number.Performance
Faster Page Loads During Business HoursHigh-traffic reads (project lists, pickers, branding, click analytics) moved to a database read replica, relieving pressure on the primary database during heavy sending.Added
Segment by Area CodeA new “By Area Code” segment operation lists the area codes actually present in a contact list, grouped by state with per-code contact counts, so you can carve a list geographically in a couple of clicks.Search Your Media LibraryThe Media Files page search now searches your entire library instead of only the current page, and the media picker in project setup gained its own search box.Inactivity Warning EmailAccounts approaching the 90-day inactivity suspension now get a warning email 7 days beforehand with the exact deactivation date and a sign-in link.Improved
Two-Factor Authentication HardeningAn internal security audit of the two-factor system closed several gaps, including code replay protection, stricter challenge handling, and encrypted trusted-device storage. No action is needed on your part.Fixed
Survey Follow-Up Questions Not SendingRespondents who answered a survey’s first question were not receiving the next one. Fixed, and stuck conversations were re-sent their pending question.Survey Pricing Matches Each QuestionSurvey questions now bill by their own SMS or MMS setting rather than being inferred from media placement, and cost estimates model the real response funnel instead of assuming every question reaches every recipient - multi-question survey estimates are now far more realistic.Locked-Out Sign-Ins Say SoHitting the failed-attempt lockout now shows a clear message with a live countdown instead of a generic “Login failed,” and completing a password reset unlocks the account immediately.Phone Numbers Stuck “Pending”Purchased 10DLC numbers that stall during carrier assignment are now detected and repaired automatically within minutes, with escalation when the delay is on the carrier side.Scheduled Sends Could StallFixed a caching race that could strand an entire scheduled campaign at activation time.Segment Builder on Large AccountsOn organizations with more than 100 contact lists, picking a brand no longer incorrectly reports “No contact lists in this brand.”Clearer Data-Vendor ErrorsWhen a voter-data provider has an outage, the purchase builder now says so and offers a retry, instead of a generic failure or a misleading “Not available for this state.”Project Setup Scope ChangesChanging a project’s brand or toll-free registration now immediately clears previously selected media and contact lists that belong to the old scope.Manual Send AccuracyRapid clicking on manual send can no longer double-send or double-bill, progress counts converge to the true totals, image previews on the upload page render again, and projects with post-upload opt-outs now complete properly instead of appearing to never finish.Added
Multiple Phone Numbers per ProjectProjects can now send across up to 49 phone numbers instead of one. New conversations are spread across the project’s numbers, and once a recipient has been texted from a number, every future message in that conversation comes from the same number - a stable sender that carriers and recipients recognize. Works identically for 10DLC and toll-free.Schedules Page with Calendar ViewA new Schedules page under Projects shows every scheduled send, past and upcoming, as a grouped list or a month calendar, with a scheduled-date filter that’s also available on the main dashboard.Choose Your Tracking-Link ParameterTracking-link redirects previously always appended the recipient’s phone number. You can now choose which contact field (or none - the new default) is passed along, so you can match responses on any field from your list. Existing link-tracking projects keep phone behavior.Toll-Free in the Public APIThe public API now lists toll-free verifications, includes toll-free numbers inGET /v1/phone-numbers (previously excluded), and accepts a channel on POST /v1/projects so toll-free projects can be created programmatically.Fixed
Toll-Free Messages Billed at the Correct RateToll-free sends were being billed at 10DLC rates across every send path. Corrected, and toll-free rates are now visible and editable on the pricing pages.Data-Purchase Filters Scope to Your SelectionDependent geographic values (precincts, commissioner districts) now list only the values that exist within the counties you’ve already selected, with real record counts, so picking a value never yields an empty universe.Performance
Resolved the June 2 SlowdownThe live project-progress query was scanning far more data than needed and briefly saturated the database on June 2. It’s now properly bounded, and a database read replica was added for resilience.Added
Toll-Free Registrations Can Own Their AssetsContact lists, media files, and opt-out lists can now be scoped to a toll-free registration, just like brands for 10DLC, with a grouped owner picker (Global, Brands, Toll-Free Registrations) wherever you upload or create assets. STOP and START replies on toll-free projects are now recorded against the registration’s own opt-out list.Fixed
Stay Signed InA cluster of session bugs that logged users out on every page refresh, or roughly once a day, is fixed: a duplicate cookie left behind by an earlier change, token refreshes racing each other across tabs, and shared rate limits on office networks. You should no longer be asked to sign in repeatedly.Phone Number Renewals Get a Grace PeriodA single failed renewal charge can no longer release your phone number. Failed renewals now enter a grace window with an email notification so you can top up, retries continue daily, and the number is released only after the grace period expires. Turning off auto-renew remains the only way you intentionally give up a number.Phone Purchases Work AgainEvery campaign number purchase had started failing with “number no longer available.” Fixed, and a genuine conflict (someone else grabbed the number between search and purchase) now shows the real reason and refreshes the list.Toll-Free Submission ReliabilityFixed carrier rejections caused by payload formatting (website URL protocol, registration country, ISV/reseller field), draft-save failures on longer write-ups, and silently dropped status webhooks. Verification status now displays as a clear Submitted, Under Review, Approved stepper; Campaign Verify tokens are required only for political use cases; and the form warns when your contact email’s domain doesn’t match your website.View-As Acts on the Right OrganizationPhone purchases, chat replies, and saves made while viewing as a sub-organization now execute under that organization. Long-lived sessions stay alive while actively in use, and the project builder blocks a save that would land in the wrong organization instead of failing silently.Deleted Media Stays Viewable in Sent HistoryDeleting a media file no longer destroys the underlying stored file, so past MMS messages keep rendering. Deleted contact lists no longer appear in detail views or attach to projects.Projects Page Crash for Empty AccountsOrganizations with zero visible projects no longer hit an error page on the dashboard.Improved
Stricter Phone Validation at ImportContact imports now validate numbers against real numbering-plan rules, so genuinely invalid numbers are flagged in the invalid list at import instead of being stored as bad data.Added
Toll-Free Texting, End to EndA full toll-free sending path now exists alongside 10DLC: purchase a toll-free number, complete carrier verification with a savable draft form, and send once the carrier marks it verified. Toll-free projects skip brand and campaign registration entirely - they just pick a verified toll-free number.Aristotle Voter DataAristotle (VoterListsOnline) joins L2 as a second data provider, with curated political filters (party, gender, age, districts, donor status), itemized quotes that show what each add-on costs before purchase, and data appends that narrow the universe and bill only the matching records. Voting history is expressed the way turf-cutters actually think: “voted in at least X of the Y elections I selected.”Survey Authoring at Parity with BroadcastsEvery survey question now supports MMS media, the emoji and formatting toolbar, merge fields with fallbacks, accurate segment counting, and link tracking. Questions with answer options can also route unmatched replies to a chosen question or the outro via a new no-match branch.Survey Exports Include Contact-List ColumnsSurvey exports now carry the same audience columns as data exports, so you can segment responses by any list attribute without cross-referencing two files.Improved
Counts Reflect the Messages Recipients Actually GetThe composer’s character and segment counter resolves merge tags to realistic values before counting, and the phone preview substitutes{tag|fallback} syntax instead of showing it literally - so a personalized message is no longer over-counted.One Copy-ID Control EverywhereCopying an ID now works the same way on every page: an always-visible copy icon with a brief confirmation, including pages that previously had no copy affordance at all.Fixed
Contact List Uploads Landing in “Failed”Two upload regressions are fixed: imports through the public API timed out waiting on storage, and large browser uploads could drop mid-import. Transient connection blips now retry automatically instead of failing the list.Project Report EmailsReport-ready emails had silently stopped sending; fixed, along with the dashboard not reflecting project status changes in real time.Performance
Starting Large Projects No Longer Times OutAudience compilation now runs in the background with a new “Building dispatch queue” status - starting or scheduling a project returns instantly regardless of audience size, instead of risking a timeout on big lists. Separately, inbound webhook surges can no longer briefly overwhelm the platform, and a background job that could saturate the database while checking project completion was rewritten (56 seconds down to 79 milliseconds).Added
Simple Auth for Data ExportsSetting up a recurring data export to S3 is now a one-screen flow. The destination type picker, IAM-role walkthrough, and Snowflake/Databricks config panels are gone - you provide an S3 bucket and access credentials, and exports start flowing. The minimum IAM policy snippet in the onboarding panel is also tighter (PutObject + multipart uploads only).Performance
Faster, More Reliable Data ExportsLarge data exports finish faster and survive worker restarts. If a deploy rolls during a long export, the next worker picks it up within a minute instead of waiting for the previous attempt to time out. Stuck exports also self-recover instead of staying in “Running” for an hour.Added
CSV Uploads with No Header RowContact-list uploads now handle CSV files that have no header row or have blank header cells. If the file has no headers, the importer auto-detects that the first row is data and re-parses with synthetic column names (Column 1, Column 2, …). If only some headers are blank, those columns are renamed instead of failing the upload. An amber banner explains what was detected, with a one-click toggle to flip between “first row is headers” and “first row is data.”Performance
5-10x Faster Contact-List UploadsLarge contact-list uploads (50k-100k+ rows) now finish in 30 seconds to 2 minutes instead of 5-15 minutes. Profile enrichment runs in the background so the upload itself completes the moment contacts are in the database, and the global opt-out list is cached so concurrent uploads don’t all re-read it.Added
Campaign Verify: Secondary Submission PathThe Campaign Verify form now explains what to do when your filing information isn’t published online. A new help block under the Filing Record URL field describes the two paths Campaign Verify will accept (a published IRS filing OR direct-from-election-authority verification), and walks through how to usehttps://forms.irs.gov/ as the Filing Record URL when submitting a published IRS filing.Added
Compliance Checks in the Message EditorTwo new inline warnings appear in the template editor before you send:- Public URL shorteners (bit.ly, tinyurl.com, t.co, etc.) are flagged because US carriers commonly block them as spam. Your own custom tracking domains are not flagged.
- Duplicate opt-out instructions (“Reply STOP to end”, STOP=END, STOP/END, opt-out, unsubscribe, etc.) are flagged because the platform already appends the required opt-out footer automatically.
Added
Redesigned Chat ScreenThe project chat screen has been rebuilt for clarity and space. Conversations now show contact avatars with initials, unread-count badges, and more readable timestamps. Inline contact tags collapse cleanly when there are too many to fit, and the contact-details pane is a clean slide-over on mobile. The composer stays pinned, the message list scrolls cleanly behind it, and everything fits without the page jumping when the keyboard appears on phones.Added
Media File Status TrackingUploaded media files now show their status (Uploading, Compressing, Saving, Ready) and survive a page refresh - no more uploads disappearing mid-compression. Failed uploads display a clear reason on hover instead of vanishing silently, and the message composer now hides any media that is still processing so it cannot be attached by mistake.Performance
Faster Dashboard LoadingHome page metric cards (Messages This Month, Message Volume, Performance) now load instantly for organizations of any size - including parent organizations with many sub-orgs that previously timed out and rendered blank.Faster L2 Voter-Data FiltersFiltering and counting against the L2 voter file is significantly faster, especially for large state-wide universes. Saved searches load quickly and re-running the same filter no longer redoes the heavy work.Faster Report Generation & DownloadsReports now start downloading in seconds instead of waiting for the full file to assemble, and the download button no longer fails on long-tailed files. Large exports finish noticeably faster.Fixed
2FA No Longer Required on Every Login (Custom Domains)Fixed an issue on white-labeled custom domains where two-factor authentication was prompted on every login, ignoring the ‘Remember this device’ checkbox. Trusted devices are now correctly remembered across logins on every domain.Projects No Longer Hang in SendingFixed an issue where a small number of projects could remain stuck in the Sending state after every message had finished, even though the work was actually complete. Affected projects now correctly transition to Completed.Added
Comma-Separated Test RecipientsProject test sends now accept multiple phone numbers separated by commas, so you can QA a campaign across several test devices in a single send.Changed
Improved Media CompressionImage and video compression is tuned for cleaner MMS payloads. Photos taken on mobile now retain correct orientation through the upload pipeline, and a few edge-case encoder failures on non-standard sources are resolved.Added
L2 Voter-Data PurchasesBuild a custom voter universe in-app with live filters and an estimated count, then purchase the resulting list with a credit card. Purchases land in CSV or JSON, are downloadable from the new Purchase History tab for 7 days, and are billed separately from your platform wallet.Added
API Project BuilderExternal tools and partners can now build, test, and schedule projects entirely through the public API. New endpoints cover list import, list analysis, media upload, project creation, test sends, scheduling, and webhook subscriptions - everything the in-app build flow does, available programmatically.Selected Media Now Visible in ComposerWhen you attach a media file in the message composer, the thumbnail, filename, and size now appear inline so you always know exactly which file is attached without re-opening the picker.Performance
Faster, More Reliable Number LookupsNumber lookup throughput is now governed by a single global rate limiter, so lookups stay smooth even when our worker fleet scales up. Slow lookups are no longer rejected mid-job and queued lookups complete more predictably.Added
Stripe Connect & Parent Org PayoutsParent organizations can now become resellers with a fully in-app verification flow, automatically receive payouts to their own bank account when sub-organizations add funds, and choose a daily, weekly, or monthly payout schedule. Any organization can now save a payment method on file, and auto-recharge will route funds correctly for sub-organizations.Added
Survey Response BranchingSurvey questions can now branch based on each response - send ‘Yes’ answers to one question and ‘No’ answers to another, or skip directly to the end. Each multiple-choice option has a new “Go to” dropdown, and branch targets update automatically when you reorder or delete questions.Fixed
Project Copy Preserves Full ConfigurationCopying a project now preserves the opt-out footer setting from the source project (previously it would silently default back to on). Copying surveys is also fully transactional now - a partial failure can no longer leave you with a half-copied survey.Added
Enterprise Data ExportsNew Enterprise feature: automatically stream your project and message data to your own Amazon S3 bucket, Snowflake warehouse, or Databricks workspace on an hourly or daily schedule. Includes a Data Exports admin page to manage destinations, watch job history, and trigger one-off exports.Changed
Smarter Opt-Out DetectionWe now catch many more opt-out phrases and common typos (like ‘stip’, ‘stoo’, and ‘srop’), plus variants like “leave me alone” and “remove me”. This catches roughly 700 more opt-outs per day and keeps your lists cleaner and more compliant.Added
Bot Click FilteringLink tracking now automatically filters out bot clicks for more accurate analytics.Fixed
MMS Media QualityFixed MMS media formatting to prevent quality changes when sending to carriers.Added
Export to Postman CollectionExport your API configuration as a Postman collection for easy testing.Performance
Faster Dashboard LoadingSignificantly improved dashboard loading speed. Pages that previously took several seconds now load instantly.Faster Webhook DeliveryWebhook processing is now significantly faster. Delivery status updates arrive sooner.Improved Message Sending SpeedDoubled message processing capacity. Large campaigns now send significantly faster.Added
10DLC Pricing ControlsAdded pricing controls for 10DLC provisioning and vetting. Organizations can now configure custom pricing for brand registration and campaign vetting.Fixed
Campaign Verify SubmissionFixed validation errors on the campaign verify submission form.Dashboard Cost DisplayFixed project cost on the dashboard showing lower than the actual cost.Link Tracking Performance FixFixed a critical issue where large sends with link tracking caused database CPU spikes and system lockup under high click volume. Redirect performance is now stable regardless of send size or concurrent click load.Sending SpeedsFixed sending speeds not being applied correctly to campaigns.Survey MMS PreviewsFixed MMS previews not displaying in survey projects.Survey ValidationFixed validation errors on survey projects and fixed surveys not requiring re-testing after being edited.Fixed
Fixed dashboard becoming unresponsive during link tracking sendsFixed an issue where campaigns using link tracking could cause the UI to crash, making the dashboard appear frozen or broken while a project was sending.Added
Agency ModeManage multiple organizations from a centralized admin interface. Switch between organizations and manage all your clients from one place.Copy ProjectsDuplicate existing projects to quickly create new campaigns with the same settings. Save time by copying project configurations instead of starting from scratch.Fixed
Accurate Reply MetricsFixed reporting to exclude opted-out recipients from reply statistics. Reply metrics now accurately reflect only active, opted-in recipients.Added
In-App Notification SystemStay updated with real-time notifications! Get alerts for project completions, low balance warnings, payment confirmations, and more. Access your notification history anytime from the notification bell icon.Search and Filter Recurring TransactionsEasily find and manage your recurring charges with new search and filtering options on the billing page. Filter by transaction type, status, or search by description.Fixed
Fixed Missing Recurring Billing ChargesResolved an issue where phone numbers and 10DLC campaigns were not being properly billed with recurring transactions. All missing charges have been backfilled.Fixed Project Completion NotificationsYou will now receive notifications when your scheduled projects complete successfully. Never miss when an important campaign finishes!Added
Advanced Dropdown SearchEnhanced dropdowns across the platform with powerful search and filtering capabilities, making it faster to find what you need.iPhone Message PreviewsAdded realistic iPhone message preview examples throughout the platform to help you visualize how your messages will appear to recipients.Non-Political Brand VettingAdded streamlined vetting workflow for non-political campaigns, making it easier to get your brand approved for messaging.Changed
Streamlined Brand and Campaign WorkflowsImproved the brand setup, campaign verification, and campaign creation workflows for a smoother, more intuitive experience.Fixed
Login Error MessagesImproved error messages during login to be clearer and more helpful when authentication fails.Pricing Settings PrecisionFixed an issue where decimal values in organization pricing settings were not saving correctly.Added
Automatic Video & Image CompressionVideos and images now automatically compress to meet carrier size limits. The system will try to preserve quality while ensuring files are under 900KB. Supports all common video formats (MP4, MOV, iPhone videos, etc.).Changed
Enhanced Reporting PageImproved reporting page with better data visualization and iPhone message preview examples.Fixed
Fixed Login Error MessagesImproved error message display when login attempts fail.Fixed Pricing SettingsResolved issue with decimal precision in organization pricing settings.Changed
Improved Platform PerformanceOptimized database queries and webhook processing for faster response times.Added
Survey ProjectsCreate interactive multi-question surveys that automatically progress based on recipient responses. Build surveys with up to 30 questions, track completion rates, and export results to CSV for analysis.Added
Project Dashboard FilteringAdded filtering capabilities to the project dashboard and archive for easier project discovery and management.Changed
Enhanced Homepage ExperienceImproved homepage with better support for resellers and sub-organization queries, making it easier to navigate and manage multi-tier organizations.Performance and Stability ImprovementsImproved overall system performance and stability with database optimizations and better resource management.Fixed
Fixed Chat Page Display IssueResolved an issue where the message window appeared at the bottom of the conversation list instead of in its proper position.Fixed Segment Builder CrashFixed a crash that occurred when selecting multiple contact lists in the segment builder.Added
Daily Usage LedgerView detailed daily billing ledger entries with date range filtering. Access your complete billing history and transaction details for better financial transparency.Changed
Improved Loading ExperiencePage loading now shows content-aware skeleton previews instead of generic spinners, providing a smoother and more responsive experience.Performance
Faster Message ProcessingMessage delivery speed improved by 15-25% through optimized caching and database query consolidation.Fixed
Recurring Billing FixesFixed calculation and scheduling issues with recurring charges to ensure accurate monthly billing.Added
Enhanced Accessibility FeaturesThe platform now meets WCAG 2.1 AA accessibility standards. Improvements include better keyboard navigation, screen reader support, skip navigation links, and high contrast text for improved readability.Changed
Improved Dark Mode SupportDark mode has been enhanced with better color consistency and improved visual design. All interface elements now use a unified color system for a more cohesive dark mode experience.New Modern Design SystemWe’ve completely redesigned the user interface with a modern, professional design system. You’ll notice improved visual consistency, smoother animations, and a more polished look throughout the application.Performance
Faster Page Load TimesWe’ve optimized the application bundle size, reducing it by approximately 90-100KB. This means faster initial page loads and improved overall performance throughout the platform.Performance
Faster Contact List ProcessingContact list uploads are now up to 2.5x faster. Phone number searches are 10x faster. Large contact lists (100k+) now process in under 2 minutes instead of 5+ minutes.Faster Dashboard LoadingDashboard pages load 99.8% faster. Brand and campaign lists now load in milliseconds instead of seconds, even with large datasets.Fixed
Fixed Phone Number Search and Purchase ErrorsFixed errors in phone number search and during purchase that were blocking users. Improved error messages and logging for better troubleshooting.Added
Contact List SegmentationCreate targeted contact lists from project engagement. Segment contacts who clicked links, responded to messages, or didn’t engage. Build sophisticated audiences for follow-up campaigns.Outbound WebhooksSubscribe to real-time event notifications for project lifecycle, message status updates, and contact list events. Integrate your external systems with webhook delivery, retry logic, and signature validation.Performance
Faster Platform ResponseEliminated system bottlenecks resulting in 5-10x throughput improvement. Projects start faster and the platform stays responsive under heavy load.Added
API DocumentationComplete API documentation with code examples in multiple languages (cURL, JavaScript, Python). Includes authentication guide and best practices.API Key ManagementSelf-service API key creation and management for external integrations. Create keys with granular permissions for different access levels.Merge Tag MappingMap CSV columns to merge tags with smart auto-detection during upload. System automatically detects common fields like FirstName → first_name.Multiple Contact ListsUse multiple contact lists in a single project with automatic de-duplication across all lists.Template Editor EnhancementsInsert merge tags with fallback syntax ({first_name|Friend}) for personalized messages. Includes live preview with sample contact data.Added
Send Test Messages to Multiple Phone NumbersYou can now send test messages to multiple phone numbers at once (up to 10 recipients). Add or remove phone numbers with the +/- buttons, and see the delivery status for each recipient in the test history.Added
Link Tracking SystemTrack recipient clicks on campaign links with detailed analytics. Measure engagement with click-through rates, detect viral sharing, and analyze device/browser/OS breakdown. Custom branded short domains available with platform domains (vter.io, msg.vote) included for all organizations.Fixed
Fixed Contact List Saving in DraftsContact list selections now properly save when creating or editing project drafts. You can save your work and resume later without losing your contact list configuration.Fixed
Project edit screen now shows all fields correctlyFixed issue where project data was not properly loading all fields on the edit screen. All project fields now correctly populate when editing.Projects can now be successfully deletedResolved critical bug that was preventing project deletion. You can now delete projects as expected.Reporting page now appears for all projectsFixed bug where the reporting page failed to display for projects that were sending. Reporting data is now accessible for all active and completed projects.Session timeouts now work correctly - you’ll stay logged in for 48 hours of inactivity or 30 daysFixed logout timer accuracy. Users are now only logged out after 48 hours of inactivity or 30 days absolute maximum, eliminating premature logout issues.Suppression lists can now be properly added to projectsFixed issue preventing suppression lists from being associated with projects. You can now successfully add and manage suppression lists for your messaging projects.Added
Campaign Verify Management - Centralized Political VettingNew standalone Campaign Verify management page for political campaign vetting and compliance. Create and manage Campaign Verify submissions at the organization level (not tied to specific brands). Full lifecycle support: save drafts, submit to Campaign Verify, verify PIN codes, and generate unlimited tokens for 10DLC, Toll-Free, and Short Code messaging. Each verified submission can generate multiple tokens for different use cases. Import existing tokens from external Campaign Verify accounts.Changed
Campaign Verify System ImprovementsCampaign Verify functionality has been reorganized and improved for better usability. All campaign vetting and compliance management is now available in a dedicated section, making it easier to manage political campaign verification independently from brand registration.Improved Brand Management InterfaceComplete redesign of the brand management pages with cleaner UI, better workflow visibility, and improved navigation. Brand detail pages now focus exclusively on TCR brand registration and 10DLC campaign management. Campaign Verify functionality has been separated into its own dedicated management page for better organization and clarity.Added
Session Activity TrackingView all active sessions and see when and where you logged in from your profile page.Two-Factor Authentication AvailableYou can now enable two-factor authentication (2FA) using authenticator apps like Google Authenticator or Authy for enhanced account security.Performance
Billing Page PerformanceBilling balances page is now 96% faster (under 1 second instead of 13 seconds).Faster Dashboard LoadingDashboard and projects pages now load 40-60% faster thanks to optimized caching.Fixed
Cross-Browser Session PersistenceSessions now persist correctly when closing and reopening your browser.Multi-Device Session SupportYou can now log in from multiple devices simultaneously and manage all active sessions from your profile.Session Stability ImprovedYou will no longer be logged out every 15 minutes or after deployments.Trusted Devices PersistYour trusted devices for 2FA now remain trusted even after app updates.Security
48-Hour Inactivity TimeoutFor your security, sessions now automatically expire after 48 hours of inactivity.Enhanced Account ProtectionImproved brute-force protection with automatic account lockout after 10 failed login attempts.Improved Session SecurityAuthentication tokens are now more secure.Added
Branding & Domain ManagementNew dedicated admin page for complete white-label control. Upload custom logo and favicon, manage multiple custom domains, view real-time provisioning progress, and set primary domain with automatic redirects.Custom Domain SupportAdd your own branded domain (e.g., app.yourcompany.com) to access the platform with automated SSL certificates and global CDN delivery. Simple DNS verification workflow with one-time setup fee of $5.00 per domain.Domain Provisioning WorkflowFull domain lifecycle management with visual status indicators. Automated certificate provisioning (5-30 min) and CloudFront deployment (15-20 min). Access your app via custom domain immediately once active.Changed
Enhanced System ReliabilityImproved overall system reliability and stability. The platform now handles large projects and high message volumes more smoothly.Performance
Improved System PerformanceSignificantly enhanced system performance and speed. Pages load faster, operations complete more quickly, and the platform handles high-volume messaging more efficiently.Fixed
Fixed Timeout ErrorsResolved timeout errors that occasionally occurred when loading pages or performing operations. The platform is now more stable and reliable.Changed
Enhanced System ReliabilityThe platform is now more stable with comprehensive monitoring to ensure consistent performance and uptime.Performance
Faster Dashboard LoadingYour dashboard now loads 50-100x faster with instant access to projects, contacts, and messages.Faster Message ProcessingMessages are now sent 3x faster with improved throughput. Large campaigns complete more quickly with better real-time progress tracking.Improved System Performance and StabilityThe platform is now significantly faster and more reliable. Pages load up to 260x faster, and the system handles large message campaigns without any slowdowns or errors.Fixed
Eliminated System CrashesFixed issues that could cause the system to crash when processing large message batches. The platform now reliably handles campaigns with 100,000+ messages.Fixed
Contact List DownloadsResolved an issue that prevented users from downloading contact lists after they had been analyzed. Downloads now work reliably once analysis is complete.Performance
Message Processing ReliabilityEnhanced message processing stability under high load, ensuring consistent delivery performance and reliable status updates even during peak usage periods.Webhook Processing StabilityResolved an issue where webhook events were not properly closing database connections, leading to lock contention and delayed processing. Webhook ingestion and status updates now execute more efficiently and reliably under high load.Changed
Enhanced Message Export DataProject data exports now include individual message delivery status and detailed disposition information, providing more granular insights for campaign analysis and reporting.Performance
Dashboard Performance ImprovementsSignificantly improved dashboard loading speed, with the activity feed now loading 20-40x faster and providing a smoother user experience when viewing recent messaging activity.Changed
Recurring Usage View - Nested Phone Numbers & Cascade ControlsUpdated the recurring usage page to display phone numbers nested under their associated campaigns, making it easier to understand which numbers belong to each campaign. Added cascade toggle functionality to enable or disable auto-renew at the campaign level, automatically applying settings to all linked phone numbers.Fixed
Recurring Charges TriggerResolved an issue where recurring charges were not triggering as expected, ensuring automated billing runs reliably and on schedule.Added
Status PageIntroduced a dedicated status page to display real-time system health, component uptime, and incident updates, improving transparency and reliability awareness for users.Status Page SystemBuilt and launched a status page system to show real-time platform health, component monitoring, uptime history, and incident reporting - improving transparency and operational confidence without relying on third-party tools.Changed
Navigation EnhancementsRefined the platform navigation for faster access to key sections, clearer menu structure, and a smoother user experience across the app.Fixed
Auto-Recharge ReliabilityResolved an issue where auto-recharge could get stuck and fail to process, ensuring wallets recharge automatically when balance falls below the configured threshold.Inbound Message BillingResolved an issue where inbound messages were not being billed correctly, ensuring accurate usage tracking and billing for received messages.Project Completion TrackingFixed an issue where projects would display as incomplete even after all messages were delivered, ensuring accurate project status and progress indicators.Added
Compliance & Policy PagesAdded full compliance documentation, messaging policies, legal disclosures, and carrier-required guidelines to ensure clarity and campaign readiness.Help Center & FAQsLaunched a comprehensive Help Center and FAQ resource covering key setup steps, common questions, troubleshooting, and support workflows.Platform Features ListPublished a full feature overview page outlining core platform functionality, pricing, and competitive advantages.Changed
Onboarding GuideExpanded the onboarding guide to include detailed, end-to-end setup instructions across the full system - from registration and campaign setup to sending messages, billing, and reporting.Added
Changelog systemIntroduced an in-app changelog section to track updates and communicate improvements to users.Homepage contentAdded full content to the homepage.Phone number descriptionsUsers can now add custom descriptions to phone numbers for improved organization and account clarity.Added
Archived Project ManagementView and manage archived projects with snapshot metrics. Filter to show/hide archived projects and prevent editing with clear visual indicators.Performance
6x Faster Billing for High-Volume SendsDramatically improved billing system performance during concurrent operations. Large message bursts now process without timeout errors.Fixed
Critical Billing Accuracy ResolvedEliminated missing ledger entries that were causing silent billing failures. All charges now process correctly with complete audit trail and proper retry logic.Added
Text Formatting in Message TemplatesAdded bold and italics formatting options to message template editor for richer message styling.Performance
Large Projects 85% FasterHigh-volume message projects (3,600+ messages) now complete in under 2 minutes instead of 13+ minutes with improved database efficiency.Message Billing 100% AccurateFixed race condition that could cause lost charges during high-volume sends. All messages now billed correctly with complete audit trail.Fixed
Brand Registration Billing FixedEliminated double charge issue when registering brands. Registration now charges correctly with single transaction.Dynamic Custom Field SubstitutionMessage templates now support any CSV column header as a placeholder (e.g.,{FirstName}, {Company}, {Title}) for personalized messages.Project Delivery Rate FixedDelivery rate percentages now calculate correctly, excluding reply messages from the calculation to show accurate delivery metrics.