Release Email Archive

Before we start each release of new features and bug fixes we send an email to our client list. You can request to be added to the release notes list.

Following is an archive of these emails.


System alerts archive

The announcement archive page has been enhanced to also show copies of system alerts which you have received. You can now search and filter past (archived) alerts. This is intended to make it easier for to correct any problems ActionKit reports to you, such as site DNS issues, or problems with your ActBlue integration.

You can find a link to archived announcements in the admin menu at the top right of your admin.

There, you'll see the archive of all your announcements, including system alerts.

Improve page load time for Braintree donation pages

A small template change will let Braintree donation pages load more quickly, which will hopefully result in happier and more generous donors! Donation pages can get a necessary client token from an asynchronous context call instead of loading it inline.

Instead of this:

actionkit.donations.initClient('{{ pp.client_token }}', options);

Do this:

let braintreeInitialized = false;

function initFromContext() {
    if (!braintreeInitialized) {
        actionkit.donations.initClient(actionkit.context.client_token, options);
        braintreeInitialized = true;

$(actionkit.form).on("actionkit.ready", initFromContext);
if (actionkit.context) {

The donate.html template in the Original template set has been updated to include this change if you need to look at an example.

Fix after-action redirect URL error in some templatesets

We've made some minor templateset edits to replace instances of {% verbatim %}{{ page.followup.url }} with {% include_tmpl page.followup.url %}{% endverbatim %}, fixing a rare issue where if you had templateset customizations to use the After-Action Redirect URL and you were using conditional content and/or personalization in your After-Action Redirect URL, the redirect wouldn't work correctly in your templateset.

Use Github for ActionKit templatesets? Here is the custom SQL you'll need to find the places we've patched. You'll want to make these replacements in GitHub too, otherwise those changes will be overwritten during your next push.

If you don't use the GitHub templateset integration, there's nothing you need to do.

Bug fixes and other

  • A bug in the query builder was fixed, which was preventing users from creating an action report which returned the event title. Thanks to Harrison at Dream Corps for the catch!
  • Donation pages with products now allow you to enter 0 as a quantity (rather than just leaving the field blank) to mean that you don't want that product. Thanks to Eileen at DSA and Alex at MoveOn for reporting the problem!
  • We fixed a bug that caused a mailing to die if it was set to go to users at a set time in their local timezone and targeted a user that didn't have a row in core_location. Thanks to William Joel Bravo at MoveOn for letting us know about the problem.
  • We fixed a bug that caused mailings going to users at a specified time in their timezone to report incorrect estimated time to completion when sent on the last day of the year. Thanks to Nicholas Flynn at the NDP for the report!


Deliverability docs

Did you watch our video on deliverability and come away wanting even more details? Good news! We've put together a comprehensive deliverability guide just for you that's got lots of great info to help you get the best inbox placement. The docs cover everything from the basics of deliverability, to relevant ActionKit features, advice on delays and individual mailbox providers, and much more.

Coming soon: faster mailing rebuilds

When you have multiple mailings scheduled for the same day that exclude each other, one targeting change can lead to rebuilding all other mailings for the day. In an upcoming release we'll introduce an option, Fast Rebuilds, that can significantly reduce the build time for those other mailings.

It works by saving the full list of includes for a mailing before applying excludes to generate the final set. When a mailing's excludes changes but the includes stay the same, we're able to reuse the includes, making for faster build times.


It's now easier to preview your test variants on A/B tests in the mailer. On the proof and send screen we've added separate previews for each test variation, which can be individually opened and collapsed.

The last release added delivery stats to the Bounce/Delay Metrics screen. In this release we added delivery stats to the downloadable reports available on that screen, as well.

Bug fixes and other updates

  • We fixed a bug that could allow a clever ActionKittie to launch a mailing twice. Thanks for the heads up, Brandt McCool from 314AF.

  • Recent releases have added email alerts for certain issues, including broken ActBlue and DNS configurations. These emails now link to the hostname for your instance managed by ActionKit's DNS, in the form of This avoids a catch-22 in which a DNS problem could prevent you from accessing the support form at the usual URL.

  • We fixed an incorrect Django snippet in the default intro text for event moderation pages. Thanks to Ankur at MoveOn for reporting!


Snippets in after-action redirect URLs

You can now use snippets in page after-action redirect URLs! This is a convenient way to send users to specific follow-up URLs based on how they filled out your form, or include dynamic parameters from the action or other data.

In the past you might have needed to customize a templateset to do this: customizing thank-you templates to immediately redirect or passing a redirect along with action data.

Snippets available here are those associated with the action taker and the action, like {{ }} Or, if you have a custom field named, say, donations_2024, the snippet would be {{ user.custom_fields.donations_2024 }}.

Be sure to test your pages extensively when using this feature. Invalid URLs or broken snippets will redirect to the standard thank you page.

Requested most recently by Ian working for VoteVets.

Total delivered mailings on deliverability metrics page

The count of messages successfully delivered is now displayed on the Bounce/Delay Metrics page. The percent of user mailings delivered is also shown, grouped by mailbox provider, in the "Deliverability by Mailbox Provider" table.

With this change it's easier to see how many messages are getting through, and help you better understand and tune your targeting.

Thanks to Andrew at DreamCorps for the request.

Bug fixes and other updates

  • We fixed a bug where the warning popup about mailings that would be invalidated by a change to your current mailing's targeting was showing sent mailings as well as drafts. Thanks to Keith at Progressive Change Campaign Committee for telling us about it.
  • We updated the AMP for Email validator. Thanks to Phillip at for the request!
  • We corrected our documentation on setting up webhooks for Braintree payment accounts. Thanks to Eileen at DSA for the reporting the error!


Resume Mailings

We've added a new feature in the ActionKit mailer - resume! When a mailing is stopped or died you can now click "Resume" to resume sending where the mailing left off. You can use this if you stop a mailing by mistake or when a mailing dies due to a server issue and support lets you know it's safe to retry sending.

Automated notifications for ActBlue issues

ActionKit will now alert you to the most common problems with your site's ActBlue integration. If we detect that there have been multiple failed attempts to connect to the ActBlue webhook, email alerts and on-screen warnings will be sent to the admin staff users assigned as technical contacts. These warnings will allow you to quickly catch and correct the most common ActBlue integration problems before they disrupt your work.

You'll also receive an email to the technical contacts defined under "Contact Settings" on the "Configure ActionKit" screen. If no technical contacts are set, we'll try to mail the last two superusers to log in.

ActBlue user warnings

We've also made some changes to the admin's staff change form to reduce unintentional interruption of the ActBlue sync.

The ActBlue sync uses an ActionKit staff user to deliver webhooks. If the staff user is disabled, or the password is changed without updating ActBlue, then ActionKit won't receive data from ActBlue.

Now, when editing a staff user that was recently used to deliver ActBlue webhooks, we've added a warning at the bottom of the edit page, and before saving your changes you'll have to acknowledge that the user is used by ActBlue.

Bug fixes

  • Fixed a small issue that allowed alert messages to be displayed on the two-factor authentication login form.
  • We modernized some old JavaScript used for prefilling forms in actionkit.js. Thanks to Sherezz at 350 for reporting.


Gmail missing images fix

This change happened in between releases, but we thought was worth detailing here. In December, a number of clients reported images from S3 intermittently not showing in Gmail. We found that it reliably fixes this to replace the domain with in the image URL. We applied the change automatically to your media library URLs, email wrappers, and recurring mailings, and in the "Media Prefix" setting on your Configure ActionKit screen.

If you run into a missing image now, the most likely cause is copying an image URL that still uses the older domain, for example from an old mailing, and the fix is to add the missing 'us-east-1' to the domain. Thanks to everyone who reported this and helped us test and deploy the changes to fix it, including Virginia at Middle Seat and Anna at Mothership.

Automated notifications for site issues

We've added alerts that tell you about two site issues we've seen crop up from time to time. Sometimes, ActionKit is unable to access your Amazon S3 bucket used for images and other media, such as if you have an overdue Amazon bill or make a mistake configuring S3 permissions. More rarely, but urgently, mistakes when updating your site's records or moving between DNS providers can make your ActionKit site unreachable. An in-admin alert for S3 might look like this:

You'll also receive an email to the technical contacts defined under "Contact Settings" on the "Configure ActionKit" screen. If no technical contacts are set, we'll try to mail the last two superusers to log in. We recommend adding contacts if you have none. We're already planning other alerts in this framework, and adding contacts now ensures you get them.

See some mailer DNS records and sending IPs in the admin

We added a new screen to see mailer DNS settings for your default sending domain, under Configure ActionKit > Mailer Settings > Mailer DNS Settings. It will alert you about missing DNS records for DKIM, DMARC, or SPF for your default sending domain. It also shows you the results of DNS lookups of your mailer DNS records and your sending IPs, and you can refresh it after a DNS change. For example, here are lookup results for an internal test domain that doesn't have DKIM or DMARC set up:

As with the alerts, we're planning to expand on this screen, adding more detail and showing multiple sending domains if you have those set up.

Bug fixes

  • We fixed an issue where using the API to change a page would erase its email notifications and webhooks. Following this change, page followups must be modified directly, using the page followup resource, and cannot be changed through the page resource. Thank you to Brett at BC NDP for reporting the issue to us!
  • We fixed a rare situation where a user whose PayPal donation attempt had just failed couldn't attempt a credit card donation. Thanks to Alex at MoveOn for reporting.


New blog post: Soft Bounce handling

You already know it's a good idea to unsubscribe users who are inactive. But did you know it's also a good idea to unsubscribe users whose mailboxes are always full? They aren't getting your email anyway -- check out our blog post on our Soft Bounce handling system.

Self-service Import Stub payment accounts

You can add your own Import Stub payment accounts, which you can use to import ActBlue donations or donations imported from other sources. You can find this in the configuration menu under Donation Settings > Payment Accounts.

Set auto-excludes up to 10 days in the future

We increased the number of days in the future that you can set the auto-exclude send date for a mailing from 7 to 10. Thanks to Nakia at MoveOn for the request!

More mailbox_provider records in summary_user

Since we introduced mailbox provider as a column on the summary_user table, and added a filter for it in the Query Builder, we've heard from some of you who were surprised to learn that it was only set for users who have activity in the last year. Since this was causing people trouble, we've changed it to work for all subscribed users. You can expect new users you add to get a mailbox provider set within an hour of being added. Note that the other columns in summary_user remain unchanged, e.g. last_click and last_open still only go back one year. Thanks to Lincoln at Aisle518 on behalf of Chris Murphy and Rob at Aisle518 on behalf of Gavin Newsom for bringing this to our attention.

Fixed a permissions bug with imports

We fixed a bug where staff with "Users - plus Imports" permission would see an error after an upload. Thanks to Jason and Jessie at FCNL for reporting!


New Deliverability Tools

Report: Daily Open Rate by Mailbox Provider

A new dashboard report, and some new reporting features have been added to ActionKit aimed at giving you better insight into your message deliverability, and more powerful tools for digging more deeply into your data.

The new report, "Daily Open Rate by Mailbox Provider", gives you an overview of how well your mailings are being received by the various mailbox providers, over the most recent two-week period. This report makes it easier to see issues before they become problems, and more power to identify and resolve problems before they affect your campaigns.

Keep an eye on deliverability

Concerned about deliverability? Having trouble getting your email delivered to Microsoft addresses, for example? Check out our Bounce/Delay Metrics screen.

Read Shannon's incisive new blog post, here:

{% verbatim %}{% endverbatim %}

New Reporting Tools

Pivot Tables for Dashboard Reports

A new custom template tag has been added for Dashboard Reports: pivot_report. This tag works the same as the report tag, with one added function: When you call your report with the pivot_report tag, your query will automatically be made into a pivot table. This gives you a powerful new way to examine your data more easily

Turns this... ...into this
{% verbatim %}{% report "actions_by_pagetype_by_weekday" %}{% endverbatim %} {% verbatim %}{% pivot_report "actions_by_pagetype_by_weekday" with "sum" as pivot_mode %}{% endverbatim %}

New template filter: Divide

A new custom math filter has been added: divide

{% verbatim %}{{ some_value | divide:3 }}{% endverbatim %}

This filter rounds out the other math filters in ActionKit, making it easy to perform arithmetic functions in your templates. By pipelining the divide filter into Django's floatformat filter, you can easily control the appearance of the result:

{% verbatim %}{{ 12 | divide:11 | floatformat:1 }}{% endverbatim %}

...will be rounded to "1.1" (as opposed to 1.0909090909090908...)

New template filter: In_group

Finally, a handy filter has been added to allow you to more easily vary your message based on user group membership: in_group

The filter {% verbatim %}in_group{% endverbatim %} returns true if the user is in the specified user group. The filter can take either the group name (in quotes) or the ID of the user group. For example, if there is a user group named "Wu-Tang Clan" with the ID 36 then the following two snippets produce identical output.

By group name:

{% verbatim %}{% if user|in_group:"Wu-Tang Clan" %}{% endverbatim %}
Wu-Tang is for the children
{% verbatim %}{% endif %}{% endverbatim %}

By group ID:

{% verbatim %}{% if user|in_group:36 %}{% endverbatim %}
Wu-Tang is for the children
{% verbatim %}{% endif %}{% endverbatim %}

Other Bug Fixes and Enhancements

  • We fixed a problem where Mailing Targeting Summaries (viewable by clicking "Compare Activity Levels" on the Proof and Send screen) for Mailings that used Automatic Subject Line Testing would show incorrect percentages for users without recent activity (the raw numbers were correct).
  • Two-factor codes are now being reliably delivered via SMS, so we turned off the backup that would send it to your staff email as well.


  • Emails notifying you of logins from new locations included a guess at the city you logged in from based on your IP address. This guess was quite often inaccurate, because people log in via VPN servers in other cities and because IPs often change uses over time, so we no longer include it.
  • summary_mailing and related tables now track the count of delayed messages in the delays column and soft and hard bounces combined in the bounces_all column. These columns are used to provide certain mailing reports more efficiently. Note this data is only available for relatively recent mailings, not historical ones.
  • We fixed a bug that was occasionally causing URLs to not display in reports that use the Google Table query template. Thanks to Jordan at 350 for finding and reporting this bug!
  • We fixed some bugs around performance and compatibility with MySQL 8. Thanks to Emily at MoveOn and Brandt at 314 Action Fund for the reports.
  • We fixed an issue where you could receive multiple in-admin warnings about bounces and delays on small mailings. Thanks to 314 Action Fund for the report.



Anonymous incoming messages

  • A new texting auto-response trigger has been created to handle anonymous users. If an unknown person sends a text message to your ActionKit site, rather than ignoring it, an automatic reply will be sent. This new "Nonsubscriber Reply" message can be customized by going to the "Texts" tab, and clicking Transactional Messages >> Confirmation Messages.


Daytime hours safety

  • We added a safety to texting to suppress sends to users who would receive it outside of allowed hours. The safety is optional, but enabled by default.


Import Matching

  • Import pages now are able to automatically match texting-only users with any existing email user with the same phone number. Staff can control the strictness of this matching with new controls in the Import Options section, when editing your import page.

    By default, matches are limited to phone numbers which have been updated no more than 365 days ago, names which are similar or exactly the same, and locations which match (by zip code, at least). All these options may be controlled on the import page.




We've made some improvements to the ScorePool system. In particular we're now using raw open data as part of the data-set used to make predictions. The model is now 3-4% more accurate. ScorePool is an optional feature available in ActionKit at no additional charge - if you're not in the program but you'd like to be, write in to support and we'll get you setup.

Bug fixes and Improvements


  • On the mailings tab, the "Scheduled" section no longer shows recurring mailings, to make it easier to sift through. If you want to see your recurring scheduled mailings, we added a "Recurring Scheduled" section. Thanks to Audrey and Emily at Middle Seat for the request!


  • You can now assign one or more staff users to monitor all mailing deliverability alerts. A new configuration option, "Copy To Staff" (in "Mailer Deliverability Warnings" below "Mailer Settings") lets you select one or more staff users. These users will get a copy of every alert email and on-screen message related to mailing deliverability issues. Thanks to Jane Geam at MoveOn for the suggestion!


  • If you accidentally marked one of your emails as spam, you wouldn't be able to receive any of your emails, including proofs. Now, if you request proofs for the email address associated with your staff user, we'll remove the spam block, allowing you to receive proofs again.

  • We fixed an issue where custom mailing fields were not showing validation errors correctly.


  • The XML-RPC API has finally been removed. 👋 Thank you to everyone who put in the work to update their integrations!


  • donation pages now require Accept.js for PCI compliance. This is the case for all active donation pages already, but if you encounter errors setting up a new page contact support and we can help you upgrade your template set.
  • Incoming ActBlue webhooks for declined payments will mark the corresponding recurring order as canceled_by_failure. We backfilled this logic, so recurring orders for declined ActBlue transactions have been marked as canceled by failure as well.
  • We fixed a problem with the Query Builder where it was very difficult to drag and drop "Any/All of these filters" filter criteria boxes into one another. Thanks to Andrew at Dream Corps for the report!
  • The test for "advanced sharing functionality" will honor the templateset query argument, if one is passed. Thanks to Third Bear for suggesting this.


Image Upload Improvements

  • We'll now give you the option to optimize your images when you upload them via the Media Library or the Mailing Compose screens. This will help your pages and mailings load much faster and can save you significantly on bandwidth costs.

Screenshot showing two identical-looking images, one of which has been reduced in file size to show the image optimization feature

  • Additionally, we'll now warn you if you upload a very large image or include a very large image in your mailings. You can configure this threshold in the Configuration menu under Mailer Settings > Large Image Warning Threshold, but its default of 2MB is sensible and keeps your mailing's images loading quickly. If you see this warning frequently, you may want to consider resizing, cropping, or optimizing your images using the tool mentioned previously.

A screenshot of the visual mailing editor with a notification warning that an image in the mailing is very large

Bug Fixes and Improvements


  • You can't upload an XLSX file to an import page (use a CSV or TSV file!), but now we'll show you a sensible error message if you try to edit the headers afterward. Thanks to Soraya at Authentic Campaigns working for Dirt Road PAC for the most recent report.
  • We fixed a problem where if a user already had a lot of consecutive digits in a portion of their name, they'd have their name rejected by our validity check even if the name they were submitting a form with was itself valid. Thanks to Nathan at Faithful America for reporting the problem!
  • We added a column actblue_id to webhooks_webhooknotificationreceivedlog to make it easier to identify which ActBlue orderNumber a webhook is associated with, without having to parse the JSON. You can use the new column by joining webhooks_webhooknotificationreceivedlog.actblue_id to core_order.import_id.


  • We fixed a bug that occurred when you tried to cancel a scheduled mailing after it had already started sending. In this case you will now see a message explaining that a stop signal will be sent to the mailing to prevent it from sending. Thank you to Noa Nir at JStreet for reporting the problem.
  • We fixed a bug where you could un-check Separate Name Fields after selecting delivery via Communicating With Congress (CWC) which requires a separate prefix entry. Thanks to Danne Woo at Color of Change for letting us know about the problem.
  • Recently-added deliverability warnings have been tuned to avoid sending alerts for smaller mailings which have a high rate of false-positives.


  • We fixed an issue where copying a texting broadcast would fail to copy targeting of any query library queries.
  • The user edit screen shows a user's texting number if they have an active texting subscription. Phone numbers that are currently subscribed to texting must be unsubscribed before being edited.


Deprecations and heads-ups

  • We'll resume applying the 90-day retention policy on the core_open_raw table. We announced this policy when we initially released the feature, but have not been dropping old data for a while. This does not affect the main core_open table, only the core_open_raw table that includes false opens from Apple Mail Privacy Protection.
  • Google is sunsetting its Universal Analytics product July 1st. We've replaced the "Google Analytics" setting on the Config screen with a new "Analytics Tag Code" setting that accepts any HTML you'd like added to all your ActionKit pages. We're automatically patching templatesets in ActionKit to support the new setting. If you maintain your templateset in a GitHub repository and you want to use this new setting, you'll need to manually add the snippet {%verbatim%}{{ analytics_tag_code|safe }}{%endverbatim%} to your wrapper.html.
  • The legacy XML-RPC API is now turned off for the vast majority of ActionKit clients. If you're among the few still using it, we've reached out about transitioning off.
  • In response to client feedback, we now email you about mailings that run into 5% bounces or delays, but no longer notify at the 1% level. The lower-level alerts, which often relate to problems that are transient and low-impact, are still visible in the mailings list and on the mailing-report screen. We'll continue fine-tuning this feature over time.

ScorePool List Health

We've added list health statistics to instances opted into ScorePool. You can see the average score of users you've mailed in the past 30 days and how that compares with a benchmark calculated by looking across participating ScorePool clients. This is only one part of your deliverability picture, but we think it's useful information for you to have. You can access it through Mailings > List Hygiene (in the right-hand menu) > ScorePool List Health.

We'll also now calculate list health scores for your uploads, and tell you whether they're above or below your average for recently-mailed users. Although high upload scores do not guarantee success, we hope this feature can help you spot some bad or mistaken uploads before you mail the problematic audience.

Bug fixes and improvements


  • We added sections for "Pages I've Created", "Mailings I've Created", and "Texts I've Created" modeled off our existing "Reports I've Created" section. You can find these near the top of the screen of each of their respective tabs. Thanks to Alli at the British Columbia NDP for the inspiration!
  • The snippets menu now correctly word wraps for snippets with long names. We also fixed an issue where the snippets menu was no longer showing an indication that it could be resized. Thanks to Phillip at for letting us know about the problem!
  • The search box in the admin header now searches more broadly on the notes and description fields of pages, mailings, and reports, to make it more likely you find what you're looking for.
  • We fixed an issue where the bulk edit feature would lose track of an active advanced search. Now the advanced search stays in place after the effects of the bulk edit are applied. Thank you to Andrew at Dream Corps for reporting this issue to us!
  • Maine state legislators all had the capitol switchboard listed as their office number in our vendor's data. We've switched to using the district-office number by default for Maine, which we expect to be more useful. Thanks to Nicole at National Nurses United for letting us know about the issue!
  • We made the height of some drop-downs in the admin more consistent with other inputs.
  • For staff members with limited permissions, we removed some stray links to things the user couldn't access, such as links to pages for users without page permissions. Previously these staffers could click these links but would only get an error page.
  • We fixed a problem that could prevent you from hiding a custom field if you tried to hide it from its edit form.
  • An upload with "autocreate user fields" enabled can sometimes fail because it would create a new custom user field whose display name (not short name) conflicts with an existing field's display name. We now show a clearer error in this situation. Thanks to Amy at Win Without War for reporting the problem!
  • In the uploader, we've refreshed the design of the page shown after an upload completes.


  • When you paste an image into a visual editor, ActionKit now tries to preserve uploaded image file names rather than always renaming files. Thanks to Jordan Krueger at Win Without War for the suggestion.
  • The mailer tries to detect when you paste in a link that already has an akid= in it, but that previously would miss akid's that were URL-encoded. We've made the check more robust against that. Thanks to Anna from Mothership for letting us know about the problem!
  • We fixed a problem that could prevent you from getting mailing proofs of scheduled mailings. Thanks to Mike working for Kamala Harris and Julie at 350 for letting us know about it!
  • We fixed a problem where if you've hidden a mailing list in use by one of your unsubscribe pages, you wouldn't be able to make changes to that unsubscribe page. Thanks to Andrew at Dream Corps for reporting the problem!
  • The include and exclude selections for mailings no longer list the mailing you're currently working on as an option, since that would create a loop.
  • We fixed a problem that could prevent mailing query timings from showing up in "SQL and Query Times" view in some situations.
  • If you renamed your "People Who Recently Received a Recurring Series" query, you could receive incorrect warnings when setting up recurring mailings. Now we'll check for the "recently_received_recurring_mailing" report short name instead of the title. Thanks to Andrew at Dream Corps for letting us know about the problem!


  • Periodically, Google will force you to re-authorize ActionKit to be able to successfully Export to Google Sheets. Now, instead of showing you an error message, we'll show you the authorization screen so you can export. Thanks to Kate at Women's March and Brett at the British Columbia NDP for letting us know about the problem!
  • We fixed a bug where sending an adhoc query that started with SELECT followed immediately with a newline would be rejected. Thanks to Third Bear for the report.


  • If you create a survey question with a radio select, checkboxes, or similar, but don't provide any options, we'll now show a clearer error message that indicates you'll need to provide options in order to save that question.
  • We fixed a problem where a survey question's textarea field could be wider than its container if you had a lot of columns, especially on mobile. Thanks to Eloise at Stand Up America for letting us know about the problem!
  • We've made an update to our PayPal integration to make it clear that the donation will be completed as soon as the user clicks "Complete Payment" with no additional review step. Thank you Rachel Hubbard at for the report!
  • We fixed a problem where an extremely long URL in an Image custom field would overflow, breaking the layout on some screens. Thanks to Jordan at 350 for pointing out the problem!
  • On the Event Moderator search screen, if you entered a location but forgot to enter a radius, no results would be returned. Now we'll use a default of 20 miles if your radius is missing.
  • If an event moderator searched for events in Canada, we'll no longer display a "Subscribe me to email updates" consent checkbox meant for other types of pages.
  • Event moderator search is much more likely to find a non-US event by city, region, and/or postcode.

API and Advanced Usage

  • When creating transactions with the REST API, we now automatically set amount_converted if you don't provide it. Thanks to Carl at The Intercept for the report.
  • We improved the message for REST API errors due to passing data as an unexpected type, such as passing a postcode as an integer instead of a string.
  • The {%verbatim%}{% required_parameter %}{%endverbatim%} Django template tag now supports min and max keywords for "number" parameters
  • The {%verbatim%}{% remember %}{%endverbatim%} Django template tag now supports using Django filters to help compute the value to be remembered.
  • We've fixed a couple of dead links to "custom action fields" in the documentation. Thanks to Jase at 350 for reporting!


  • You can now send yourself a proof of a text broadcast even if your number is not subscribed to the list.
  • The texting tool now uses a single texting list instead of multiple. Multiple texting lists could make it easy for supporters (or staff) to end up confused about a number's subscription status, which is risky given carriers' strictness towards text spam. In place of texting lists, we recommend segmenting your texting list via user groups, custom fields, or other methods.
  • Choosing the confirmation text message for an action page now uses a simple dropdown, instead of offering the option of adding multiple confirmation messages.


Deliverability Alerts

To help identify potential deliverability issues sooner, we've added more notifications when mailings encounter elevated (1%) or substantial (5%) bounces or delays.

When mailings see a bounce rate over 1%, we add a notice in the app and send an email to the staffer that sent the mailing. You'll see an informational notice for mailings with bounces or delays between 1% and 5%, and a warning when either figure exceeds 5%.

Where the admin shows sent mailings, we'll also note that a mailing is experiencing elevated bounce or delay rates. Clicking these links takes you to the bounce/delay metrics report for that mailing:

We're also now storing more historical deliverability data. 90 days of raw data regarding bounces and delays will be stored in the database table core_message_event_raw.

In other mailings news, the built-in "Your Organization" from line has been replaced with one that uses your organization's actual name.

We also fixed a display error where mailings that were sent 15 or more days ago and also had mailing targeting summaries would incorrectly say they didn't have a targeting summary.

Salesforce Payload Templates

We've made changes to the Salesforce sync's method of generating sync data to send to Salesforce for users, onetime and recurring donations, and payments towards recurring donations.

We now use templates to generate JSON objects that are used for API calls to Salesforce. The templates can be found from the Salesforce Integration Settings page.

The templates are used for sync'ing data to Salesforce, not for sync'ing from Salesforce to ActionKit.

While the sync's behavior is largely unchanged, there is a difference in the user<->contact mappings in ActionKit. Previously we would add a mapping for every contact that matched a user's email, even though we'd only actually sync to one of the contacts. With this change we only add a mapping for the one contact.

We've also changed the "Sync User" option on the user profile page. It now triggers a sync of the user via the bulk API, making it easier to debug changes to the user sync template. We plan to expand this to also sync the user's opportunities and recurring donations.


We've expanded support for MMS in our texting beta. On the user "texting" page, staff now can send also send MMS texts with images. Staff users see a simulated view of what each user sees in a conversation view.

We now also handle incoming MMS messages received from users.

We fixed several queries in the Query Builder that relied on when a text message broadcast was queued/started/finished at.


We added a report named "User Merge Candidates" that recommends users to merge based on matching phone numbers.

The "standard" query report template now has sortable column headers. Clicking on a column in a report result will sort the results by the values in that column.

Other Bug Fixes and Enhancements

  • We fixed a bug in our new upload undo system that could leave some users wrongly subscribed after undoing an upload. Thanks to Kristin Peña from PFAW for the report!
  • We fixed an issue where "advanced" search criteria for users, mailings, and pages would be lost if you chose a different ordering from the drop down menu. Thanks to Rachel at for reporting this to us!
  • We now check user names for long strings of numbers. If a name or address1 field contains a long consecutive string of numbers, the user will be asked to correct it.
  • We fixed a bug where petition batch delivery proofs included a PDF despite a delivery job configured to only send CSVs. Thanks to reports from Rachel and Atiya at



Development on ActionKit's texting system continues:

  • Our text messaging feature now includes support for MMS!
  • We have renamed "Automatic Responses" in Texting to the more common "Keyword Responses" terminology for clarity.
  • To facilitate collection of texting addresses, we've added an option to require the texting opt-in box to be checked to complete a signup form.
  • Admins are now able to send ad hoc SMS replies to individual users. From the Users>>Texting menu, you can either type an entirely custom message, or choose from the list of auto-response messages you have already written.

Contact us if you're interested in signing up for the texting beta.


ScorePool now includes shared bounces. This means when a user hard-bounces for one ScorePool member, that bounce is shared with all participating ScorePool sites. This sharing happens daily and has been running for a couple weeks now. We hypothesized that this would lead to lower bounce-rates for ScorePool clients and preliminary results back up that prediction: we're seeing approximately 20% fewer bounces for ScorePool clients! This should be a nice boost to deliverability as bounces are one of the key statistics that ISPs use to determine how they treat your messages.

If you're not using ScorePool and are considering joining this free program you can read more about it here.

Webhook Fix

We fixed a nagging issue with webhooks: an update at Amazon AWS permits push endpoints to send a correct "Content-Type: application/json" header. This allows integration with Airtable and fixes issues with other frameworks. Existing endpoints won't be updated automatically, but all you need to do is re-save the endpoint from the admin to switch it to sending application/json.

Thanks to Third Bear for and Alicia at Be A Hero for reporting the issue!

XML-RPC Deprecated

We disabled the XML-RPC API for everyone but clients who have used it in the last 60 days. The XML-RPC API will be removed on July 1, 2023. Please contact support if you need emergency access or help migrating your existing integration to the REST API.


  • We fixed a problem where recurring donations made through ActBlue who had their amounts increased before a cancellation wouldn't be correctly marked as canceled_by_user. We fixed a similar problem affecting split recurring donations across multiple candidates. We'll also fix existing records affected by this. Thanks to Benjamin at Indivisible for pointing this out!
  • We'll now correctly mark recurring donations profiles that originated in ActBlue as completed once they've run their course. Thanks to Benjamin at Indivisible for the bug report!
  • We fixed a problem which affected REST API report calls using the CSV and TSV formats. Previously these returned generic 500 errors without useful error messages. Now they will return 400 errors and the body of the response contains a useful error describing what went wrong in CSV or TSV format.
  • We fixed an issue in Query Builder that would suppress non-donors when filtering by highest donation.
  • We fixed an issue in the admin where uploading an image using the plus ("+") button for a custom field or from the page followup sharing section would not populate the original input with the results. Thanks to Brett at BCNDP for reporting this!
  • We made some changes to speed up builds for mailings targeting lots of user tags. Thanks to Jenn Sturm at MoveOn for reporting.


Release Notes


We added a new option intended to help improve your mailing performance and inbox placement: Sort by Engagement Level.

This can help improve deliverability and inbox placement by delivering to your most-engaged users first and your least-engaged users last. This option is only available for clients enrolled in ScorePool, a free, opt-in system that assesses how likely your users are to engage with your mailings in the next 30 days.

More options for "Also Include" targeting

We're pleased to offer an improvement that nearly everyone has requested at some point: query reports in the "Also Include" section of the mailer targeting screen. This allows you to use the query library in a separate group of users that will be combined with your main includes using boolean "OR" logic.
In addition to query reports, you can also now use custom action fields, custom user fields, and custom event fields for targeting in the "Also Include" section.
For texting users, we've added support for custom action fields, custom user fields, and custom event fields (inside the event campaigns section) to the targeting screen for broadcasts.

Bounce/Delay Metrics updates

The Bounce/Delay Mailing Metrics screen has been improved with the addition of a deliverability report grouped by Mailbox Provider.

The new "Deliverability by Mailbox Provider" alerts you to any deliverability problems which may be imposed on your mailings. Sometimes, the effects of such a penalty are more difficult to notice when only looking at a single domain. By zooming out to a whole set of domains run by the same company (Microsoft, Google, Comcast, etc.) you have a powerful tool to identify and remediate potential problems sooner.

You can click to sort by messages sent, bounces, or delay:

Furthermore, it is now possible to download a detailed report at any time. Previously, this report was only available if AK detected a potentially significant problem.

We’ve also added proactive warnings to the individual mailing report and bounce/delay metrics screens. This latest change smartly alerts you to a potential deliverability issue as soon as it becomes evident in the data from Sparkpost.

Soft Bounce Handling

A new configuration option has been added to ActionKit. Via the configuration menu, you can edit a new set of options under the heading "Soft Bounce Handling." If this new option is enabled, email addresses which have resulted in multiple soft bounces in a set amount of time will automatically be unsubscribed. This new feature will have a positive effect on your list hygiene, overall sender reputation, and deliverability.

More Mailing improvements

  • We added the summary_mailingvariation database table which has performance data for your mailings by their variations. If you haven't checked out our easier-to-use A/B tests for mailings yet, you're missing out!
  • Users who unsubscribe using the functions of their email program, instead of the unsubscribe link in your message body, will no longer be recorded in AK as having reported your message as spam. In the core_unsub_email table, these requests will be correctly identified as type='unsub'.
  • We’ve improved the error message for from lines with snippets that cause errors, so it’s more clear what went wrong.
  • We fixed the query status for mailing drafts so it won't display as "failed" when it restarts a build due to a targeting change. This was most recently reported by Marisa at J Street.
  • We changed various report column headings to specify HARD Bounces (as opposed to the more general "Bounces"). ActionKit only reports hard bounces (not soft bounces), and this change will (hopefully!) make that more clear.
  • We made improvements to the documentation of the individual mailing report to clarify the contents of the "Unsubscribes and Bounces" table.


For groups in our beta test of ActionKit Texting, we have several new features rolling out in this release:

  • We’ve added a new report, Texting Progress Report, to make it easier to track your texting list size and broadcast text performance over time.
  • You can now import users with texting subscriptions via an import page.

  • User merging will now also merge texting phone numbers and text list subscriptions. The user merge tool can be used to consolidate text-only users and regular email users into a single user record for better communication and tracking.
  • On the texting proof-and-send screen, we will now prefill the last mobile number(s) you entered to receive proofs.

SalesForce Integration

It's now possible to customize the user email mapping in the Salesforce sync. This mapping is used for data sync'ing AND matching users to contacts. Changing the Salesforce field to anything other than Email will lead the sync to ignore all other email fields, including Email and Preferred Email. For example, changing the Salesforce field to Alternate Email means that the AK->SF sync will only look in Alternate Email for matches, and will not set any other email fields. And, only contacts with an Alternate Email will sync to ActionKit.

Note for established users of the sync: changing the mapping will interrupt the sync of existing users where user emails aren't found in the newly mapped field.

We also made a few other changes to the Salesforce sync:

  • It's now possible to manually trigger a Salesforce sync from the ActionKit admin. From the new "Sync Status" page in Salesforce Integration Settings, select Toggle Sync to disable auto-syncing and then click Manual Launch. Thanks to Third Bear for the request.
  • We fixed a bug that'd allow some recurring payments to sync to Salesforce when the recurring payment sync was disabled. Thanks to Michael Sherrard at FirstLook for the report.
  • We fixed a display bug in the Salesforce sync admin that listed the wrong ActionKit field for the Opportunity amount mapping. We now display order.total_converted as the ActionKit source field. Thanks to Jase at for reporting.


  • We've updated state legislative districts and targets for all US users. User's districts are for their current representation which may or may not have changed since 2022 Census redistricting, depending on specific state legislature terms and election years. We have spot-checked for correctness but please let us know if you see a district that looks wrong to you!
  • We fixed state senate districts for users in some places that were incorrectly using old boundaries. Thank you to Vic at Everytown for calling the issue to our attention.


  • We updated the version of the Braintree SDK that we use internally. We don't expect any differences, but please let us know if you are having any trouble with Braintree donation pages. Thank you to all the folks who wrote in to let us know about the deprecation!
  • ActBlue donations with shipping addresses will now have the address saved to custom action fields. Thanks to Sophie at MoveOn for the request.


  • Query Builder now supports querying Users by VAN ID. Thanks to Bryan at Represent.Us for the request.
  • We've added a status dashboard for the EveryAction integration, accessible from a new "Status Dashboard" tab in the EveryAction Integration Admin.
  • We replaced links to an old version of the Django docs with links to the version we're currently using. Thanks to ActionKit alum Simon for the reminder!
  • We fixed a bug that was preventing timezone parsing from working correctly in uploads.
  • We fixed an API bug that created duplicate hidden objects.
  • User edit pages now show MPs for UK and Canadian users when available.
  • The UI for Searching and browsing in ActionKit has been changed to clearly indicate when it is in the middle of a search.


Release Notes

Announcement: Shutting down the XML-RPC API

We will shut down the old, deprecated XML-RPC API this year. Starting April 1, we’ll restrict access to current users, and on July 1 we will close it down for all users. The REST and Push APIs will remain intact and available for use. If you have an integration with ActionKit using the XML-RPC API and need help moving it over to the REST API, please reach out to us on support as soon as possible.

Bidirectional Integration with EveryAction

Our integration with EveryAction continues to improve with the addition of reverse sync. Changes to contacts in EA now will create and update the related users in ActionKit. We've also added a "donors-only" mode for the EA reverse sync, which only creates new AK users for EA Contacts who just donated.

EveryAction Sync is now bi-directional


On March 7 we're enabling an exciting new feature in ScorePool - shared hard bounces. When a mailing returns a hard bounce, all other ScorePool participants with that email address subscribed will also record a bounce. Hard bounces happen when an email address is permanently unreachable and hard bounces contribute negatively to your sender reputation, which means this system should help improve deliverability for everyone participating in ScorePool.

Not part of ScorePool and have questions about joining? Write in to support today!

Targeting by Activity Levels

We added a new feature that allows you to match users based on their recent engagement history and mailbox provider, in order to target mailings. This is commonly used to exclude inactive users.

Before this feature was added, it was common to create a report that checked a user's email domain and a list of criteria for that user's recent activity levels, like how recently they opened or clicked a mailing. We've included 365 Day Non-Openers, Non-Clickers as a built-in that you can copy and remix as you like.

Activity Levels by Mailbox Provider


  • If the actual text of your custom action field or custom user field contains a comma, you can now use your field in your mailing's targeting by wrapping quotes around it. (Without the quotes, we'll assume it's two separate values). Thanks to Courtney at Color of Change for the report.

Use quotes around your custom fields that have commas in the actual values

  • We'll now warn you on the Proof and Send screen if you try to send a mailing whose targeting was last built more than 24 hours ago. Usually this comes up when you have a scheduled mailing that you change to send immediately and forget to rebuild it before sending. You can still send to the old set if you want.

Warning that appears if you haven't built your mailing set recently

  • If you specify a list of user IDs or emails that you want to receive proof mailings for, we'll send exactly that many proofs to you, even if you have a different number chosen for "Send Proofs." Thanks to Dominique at Pollinis for the suggestion!
  • We've changed how we classify spam-clickers in ActionKit. Previously we would record a bounce when a previous spam-clicker was mailed again in some circumstances. This has been corrected and bounces now only represent cases where the member's email is permanently unavailable.
  • We fixed a bug with scheduling mailings whose targeting contained an include/exclude loop with another mailing. The bug could prevent the other scheduled mailings from going out. Thanks to Samuel at RepresentUs for reporting the problem. We also fixed an error that happened when trying to hide mailings with targeting loops.
  • We fixed the preview of delivery times for mailings sent to deliver by timezone to properly sort by delivery time. Thanks for Keith at PCCC for the report!
  • The mailer no longer rejects links using the sms: scheme to trigger text messages, although client support for this scheme remains spotty. Thanks to Lincoln at Aisle 518 on behalf of Cheri Beasley for the report.
  • We've fixed a bug where we would incorrectly allow you to blackhole domains with non-ASCII characters. ActionKit cannot email addresses with non-ASCII characters in the domain so there is no need to blackhole them.
  • We fixed a problem with the information about custom fields displayed on the Email Wrapper editing page. Thanks to Third Bear on behalf of Dream Corps for reporting the problem.


  • RECAPTCHA challenges now work even if you are trying to protect multiple forms on a single page. Thanks for Courage California and Their World for the feature requests, and special thanks to Third Bear for suggesting a workaround.
  • We improved the performance of admin pages for clients with many "Always Show" custom fields.
  • We fixed a problem where an invalid payment account could be set on an order using the uploader. Now all uploaded payment accounts much exactly match your configured accounts.
  • We made some changes to our widget embed code to support multiple widgets being embedded on a single page without needing to make any changes to the generated HTML. For example, this would let you embed a signup form in your header and footer, without needing to customize the widget embed code. Thanks to Sara at FreePress for the request!
  • We fixed a problem where if you had a multilingual campaign with multiple pages but only one language, we wouldn't combine the actions toward the shared goal when calculating the thermometer's progress. Now we do -- thanks to Rachel at 350 for the report!
  • Progress thermometers for actions and users now only count actions with the complete status. Previously incomplete, failed and spam-blocked actions were counting towards the total. Thanks to Dominique at Pollinis for the request.
  • We fixed a problem where customized templatesets with non-ActionKit forms could in rare instances cause validation errors on the form. Thanks to Aili at MoveOn for the report!
  • We fixed an issue where the link on the After-Action page to add another Sharing Image would generate two popups. Thanks to Brett at BCNDP for letting us know!


  • We changed the way the "Compare Mailings" report calculates unsubscribes. It will now show the number of user unsubscribes, separate from bounces and spam clicks. This change was also made for the unsubscribe statistics in Query Builder mailing reports.
  • We fixed a problem with how the Query Builder constructed Donation queries that used a User Group filter which could lead to double counting donations. Thanks to Nick at the NDP for letting us know!
  • We've added two new tables - core_transactionalmailingopenraw and core_transactionalmailingclickraw which store all opens and clicks. The existing tables (core_transactionalmailingopen and core_transactionalmailingclick) will now only get non-machine opens and clicks, just like core_open and core_click do now.
  • We fixed a rare problem where if a user had ALL of their actions deleted, marked as spam, or were on a page with "Include In Reports Of Member Actions" unchecked, they wouldn't get their action counts on their summary_user record zeroed out. Thanks to Alex at MoveOn for the report!

Text Messaging

For groups in our text messaging beta test, you can now send text messages after a user action. You can choose an existing after-action text message, or create a new message, which will be automatically sent to subscribed users after they complete an action. You can find this option in the after-action step when editing your page.


  • We fixed an issue which caused errors in the REST API when patching recurring orders with a blank exp_date or card_num. Thanks to Lee at MAIG and Brandon at Mercy Corps for reporting this to us!
  • We fixed an issue in detecting support for Braintree donations for template sets using {% verbatim %}{% includes %}{% endverbatim %} or {% verbatim %}{% extends %}{% endverbatim %}. Thanks to Carl at FirstLook for letting us know!

Other Bug Fixes and Enhancements

  • We restored confirmation alerts when hiding or copying pages, reports, and mailings, or stopping mailings. This should make mistakes a little harder to make! Thanks to Nate at MomsRising for letting us know that they went missing.
  • We fixed a bug when a petition with emoji in the statement was used with Communicating with Congress. Thanks to Sara at FreePress for reporting the problem!
  • We added checks for ID columns in merge files which will detect when you accidentally include values that are zero, non-numeric, or too large (over 2147483647).
  • We fixed a rare issue where a user could wind up with duplicate international division records. Thank you to Kirk with NDP for reporting it!
  • Staff users' "last login" will now be updated for API usage. Previously, last_login would only be updated when a staff admin user logged in via the login form. Thanks to Amy at MoveOn for the suggestion.
  • Users with email addresses at the domains and no longer get subscribed to lists.


Release Notes

New Reputation Protection

On the Mailer Targeting Defaults section of your CONFIG, there's a new option to exclude typo domains from your mailing sends. We've enabled this by default for everyone. We strongly recommend leaving it checked so you don't send to obvious typo domains, which can hurt your sender reputation since these always bounce.

More informative scheduling

When scheduling a mailing to be delivered at a particular time of the recipient's day, the Recipient Times Breakdown report will now differentiate recipients for whom we do not have an accurate timezone, due to lack of locational information.

We've also found and fixed an error on this screen: When preparing a timed send, a report could incorrectly say we would mail some users immediately; we've fixed that. Thanks to Nicholas at Canada's New Democratic Party for the report.

Better payment provider integration

  • Changes to Paypal recurring donations are now synchronized bi-directionally. When a user or admin changes the amount of a recurring donation on the Paypal side, that change is automatically pulled into ActionKit. Thanks to Marie at NRDC for the suggestion.
  • We fixed a problem where if a user cancelled their ActBlue donation within ActBlue and later requested a refund, that refund wouldn't be correctly synced to ActionKit. We've also fixed the small number of affected records. Thanks to Lee at Everytown for the detailed bug report.

Mailer enhancements

  • We've added the projected count for the winner of automatic subject line tests to the count display, to help prevent accidentally targeting a different group than expected with your test. We also changed the way that excludes operate on automatic subject line tests so that they will exclude both the test users and the final users. This allows you to use your automatic subject line test mailings with autoexcludes without worrying about your target users get stolen by other mailings sent between the test and the final mailing.
  • Stopping a mailing job now records who stopped the job. Thanks to Kinza at Beasley for the suggestion.

Other Bug Fixes and Enhancements

  • We updated the calculation for summary_user.last_donation to exclude reversed donations. Thanks to Alex at MoveOn for the suggestion.
  • A small JavaScript change was added to the donate.html template in the sample template set to prevent users from double-submitting donation forms. This has not been automatically applied to your customized templates because of the risk of breaking a live donation page. You can see the diff for this change at
  • We fixed a situation where summary_user.last_click and the built-in reengagement_clickers report could incorrectly count a new user as having a click from a mailing. This could occur if an existing user clicks from a mailing, isn't recognized, and then enters a new email address in the form. You may see a bump in users added to the reengagement list or excluded by your inactivity queries because of this change. If you've customized reports using core_click, you can add `link_number is not null` to filter out spurious mailing clicks.
  • We fixed an error that occurred when the name of an "Always Required" custom form field included a forward slash. Thanks to Taurjhai at ColorOfChange for the report.
  • When deactivating a staff user, we've added a warning that this will disable the user's MySQL database accounts too.


Release Notes

Mailbox Provider

We added a new mailbox_provider column to the summary_user table which you can use for targeting and reporting by ISP. Hotmail and Outlook users have the value ms, for example, and Yahoo and AOL users have the value vmg. If you don't see this column populated immediately on release, we may still be backfilling data; check back later this week.

Mailing Donation Snippets

We've optimized the mailing donation snippets to improve the sending speed of mailings that use them. We also improved the speed of the tag_links filter.

Two additional donation snippets have been added for working with both one-time and recurring donations at the same time: donations.highest_previous_all and donations.average_all. You can find them in the snippets menu under Donations.

Template Status Display

The list of templates in a templateset now includes the name of the last person to edit each template and if there's a draft version it includes a link to view a diff of the draft changes.

Conditional After-Action Emails

Sometimes you may want to send an after-action email only if certain conditions are met, like the user checked a box on your survey that requires follow up. Now you can use tags in the subject that result in a blank subject when the condition isn't met. The email will only be sent if the subject is not blank. (This is also supported for notification emails, but didn't work for after-action emails until now.) For example:
{% verbatim %}{% if action.custom_fields.volunteer == "Yes" %} Thanks for volunteering! {% endif %}{% endverbatim %}


  • We've added a typo_domains report; if you set it as a mailing exclude, you'll exclude users at about a thousand valid-but-usually-mistaken domains like; we might add more domains in future updates. You could also use it for a one-off unsubscribe of those users. Thanks to MoveOn, Mothership Strategies, and others who helped with this.
  • Some client instances were missing the Countries mailer targeting default. If you find you're often adding one (or more) countries to your targeting, you can set this once in your config and it will show up in every mailing by default.
  • When a recurring payment failed at PayPal it would occasionally appear in ActionKit as a transaction of type unknown. Now it will appear as an unsuccessful sale transaction. Thanks to Tatiana and Lee at Everytown and Eric at The Intercept for reporting the problem.
  • Webhook pushes triggered by actions will now include a JSON representation of the page that the action took place on. Thanks to Third Bear for the request.
  • Email notifications about canceled automatic subject line tests have been changed so they are easier to notice when scanning your inbox. They will now look like this: CANCELED: Automatic Subject Test for Mailing "Free Ponies" (17920). Thanks to Jordan at CampaignHelp on behalf of Moms Rising for the suggestion.
  • We've connected existing MySQL accounts to staff accounts with matching emails so that you can reset your password from your staff account page if you need to.


Release Notes

Target Audience Comparison Tool

We've added one more resource to help you better understand your target audience for each mailing. Once you build your mailing's targeting set, we'll calculate statistics so you can see how your intended recipients compare to subscribed users on your list who have received mailings recently.

Under Targeting on the Proof and Send screen, you'll see how long it's been on average since your audience's last open.

Click through for more detailed information on the new Compare Mailing Set screen.

This can be especially useful for protecting against mistakes. The findings should generally be in line with your intent. If you're targeting a random sample, you're likely to get average results. If you're targeting actives, your mailing set is likely to be better than average on most stats, etc. If the results are surprising, check your targeting!

You can read more in the docs tomorrow:

Other Mailings Related

The confirmation screen for Timed Sends will now use the Staff User's time zone setting, as opposed to UTC. This makes it much easier to quickly understand when a mailing will be sent to your users. Thanks to Keith from PCCC for the suggestion!

We fixed an issue with mailings that include or exclude each other that sometimes resulted in unnecessary waiting between builds when many mailings were being rebuilt at once.

Raw SQL and Query Library queries in mailing targeting now run on a replica server. This keeps ActionKit performing better on busy mailing days, but these queries may sometimes see delayed data like reporting queries do.

We fixed a bug where copying an old mailing that was used for event recruitment could result in your mailings not showing any upcoming events. Thanks to Audrey at Middleseat working for the Beto for Texas campaign for the report!

"Mailbox full" bounces are now recorded in the table core_bounce_soft, which you can use for exclude queries, and email addresses with invalid domains like gmail.clm are now bounced from your list when you first try to mail them. Thanks to and Mothership Strategies for the suggestions.

More ActBlue Sync Improvements

We updated the status for recurring profiles cancelled in ActBlue from "cancelled" to "canceled_by_user" to be consistent with our other cancellation statuses. If you have any queries that use core_orderrecurring.status, be sure they look for 'canceled_by_user'.

Previously, records in core_actbluetransactiondetail had created_at set to the date and time that the webhook was handled. For backfilled records, that incorrectly assigns the time of the backfill instead of the date of the transaction. Now, we'll set the created_at value correctly and we've fixed any incorrect old records.

Donations with bad zips coming from ActBlue will not be skipped in future; instead we'll ignore the bad zip and record everything else as usual.

We now record the country name sent by ActBlue to core_order_user_detail for ExpressLane donations. We were pulling country name from core_user. This sometimes led to invalid country names in that table which can break the ActionKit to EveryAction sync. Thanks to Lee at Everytown for reporting this issue and the one above!


Updates to summary_user.last_mailed and summary_user.last_raw_open are now performed daily, to reduce load on the database.

We added new options to the Query Builder to take advantage of the fast summary_user table. Thanks to Brandt at New Blue Interactive working for 314 Action Fund and others for the suggestion!

We fixed an issue where users who did not have any actions within the last 365 days could have an old, outdated value in their summary_user.actions_last_365_days field. Now, we'll update this during the weekly rebuild of the summary_user table.


  • AK now prohibits a recurring order from being associated with the same order_id as an existing recurring order.
  • We've fixed a bug that could result in a US user with state set but not region, and zip set but not postal. We'll be running a script over the next days to correct existing data. Thanks to Paullee at Everytown for reporting the problem.
  • You can now send both an akid and email when processing an action using the API. Previously, if both were sent we'd drop the akid, preferring email, because we'd assume that it was a forwarded link. But that wasn't always true, and it could result in some actions not being correctly associated with their mailing. Now we'll associate the mailings correctly. Thanks to Brandon at Mercy Corps, Bianca at 350, and Tim at AllOut for the reports!
  • We fixed an issue where concurrent mailing subject autotests could conflict and prevent sending, or cause incorrect notifications to be sent to admins. Thank you to Claudia at DSA for reporting the issue!
  • We've removed the obsolete core_backgroundtask table, and the column core_petitiondeliveryjob.backgroundtask_id which was a foreign key to it.


Candidate donation handling with ActBlue

In this release, we've added a checkbox to indicate which candidates are "yours"/associated with your organization. We automatically check the box for the candidate with the highest number of contributions for any given ActBlue page, but you can change this from the Candidate Screen.

New options for viewing donations broken out by candidate are coming to a Query Builder near you soon, possibly even in the next release.

Thanks to Kenneth at Middleseat, Robin at Aisle 518, and others for requesting this and offering feedback!

Score Pool

We've improved the user interface for targeting users with ScorePool scores in the mailer. Not signed up for ScorePool yet? Contact support today!


  • We fixed a problem where mixed-case letters for custom user field names in a handful of clientscaused display problems on the User Overview screen.
  • We fixed a problem where the Visual Editor had problems switching to the Code Editor and back on the Email Wrapper screen. Thanks to James at No Dem Left Behind for the bug report!
  • Future assignments for Missouri Congressional districts have been loaded into core_usergeofield.
  • When you deactivate a staff account, we will also revoke MySQL database access if it's linked to the account.
  • The query builder uses colored borders around AND and OR filter groups to aid in constructing complex boolean SQL expressions. Thank you to Andrew at Dream Corps for the suggestion!


Mailer UI and bugfixes

  • We're working on improvements to the UI for inline mailing tests. Changes in this release include a cleaner UI and visual feedback when disabling a particular variation. More to come!

  • We added the limit to the Mailing Reports screen to better aid in comparing targeting. Thanks to Bianca at 350 for the suggestion!

  • UK and Canadian clients can put the name of the political district into mailings via the snippet '{{ target.district_name }}'

  • We fixed a problem where sometimes an email wrapper that was missing the content block wouldn't show the error message that it was missing the content block. Thanks to Brandon at Mercy Corps for the bug report!

  • We fixed an error preventing the display of the mailing web view for mailings with multiple subjects. Thanks to Sara at Free Press for reporting!

  • When saving mailer queries, we now enforce that first column is either id or user_id.


  • We've stopped subscribing ActBlue users with anonymous email addresses. Anonymous users are common for split fundraising campaigns and are identified in ActionKit with emails like `masked-<numbers>`. Previously these emails would be subscribed then bounce harmlessly.

    Thanks to Robin Curran working on behalf of Mandela Barnes for the request.
  • If a user's email address at ActBlue is different than the email address associated with ActionKit, we'll now record that as the donation action's referring_user_id, to better help you track down who gave what. As a result, you'll see fewer donations listed under "Subject unknown". We'll retroactively apply this change to existing ActBlue donations.

    We've had a number of requests on this, most recently Arthur Tarley at Middleseat on behalf of Lucas Kunce.

Reports bugfixes

  • The "Active Recurring Donors" mailer query report now includes past due recurring donations. It's now consistent with the Donation Querybuilder's definition of "active".
  • We fixed a bug in the User Querybuilder in which an "Excluded" donor filter could erroneously match users that hadn't given. Thanks to Nick Flynn at the New Democratic Party of Canada for the report.
  • We fixed an issue which prevented scheduling the original, read-only version of built-in reports. Thanks to Dutch at Free Press for reporting it!


  • You can now pass a date-time string with a timezone offset for most datetimes in our API. We'll now convert the time and store as UTC. Previously, passing a string like "2022-06-06T12:00:00+04:00" for a datetime would cause an error.

    Thanks to Aaron Ross on behalf of FirstLook for the request.


New Bounce/Delay Metrics Report

We've added a tab to the mailing report screen which gives you access to detailed bounce and delay data. To get to this data, click on a sent mailing and click on the "Bounce/Delay Metrics" link at the top of the Performance section. This will give you a report showing top bouncing and delaying domains with information about what's causing the bounce or delay:

A few notes about bounce and delay data to keep in mind:

Some bounces and delays are expected. Full mailboxes and network errors cause delays, and given the variety of ISPs and filters, even well-behaved senders will see at least a partial block at some minor ISP reasonably often.

If you see a major problem, first narrow your audiences. Try mailing only active users at the affected domain(s) for a week or so. If things don't improve after that and it's a major ISP, contact us so we can attempt mitigation.

There are no guarantees when we request an unblock. The ISP's customers are their users, not bulk senders. They could say no, fail to respond to repeated requests, or reinstate a lifted block after a short time if user behavior makes them think a sender's email is unwanted.

Change to ActBlue Recurring Donation Cancellations

We made some important changes to how we process recurring donation cancellations received from ActBlue to make them work more like cancellations from our other supported payment processors:

  • We'll no longer decrease the amount recorded in core_orderrecurring.amount upon processing a cancellation. Previously it was possible to end up with a negative number in the amount field after a cancellation.
  • We've added a recurring_order_cancel status to core_transaction upon processing a cancellation, so cancelled donations show up more consistently in reporting.
  • We've retroactively fixed old cancelled recurring donations from ActBlue to be consistent with the above.

Bug Fixes and Enhancements

We fixed a javascript issue which affected the display of target details for international target groups. Thank you to Rebecca at The Syria Campaign for reporting it!

We added new snippets recurring_last_amount and recurring_original_amount. These allow you to make mailings which consider any changes to a user's recurring donation amounts.

We fixed a problem where you couldn't use the orderrecurring.amt snippet in Confirmation Mailings, and had to use orderrecurring.currency_sym and orderrecurring.amount instead. Thanks to Aili at MoveOn for the report and the use case for these snippets!

We also added new mailing snippets to return the most recent donation, including both one-time and recurring donations - most_recent_all and most_recent_date_all. Thanks to Josh at Do Big Things working for Amy McGrath for the request!

We fixed a problem where searching for a mailing that was imported from another system could result in an error when trying to load the Mailing Report screen. Thanks to Sara at FreePress for the bug report!

We added a user's last raw open within the last 90 days to the summary_user table. Thanks to Cliff at the DSCC for the request!

Users may now build advanced search queries for rate fields and currency amounts using fractions of whole numbers, up to two decimal places of precision. Thanks to Andrew at Dream Corps for suggesting this feature!

We fixed a bug with automatic subject line testing that could cause a duplicate winner to send if multiple tests finished at the same time and one of them took a very long time to rebuild. Many thanks for finding this corner case to Theresa at Middleseat working for Beto for Texas!


Mailer bugfixes and additions

  • Link tracking now works for external links with variables in their domain or path, e.g.{{ custom_fields.page_slug }}/. The variables are evaluated for each user when the mailing is sent, and is secured to prevent tampering. Thank you to the many groups who have requested this over the years, including Moms Rising, Kamala Harris, Friends Committee on National Legislation, and Democracy for America.
  • We fixed a bug with mailing archives, which previously did not have the "subject" variable that's available elsewhere in mailings. Now they do -- thanks to Isidro at DSCC for reporting the problem!
  • We added a Stop button to the bottom of the Mailing Report screen, to make it easier to find especially now that searching for a mailing by its ID takes you directly to the Mailing Report screen. Thanks to David at ONE for the request!
  • We fixed a bug that affected pagination of hidden from lines in Firefox. Thanks to David at ONE for reporting it!


  • Redistricting: We've added new districts for Alabama, Arkansas, Connecticut, Florida, and Pennsylvania, and will continue to add new districts as they become available.
  • We fixed a problem where attempting to download many concurrent versions of the same report could sometimes fail.
  • We've been working on many important behind-the-scenes infrastructure improvements to make ActionKit faster and more reliable.


Suggested Settings

The CONFIG screen now links to seven settings we recommend every client use under the categories of Pages, Mailings, and Security. See if you're using them all!

Superusers will see a link to these suggestions at the top of the ActionKit Config screen.


We have fixed several issues with the amounts we store for ActBlue recurring donations, including the following:

  • A user who gave $20 one-time and was upsold into a $6 monthly donation would sometimes have their donation recorded as a $20 recurring donation when it's actually a $6 recurring donation
  • A user who changes their active recurring donation on the ActBlue side to give a different amount would have incorrect amounts recorded
  • A recurring donation split between multiple entities that has part of that donation refunded (often due to a candidate exiting a race) would be recorded incorrectly
  • Sometimes, a recurring donation being canceled would result in the amount being recorded as a $0 donation

In all of the above situations, we've identified the most recent 'sale' transaction as the correct, true amount of the recurring donation, and fixed old records. New records matching the above criteria will be fixed by a daily job.

Thanks to Anne working on behalf of AOC.

Bug fixes & Other

  • We've expanded the ScorePool documentation, including more information on how scores are calculated.
  • We now try harder to get browsers to pick up fresh JavaScript in the ActionKit admin when it's available. Thanks to Nabil at SumOfUs for the original report.

  • We've added Alaska's newly approved state house and state senate districts.

  • We fixed a problem where if your snippets menu was open, clicking "Save" or similar would interrupt your flow by closing the snippets menu and randomly scrolling you up a bit in the page. Now, we'll close the menu without any unexpected scrolling.



New district assignments are available for users in states with finalized 2022 district boundaries. New states will be added as they become available. This is the current list of available states:

  • Congressional Districts: AZ, CA, CO, HI, IA, ID, IL, IN, MA, ME, MS, MT, NE, OK, OR, UT, VA, WV
  • State Senate: AZ, CA, CO, DE, HI, IA, IL, IN, MA, ME, MI, NC, OK, OR, SD, UT, VA, WV
  • State House: AZ, CA, CO, DE, HI, IA, IL, IN, MA, ME, MI, NC, NM, OK, OR, SD, UT, VA, WV

The data about future districts is stored in the core_usergeofield table. To report on or target users in these future districts you can use SQL like this:

SELECT user_id
FROM core_usergeofield
WHERE name = 'us_district_redistrict2022'
AND value = 'CA_01';

Here are the options for
"us_district_redistrict2022": future US Congressional district
"us_state_district_redistrict2022": future state house district
"us_state_senate_redistrict2022": future state senate district

Note that state-level districts are 3 digits, just like the current state-level districts in core_location, e.g. "CA_001".

This information is also available in the documentation here:


  • The API now allows you to filter actions by the created_user and subscribed_user fields.
  • The API representation of Query Reports includes "targetingqueryreports", a list of linkages to mailings which use the report for targeting. Due to significant performance issues, this is now deprecated. In the next release, the list will be replaced with a link to a list of the reports's Targeting Query Report objects. Please contact support if you are concerned that your application will be impacted and need help with migration.


  • Mailing and subject line summaries now update every 10 minutes instead of every day. To take advantage, see the summary_mailing and summary_mailingsubject tables. Thanks to Kenneth working for the AOC campaign for the request!
  • The unsubscribe metric in Mailing and subject line summaries now only refers to user unsubscribes, not a total of user unsubscribes, complaints, and bounces.

Bug Fixes & Other

  • We fixed an issue where you could overwrite your files in the media library with empty files. Thanks to Jeffrey working for MarchOn for the report!
  • We fixed a bug that led to authenticated webhook endpoints showing as "unconfirmed" even after they had been confirmed. Thanks to Sean at Stand Up America for working with us on the issue!
  • We fixed a bug with the "ALL SENT" list on the mailings tab. It was not showing mailings that died before they started sending. Thanks to Nate at DSCC for reporting the problem!
  • Akismet spam filtering now works a little differently: ActionKit now checks for a suspicious IP address, header, or request content, and forwards suspicious requests to Akismet. This saves resources and should prevent some false positives, while still catching the spam. As always, if you're having problems with spammy submissions, contact us via Support.
  • SparkPost fixed an issue where VMG spam complaints weren't being processed for some groups. Thanks to Rachel McCoy and Jake Lipsett and Mothership Strategies for reporting.



ScorePool is a new tool that scores each of your subscribed users to predict how likely they are to engage via email in the next 30 days. You have to opt in to benefit from Score Pool.

Using machine intelligence, ScorePool aggregates user activity data into a shared cross-client pool.

You can use ScorePool scores in your mailing targeting and re-engagement queries. Scores can also be useful in dealing with deliverability problems , providing the ability to target a better set of users when an ISP has blocked or delayed your messages.

The data used by ScorePool includes opens, clicks, actions, and more, but it does not include personal information: no plain-text emails, no names, or addresses. The detailed activity data in the pool is kept private: only scores and statistics are shared.

Aggregating data across organizations helps deal with the loss of open data to privacy features like Apple's. Exact numbers vary by group, but our rough estimate is Apple's Mail Privacy Protection has reduced reported open rates 20-30%: what would have been reported as a 12-13% open rate mid last year is now reported as around 10%.

There is no cost to join ScorePool , but you do need to agree to permit the use of your activity data. Superusers can do this for your organization by clicking on ScorePool Signup in the configuration menu:
In future, we'd like to leverage these scores to power additional features like a list-health score and the ability to compare mailing sets and uploads by score to see the effects of targeting on expected engagement.

Original Templates on GitHub

We're now publishing the Original templateset to GitHub: TheWalkers/ActionKit-Original .

This repo is automatically updated with each release.

If you already work with templates in GitHub, we'd suggest forking this for your new templatesets. That'll make it easier to integrate future changes into your custom templatesets. You can do a pull request from the AK repo to your forked repo.

You can "watch" the repo to get notified of changes -- although release notes are always the best way to stay up to date!

Shareable Previews

We added a link to the preview pane to make it easier to share mailing previews with your colleagues. Keep in mind that although the preview pane itself may be showing you unsaved changes, this link does not. As always, you should use proofs to check your mailing with real data before sending. Thanks to Sara from Free Press for inspiring this change!


We added GeoIP location lookups to pages. The new snippets for country name and code, and whether the IP address is located in the European Union are available under "Other Info". There are additional items available in the page snippets documentation. Thanks to David at ONE for requesting this feature.

Minor additions and bug fixes

  • We fixed a problem where the GitHub templateset sync sometimes wouldn't apply commits properly in the preview branch. Thanks to Kalil at DSA for the bug report!
  • If you have a scheduled mailing that you want to make into a recurring mailing, you no longer have to click "or just send" to see the "or make recurring" link. Thanks to Kate working for Vote by Mail PAC!
  • We added a delete button to subject lines to make it easier to remove a subject line from a mailing. Thanks to Andrew at Dreamcorps for comments at ClientCon that lead to this one.



We're introducing a Push API that lets things happening in ActionKit trigger external programmatic processes. So when a user takes an action, we'll send details of the action and user to the web endpoint you specify. For example, you could use Zapier and to send donors a personalized thank-you postcard. Read more in the documentation.


  • We added a "Subscribe only if new to database" option for import pages. When you upload user data using this option, data will be added or updated as usual, but only users who are completely new to your database will be subscribed to the list you provide. Thanks to Kurt working for Demand Progress and Kenneth working for ACLU People Power among others for this idea.
  • If you make a mistake when importing new users and mess up their source, previously you'd have to update their source using the API. Now you can also update a user's original source in core_user with an import, using the "initial_source" column. Please be careful with this!


  • The core_click table filters out fake clicks generated by some email scanning services. We added a core_click_raw table that includes all clicks, including fake ones, for a limited period (currently 90 days).
  • We added new summary tables, summary_mailing and summary_mailingsubject, that include commonly-used mailing performance stats like opens, clicks, actions, donations, and unsubscribes, by mailing and subject. Right now, this table is updated nightly for the first 30 days after a mailing is sent, but we might change this schedule over time.
  • We added a count of how many rows your reports return to the top of your report results. Thanks to several people, most recently Harrison at Dream Corps for the request!
  • We added a link to the top of the Edit Report screen to run the saved version of a report. This helps you run reports without worrying you unintentionally saved changes to them.
  • Using certain report parameter names collided with internal variables, causing unexpected behavior. Reports using these reserved parameter names will now show a helpful error. You may need to change some parameter names to accommodate this, e.g. replacing "zip" with "zipcode".
  • Users of the background reports API should know that the "download_uri" provided for CSV and TSV downloads now redirects to an S3 URL. Most applications should work as before, but if you have trouble, make sure that your code follows redirects when downloading report results.

Admin Improvements

  • We added Copy and Hide buttons to the top of most screens. Thanks to Jin at The Social Practice and Jase at 350 for reporting!
  • If you are searching from the header sidebar and find only one page, mailing, etc., hitting Enter takes you directly to its edit screen, instead of to a one-item result list. Now that Copy and Hide are on edit screens as well as lists, we're hopeful that skipping the item list will almost always be what you want to do.
  • We added a button to help you get previews more easily. First, target your mailing. Once it's built, click the "Random" button under the preview pane to preview for a random user in your targeting set. Thanks to Virginia at Middleseat working for Justice Democrats for inspiring this feature.
  • Heads up: the login screen is changing! We've added links to helpful resources, blog posts, videos, and other documentation to the login screen, to help you get the most out of ActionKit.

Pages and templates

  • We added an option to the goal thermometer on donation pages to support donations made in their original currencies, not just converted to US dollars. Thanks to Kirk at Canada's NDP for the request!
  • When using the "Original Currency" goal, if you have donation pages that are part of a multilingual campaign, each page will now have its own separate goal. Thanks to Mais at the Syria Campaign for the request!
  • The language picker's links now preserve akid and other URL parameters.
  • If you just look at a Templateset's template code without making any changes, we will no longer show it as having "Draft" status. Thanks to Alli at MoveOn for the request.
  • We added a new filter, |number, to convert number-like text to a number, which is useful when using if statements. We're using this new filter to improve how quickly many of your re-engagement queries will run.
  • We've added suggestions to the docs on making existing templatesets more flexible to help avoid proliferation. Having fewer, more flexible templatesets can help you maintain a consistent look and save you maintenance work. A link to the docs on templateset management has been added to the confirmation modal for copying a templateset.
  • We fixed a problem where if you pushed several templateset edits from GitHub, and one of them contained an error, we'd throw out the whole bunch instead of applying your changes. Now we'll run our checks at the end.

Admin warnings and guardrails

  • We added some clarifying language to note that you can't do email delivery to the U.S. President, even though they appear in the Target Groups options. Thanks to Amy at Win Without War and others for reporting!
  • We added warnings not to use One-Click Signing and A/B Page Tests together to the Action Basics screen and the A/B Page Testing Dashboard. Thanks for David at for the report!
  • We'll now prevent you from using One-Click Signing with the Always Recognize Users feature. (You probably want Recognize Users Once if they haven't taken action.)
  • If you've already disabled the Send Immediate Email Override for petition deliveries, we won't make you triple-confirm that you really want that every time you make changes to that page.
  • The "YOUR ACTIONKIT TOOLS" section on the home page now hides any links to tools the user doesn't have permission to use. Thanks to Kathy at MoveOn for reporting the problem.
  • Our help-desk vendor does not support attaching very large files; now we'll prevent you from submitting those in the support form. If you have a video of an error, we'd love to see it, just please send a link!
  • In some circumstances, linebreaks in your support tickets could be lost, which we've now fixed. We like paragraphs! Thanks for Andrew @ Dream Corps for requesting the support improvements.


  • The Salesforce and EveryAction syncs will now include users whose custom user fields have been updated either by a User Updater or an import that uses "Skip Action Creation".


  • We improved the speed of the template history screen when many entries were present.
  • We've made a series of changes to improve how quickly the Templateset History page loads, including paginating your results.

Minor additions and bug fixes

  • In the REST API, you can now filter pages by whether they're included in reports of member actions (the real_actions column). Thanks to Third Bear working for for the feature request!
  • When merging users, you can now choose which user source to keep. Thanks to Brandt at New Blue Interactive for the request!
  • We updated dead links to recurring mailing documentation which had moved. Thanks to MoveOn for reporting it!
  • We fixed a bug where some user fields (like employer) would incorrectly not be associated with actions. Thanks to Kathy at MoveOn for the bug report!
  • When building a new report in the Query Builder, the re-engagement list will now be excluded when calculating totals of subscribes and unsubscribes. Thanks to Oliver at Demand Progress for the request!
  • We fixed a bug with 3-step navigation on donation pages that affected donors clicking "back" after a successful transaction.
  • We fixed a problem where the |concatenate custom filter wouldn't work correctly if the first argument was a number. Thanks to Emma at Anne Lewis Strategies working for the DSCC for the bug report!


This release includes one mailing change you're likely to notice:

  • When your mailing rebuild finishes, you no longer have to refresh the page to send or schedule. Thanks to Jase for the request circa 2016.

And a few others behind the scenes:

  • We now send you a notification in the rare event your automatic subject line test mailing dies. Thanks to Andrea working for the Fetterman campaign for the bug report.
  • The Proof and Send screen now truncates very long lists of targeting queries, and the Mailing SQL screen now truncates very long SQL targeting queries. Thanks to Gabi at MoveOn for the report.
  • We added a splash more zoom to builds.


  • We already skip scheduled reports that don't send to anybody; now we'll also disable their schedules going forward. To re-enable, ensure that your scheduled report is set up to send to an email address.
  • We fine-tuned the permissions needed to kill jobs. Now, you need a report permission to kill report jobs, and mailing editing permissions to kill mailing jobs.


Inline A/B Testing for Mailings

  • You can test changes to the mailing body, custom fields (including content fields defined in your wrapper), and sender fields (From, Reply-To).
  • Tests will be evenly distributed to your target audience.
  • Results are shown with the same statistics provided for subject line tests.
  • The tests are treated as a single mailing, so you will only see one mailing on the dashboard and only one mailing will need to rebuild if you change your targeting.

To start, set the toggle in the new A/B Testing section to on:

Enter the number of variations you want to test and add notes on the variations if you'd like.

Go to the element you want to test and click on the blue lab beaker symbol:

Then enter your content for the variations.

Once you're finished on the Compose screen, set your targeting and your limit and send your mailing just as you do for subject line tests currently. The standard mailing report will display results by variation. From the report you can select the winner and ActionKit will create a copy of the winning variation with the same targeting but no limit and excluding everyone who got the test.


User Groups

Over the years, many of you have asked how to remove tags from a user. But short of deleting all the user's actions associated with those tags, there's not a good way to do this. That's a big reason we created User Groups. They're similar to tags, but you can directly add users to and remove them from groups.

You can assign groups to pages (and users will be added to the group if they take action on the page), but you can also add them to a group or remove them from a group on the Change User screen, with an import or user updater, or via the REST API.

Read more about User Groups, or watch a short video about them!

False Click Filtering

Similar to last release, we will now filter out, where possible, false, machine-generated clicks. For those interested, all clicks (including these false clicks) are available in the core_click_raw table. This table contains full click data for the last 90 days, though we may narrow this window in the future.


  • We fixed a bug that prevented you from being able to use reports with parameters when exporting to Google Sheets. Thanks to Kenneth at Middle Seat working for the Fetterman campaign for the bug report!
  • We enabled an option on the visual editor that should avoid garbling Outlook-specific conditional content entered with Microsoft's MSO tag syntax. Thanks to Reginald at Color of Change for letting us know about the problem.
  • We fixed an error which was raised when saving special target groups with many targets. Thanks to Jordan at MomsRising for reporting the issue to us.
  • We fixed a regression where certain admin URLs missing a slash were redirected without their query arguments. Thanks to David at and Nicole at National Nurses United for the reports.
  • We fixed an issue with the API where PATCHing orders would erase their import id. Thanks to Carl at FirstLook for noticing this one!


This release is focused on preparing for Apple's Mail Privacy Protection (MPP).

MPP is included as part of iOS 15, which may be released as soon as September 14th. Users of the built-in iOS Mail application will be presented a choice of whether to turn on MPP. If enabled, Apple will load all images in all emails for those users, including the pixels used for open tracking, so these users will appear to open every email, regardless of their actual engagement level.

In a recent ActionKit data sample, roughly 25% of opens came from iOS devices, so the impact will be substantial, even after factoring for folks who don't use the iOS Mail app or opt into MPP.

Beginning with this release, ActionKit will filter out the false opens generated by MPP. This prevents MPP users from being incorrectly identified as engaged forever.

This means the rollout of iOS 15 will cause a decrease in average open rates, not an increase. As a result, when evaluating mailing performance, we recommend looking at click or action rates rather than comparing against historical open rates alone.

Once iOS 15 has been out a while and more data is available, we'll update you on what we're seeing, and any more changes we're making, in the release notes. Watch this space!

False Open Filtering

As described above, we will now filter out, where possible, false, machine-generated opens. For analytics nerds, the full open stream, without any filtering, is available in core_open_raw. This table contains full open data for the previous 90 days, although we may narrow this window in the future.

New Column in summary_user - last_mailed

We added a new column to the summary_user table called last_mailed. This columns stores the last date, within the last 365 days, when a user received a mailing from you. Thanks to Jin Ding working for Action PAC for the suggestion!

Django Upgrade

We've completed a project to upgrade the underlying Django code-base used by ActionKit to the latest release, version 3.2.6.

ActBlue Error Handling

If ActBlue sends a request with an invalid account name to the webhook we'll return an error immediately to ActBlue. This will help catch webhook misconfigurations earlier.

New Template Filter: splitlines

We added a |splitlines template filter which splits a value on newlines. You can iterate over the results.


AMP for Email Support (beta)

AMP for Email allows you to send emails to users with fully-functioning forms embedded in the mailing. For example, this means that instead of linking to a survey, you can embed the survey in the email directly -- and users can complete the survey form without ever leaving their email.

AMP is supported by many email clients, but users who open your mailing with an email client that doesn't support AMP will see your regular HTML mailing.

To take advantage of AMP, read more about how to set it up.

This is a beta release. There will be sharp edges and getting it working, especially the trickier bits, will definitely require some elbow grease. Let us know if you run into bumps in the road and we welcome your feedback on how to make things easier!

Faster and Easier Re-engagement

We updated the Re-Engagement Settings screen so you can now edit the SQL for your re-engagement queries more easily. Thank you to Jase at 350 and Third Bear working for Color of Change for the requests!

re-engagment link to query reports

We now display Dashboards tagged "reengagement" on the Re-engagement reports screen. Thanks to Brandon at MercyCorps for the request!

We also did some performance tuning on re-engagement jobs and they now run much faster than before.

Query Builder

We added a bit more visual space around the contents of AND and OR groups in the query builder so that if you're constructing complicated boolean expressions it is easier to follow which items are nested where. Thanks to Andrew at Dream Corps for pointing out the problem.

query builder and/or

We've also added an option to filter for past-due recurring orders to a place where it was missing in the donations query builder. Thanks to Marie at NRDC for reporting the oversight.

Faster Querying on Email Domain

We added an email_domain column to the core_user table. It's indexed, so this will make querying and reporting on user email domains more convenient and speedier. Existing SQL that uses substring_index(email, '@', -1) will also take advantage of this index without changes. This change is already available in all client instances.

Prefix Collection for Senate Signature Delivery

We added example code to collect prefixes from the fixed list supported by the Senate's Communicating with Congress signature delivery system to the thanks.html template in our Original template set.

Please note: the Senate's Communicating with Congress API has a frustratingly limited set of allowed prefixes. We and other groups have flagged this for the CWC team and we hope it will be improved in the future but, for now, the list cannot be added to or changed.


Upcoming Events Count

  • The count of upcoming events on the list of campaigns is now consistent with the upcoming count shown elsewhere. Thanks to Nicole at National Nurses United for the report.

Safer Github Pushes

  • We've added a check to ensure that when you push code to a repository for a templateset linked to GitHub, it won't cause an error or break your pages. (This was already in place for non-GitHub-connected templatesets.)

Email Wrapper Fields

  • We fixed a problem where copying an email wrapper wouldn't copy its custom email wrapper fields. Thanks to Lindsay at Nova Scotia NDP for the bug report.


Deliver Signatures to the Senate with CWC

We've added support for the Senate's version of Communicating With Congress! This means that your petitions to the Senate can now use the Senate's preferred delivery mechanism.

Sadly, the Senate decided to require a particular set of name prefixes for signatures: Mr., Mrs., Miss, Ms. and Dr. are the only prefixes their system supports. To provide additional flexibility in how this is presented to your users, we allow you to override ActionKit's normal prefix field with an action field called "cwc_prefix." Depending on your use case, you could use this capability to provide separate handling for a user's true preferred name prefix as opposed to the more-restricted list used for signature deliveries, so that ActionKit knows that they would preferred to be addressed as "Mx. Sam Browne" but will use "Ms. Sam Browne" for their Senate submission. There are several ways this choice could be presented to users; contact support if you're not sure how to set it up and we can share some sample code.

Report to Custom User Field Import

Lots of clients have developed use cases that involve running reports and then importing data from the results into custom user fields; we've made this process much easier by cutting the number of steps necessary. You can also keep these fields updated on a schedule!

To start, you'll create a report with the data that you want to put into a custom user field. (Make sure you create this custom user field ahead of time!) In this example, I'm creating a report that tells me how much money a user can donate before they "max out". (This example specifically applies to candidates and parties, and may be different in your area.)

Running the report, I see that user 1 has $1,000 remaining before they max out:

Next, I need to create a User Updater (from the Reports or Users tab) for this report and run it:

After it runs, I can check the User Summary page for user 1 and see a value of $1000 for their maxout_amount custom user field:

Admin Search As You Type

The admin searchbox now has super powers!

From any tab you can search Pages, Mailings, Reports, and Users (provided you have the necessary permissions). Search will offer suggestions as you type.

Or, click the arrow in the search box to choose a specific category:

The category groups include related models, so searching the Pages + category will suggest Templatesets too.

You can even search the ActionKit manual!

And you can start your search and then switch categories. For example, you could start a search from the Support Tab, then realize you want to search Reports+, or Pages+

You can still use the previous search. Just type in your search term and hit enter to run the tab-specific search that you’re used to.


Embedded Dashboards

  • Charts and tables in built-in dashboards (Mailing Dash, Draft Dash, User Dash, Event Dash, Campaign Dash) now render with full functionality, so if your dashboard has a line/bar/pie/etc chart, or sortable table, you can now see and interact with these on the Proof and Send screen, Mailing Report screen, User Summary screen, Manage Event screen, and Campaign Dashboard screen. Thanks to Julia at 350 for suggesting this enhancement!

Event Template

  • The "event_attendee_tools.html" template previously constructed the "cancel signup" URL like this: {% templatetag openblock %} url 'events.views.cancel_signup' {% templatetag closeblock %}

    Now it does so like this: {% templatetag openblock %} url 'cancel_signup' {% templatetag closeblock %}

    We'll automatically patch your templates where possible, but if you have the old version in a github repository, you should change it to the new version above. (The original URL will be supported for now, but not forever.)

Drag and Drop Editor

  • We fixed an issue that could cause default font size, color, and related styles to be ignored in the Drag and Drop Editor.

Engagement Queries

  • We sped up the default re-engagement reports by making them use the new summary_user table when possible.

Advanced Search Results "Next Page" Link Fixed

  • When using the admin interface's advanced search feature, the links to browse to the next page of results caused the search criteria to be wiped out, so you could only ever see the first 100 matches. This is fixed now, with thanks to Ismael at Color of Change for reporting the issue.

EveryAction Integration

  • We've added support for vanity EveryAction URLs in the the EveryAction integration. If you have a non-standard URL that you'd prefer to use to access the EveryAction admin via links from ActionKit please let us know and we can update your configuration. Thanks to Lee Henderson at EveryTown for the request.

Salesforce Integration

  • We fixed an issue that could cause the Salesforce sync to format donation data in unexpected ways. Thanks to ThirdBear working on behalf of DreamCorps for the report.

Small bugs

  • We fixed an issue that caused one Congressional Rep's contacts to be omitted; thanks to Amy @ Win Without War for reporting.

  • We fixed a bug that was caused a few ActBlue express donations to fail to load into ActionKit. Affected donations have been reprocessed successfully. Thanks to Sophie at MoveOn for the report.


Drag-and-Drop Mailing Editor

We're thrilled to announce a new option to make it easier to build complex mailing layouts: the drag-and-drop mailing editor. It doesn't replace the existing code and visual editors—they're still there for direct control of your HTML—but provides a more visual alternative:

The drag-and-drop editor also offers interesting design options like grid layouts with rows and columns and options to hide blocks of content on mobile or desktop.

To make the editor available in your ActionKit instance, a superuser needs to go to the "Configure ActionKit" screen and enable it in the "Admin Settings" section at top right, shown below.

Once the feature is enabled, you can still choose whether or not to use it mailing-by-mailing, or even change your mind while working on a mailing. To switch, use the "Editor" toggle that will appear at the end of the "Basics" section of your mailing compose screen:

Much more info about the drag-and-drop editor is available in the documentation. We'd like to thank Theirworld for early feedback on the feature.

Query Builder

You can now filter clicks and actions based on the browser (user agent) used to create them. For example, you can now build a query for mobile clicks by date:

This adds to existing support for browser info in the Display Columns section. Remember that user agents are only tracked for actions since last release.

ActBlue Integration

We've changed how our ActBlue integration handles addresses received for ActBlue Express donations. ActBlue Express gifts are one-click, so they don't prompt the user for address data. As a result, the addresses we receive with those gifts can be months or even years out of date. This can result in overwriting fresher address data on the ActionKit side.

When we already have an address for a user, Express donation addresses will not update core_user. They will still go to core_order_user_detail for the donation. Additionally, when using Donation-Only/Compliance Mode in the EveryAction sync, these addresses will be ignored unless they are the only donation address we have for a user.

Thanks to Everytown for a detailed description of the issue and helping to puzzle out how this should work.

EveryAction Sync

  • We've improved our tracking of errors in the EveryAction integration. Two new tables are available, core_everyactionorderfailedsync and core_everyactiontransactionfailedsync, which can be used to report on failures to send contribution data to EveryAction. Additionally, failures to send user data to EveryAction are now shown in the user admin:
  • We fixed a bug that could break the EveryAction integration if you had a merge query used to generate source codes that didn't include every order being sent to EveryAction. Thanks to Kristin Peña at People for the American Way for reporting this one.
  • We've improved how date fields are handled in the EveryAction integration. You can now map new date fields like Date Deposited and they will get be converted automatically into an EveryAction-compatible Eastern Time date. Thanks to Everytown for the request.

Salesforce Sync

  • Previously you couldn't sync $0 orders to Salesforce if you also utilized a trans_id mapping to prevent duplicates. That's been fixed now, and we've added docs on the sync's handling of $0 orders. Thanks to Shawn at J Street for the request.

Bugfixes and Internals

  • We fixed an issue with the Twitter card meta tags in the Original templateset. In your custom templatesets, if you'd like your shares to feature a larger image when they appear in Twitter, you can change the content of the twitter:card meta tag from summary to summary_large_image.
  • Petition and call pages would sometimes incorrectly recognize users who were missing address details needed to find their legislative targets. We'll now correctly show a contact info form to those users. Thanks to Caitlin at Courage for the detailed report.
  • We reverted a recent change to the format of custom event fields in the REST API. Thanks to our colleague Kyle at Mobilize for the report.
  • We fixed a situation where rate-limited mailings could send slower than intended.
  • Our code to detect "TK" placeholders in emails and prevent sending was incorrectly activated by references to the Tk'emlúps te Secwépemc First Nation community. We've added an exception to avoid this. Thanks to and the British Columbia NDP for reporting.
  • Behind the scenes, we're in the process of upgrading to a more recent release of the Django framework that ActionKit is built on. This release includes a minor Django version upgrade.



You can now export report results to Google Sheets with the click of a button! The first time you export, you'll need to authorize ActionKit to have access to your Google Drive in order to complete the exports, but once you've done that, exports are quick and easy!




We already tracked user agents for opens and clicks, going forward we track for actions too. Check it out in the Actions Query Builder. Thanks to many for requests on this, most recently Jase at



You can now find users by email from the ActionKit header search box.


Also, the fields on the delivery options screen were not showing up under the correct headers. We fixed them! Thanks to Jordan at MomsRising for pointing out the problem.


We fixed a problem where Video blocks didn't work correctly and a bug in the image file viewer in the drag-and-drop mailing editor. Thanks to Tom Lavelle and Jamie Lonie at Their World for the reports!


We added a new template filter, at_most, that allows you to provide a maximum value. For example, if suggested_ask is 3200 and value is 2800: {​{ suggested_ask|at_most:2800 }} will return 2800. We also added at_least, which allows you to provide a minimum value. For example, if suggested_ask is 100, {​{ hpc|at_least:200 }} will return 200.


We added a new mode for the EveryAction sync called "Compliance Mode" which only sends Contact updates for donations and sources user address data from the order user detail table. Thank you to Brooke Heller and Lee Henderson from EveryTown for helping us figure out how this should work.

We improved the EveryAction sync to always send date values in Eastern Time which is the timezone used in EveryAction. Thank you to Lee Henderson at EveryTown for the request here.


Better Email Blocking

Usually you want members to receive your email, but sometimes you don't. So we've made it easier to avoid emailing certain email addresses.

You've been able to block recipients by domain or email address years. We've now extended that feature in a few ways. You can now block emails containing certain strings. For example, you can avoid mailing any address that contains the string "spam" or ".gov".

Blocked users won't be included in mailing counts and will be assigned a subscription status of 'blocked' in the database. You can use longer lists now, too.

You can configure blocking options through the Mailings tab, under List Hygiene in the right-hand menu.

They're also available via the REST API resources blackholedemail, blackholeddomain, and blackholedpattern.

Consult the documentation for more info and contact Support if you have questions.


We added a count of open, upcoming events to the campaign dashboard:

We've also documented a little-known REST API endpoint for event searches, and gave it support for custom event fields. Thanks to Lee at Everytown for the suggestion.


We sometimes hear of new staff finding themselves unexpectedly blocked from the ActionKit admin, because the "Admin Interface" checkbox on their staff profile isn't checked. To help avoid this, the "Admin Interface" option is now pre-checked when you create a staff user:

Everything Else

  • We now note in the Mailing History page when a mailing's build has been invalidated due to changing a mailing's targeting query report's SQL as well as other indirect changes.
  • Import pages were cluttering up the list of available landing pages for mailings, so they've been removed.
  • We fixed a bug where some timed send drafts displayed as "generating" despite being drafts. Thanks to Elijah at Ontario NDP for the report.
  • A mailing test group could die if you had added new entries to your seed list before sending, but now that's fixed. Thanks to Bianca at 350 and Mais at The Syria Campaign for the report.
  • We fixed an issue on donation pages effecting very old olde browsers. Thanks to Brandon at MercyCorps for the report.
  • We made a small change to Original's petition.html, to use a div tag instead of a paragraph for the lead-in. Thank to Third Bear working for Kairos for the request.
  • We fixed two issues with international targets, including one affecting last names of some UK Members of Parliament. Thanks to David and Tamara at for the report.
  • We fixed a bug that could result in a merge loop when automatic user merge was enabled, thanks to Eileen at DSA for the report.
  • Users now get only one unsubscribe confirmation email per day, even if they manage to unsubscribe multiple times.



Campaigners sometimes rebuild or change targeting on a mailing not realizing that it will cause other mailings to need rebuilds. We'll now let you know what other rebuilds will be required, and ask you if you're sure if you still want to go ahead with your rebuild or targeting change.

Rebuild now? If you do, one or more mailings will need to be rebuilt.


We updated our vendor for U.S. federal legislators, and have loaded district offices for all of these targets. Please let us know if you see any inaccurate data or hear feedback from legislator offices.

We now support targeting non-voting delegates to the U.S. House from DC, PR, VI, AS, GU, and MP. If that doesn't bring about DC statehood, what will? Go to Pages -> Targets -> Legislative Target Groups -> Add to create a group, and select "U.S. House Delegates" as the type. Thanks to Amy at Win Without War most recently, and many others over the years, for requesting we end taxation without target-action in the District.


We added a way to differentiate between users that have been merged and the primary users on the Users tab. Thanks to Dominique at Pollinis for the request!

Shannon Turner merged into user Shannon Turner (linked)

We also added some more documentation about our new permanent user merge feature.


We fixed an issue where lists inside the "talking points" section of a Letter-to-the-Editor page were not visible. The Original/lte.html template has been patched, and others where possible. Thank you to Jin on behalf of Grassroots Law for reporting the issue.


We added a new column to the Event Campaigns listing showing you the number of upcoming events in addition to the number of total events, to make it easier to see which campaigns are in the past and which are current.


When working with a query that uses type-to-search fields to specify parameters, the values you entered are no longer lost when the query is run, so you don't have to re-enter them to run the query a second time. Thanks to Third Bear and Jase for bringing this issue to our attention.


Hiding a language made it impossible to unset email wrapper and template set defaults for that language. We've made it harder to get into this situation. Thank you to Andreea at 350 for bringing it to our attention.


Sometimes, when creating an ActionKit admin account for a new staff member, someone would leave the "Admin Access" checkbox unchecked by accident. Previously, this led to a confusing result: if they user tried to log in, they were bounced back to the login page without an error message. Now we'll show a more specific error message indicating what happened.

EveryAction Sync

We've add endpoints to our REST API to allow you to manipulate the user, order, and transaction mappings created by the EveryAction integration.

We improved error handling in the EveryAction integration to address problems found during the last release. Thank you to Lee at Everytown for Gun Safety and Bryan at RepresentUs for reporting the bugs.

File Uploads

We upgraded the third-party code we use to handle some kinds of file uploads (including end-user file attachments in action forms) to a more recent version that has better support for iOS devices.

We don't expect a lot of people to be uploading merge files to the admin interface from your iPhone, but this will allow more of your users to upload photos from a mobile device straight into an action form. Thanks to Kathy at MoveOn for reporting the problem.


The currency account switcher is now supported for Braintree donation pages using 3D Secure 2.0.


Permanent User Merges

ActionKit's user merge offers a way to collapse multiple user records into one, moving action history into a single user account. This is helpful when you end up with one person with different email addresses and you want to see all of the user's activity in a single place. Previously this was quickly undone if the user took taking action again with multiple email addresses. Enter Permanent User Merges - a new configuration option:

With this setting checked your user merges will be permanent, meaning if a merged user submits an action or donation with a secondary email that you previously merged, the action will be automatically merged to the user record with the primary email.

The email the user submitted with will receive the after action confirmation if you set one up for the page but secondary emails will not be resubscribed so they won't receive bulk mailings sent from the Mailings Tab.

When you have this configuration option checked you'll also get the option to disconnect a merged user on the user admin page. This does not move historical actions back to the secondary user profiles but future actions by the secondary user will be attributed to that user and will resubscribe the user.

Thanks to Shawn Clement from J Street for the detailed feature request.

Query Builder and Reporting Improvements

Reporting gets some upgrades in this release:

Zip radius searches in the Query Builder are now much faster.

We added most recent phone number to the available display fields.

When you run a report, if you email yourself the results after the report finished running, we re-ran the report and then emailed you the results. Now, we'll just email you the results immediately. Thanks to Tamara at ONE for the request!

EveryAction Integration

The EveryAction Integration continues to be a hotbed of testing and fixes. Let us know if you'd like to join the beta. In this release:

We added support for ActBlue donations that transform from one-time to recurring. Previously these caused errors after they'd been upgraded in ActionKit.

We fixed a bug that resulted in the wrong total being sent for one-time orders which had been partially refunded before being sent to EveryAction.

We fixed a problem which was preventing some Contact updates from being sent to EveryAction when more than 10,000 updates needed to be sent.

Thank you to Lee Henderson at EveryTown for reporting all three of these and for all the help improving the integration working.

Other Changes

We have released support for 3D Secure 2.0 for Braintree accounts to ensure transactions are compliant with Strong Customer Authentication requirements.

We fixed an issue where special targets with blank country values could not be updated. Thank you to Brittany at NRDC for reporting the issue!

We made some improvements to international geocoding to ensure users always end up with the country they entered.

Uploading a spatial data file to an existing custom boundary group replaces boundaries with the same name, rather than erroring. Thanks to Patrick at NRDC for bringing this to our attention.

Using certain email targeting options with the Also Include feature previously caused slow or hanging queries, which we've now fixed. Thanks to Marisa at J Street and Jordan at MomsRising for reporting.

It's now possible to specify which list you would like to subscribe or unsubscribe a user to in your CSV file when uploading. This allows you to subscribe people to multiple lists in a single upload. This is done by including a "lists" or "unsub_lists" column in your file. Thanks to Daniel from National Nurses United for the request!

All "letter to the editor" pages require the user to enter their name and mailing address, because media typically will not print letters without having this information. When you create an LTE page and check the "customize fields" option, we make sure these fields are visible and marked as required so that you can't remove them -- but as a curious side-effect of the way this code was implemented, you could actually add those name and address fields to the page a second time, which made the page unusable because the system doesn't expect to ever find two different name or address fields on the same action form. We now properly disable those options so you can't break your LTE page in this way.

We fixed a problem where if you didn't set the About text for your page, you wouldn't be able to customize the share description for social media. Thanks to Third Bear working for Kairos and Dominique at Pollinis for the reports!


ActBlue and EveryAction Sync

We improved our support for ActBlue donation data in the EveryAction integration, addressing several bugs in the way refunds were handled.

We improved support for sending reversed orders and canceled recurring profiles in the EveryAction integration, which now handles the case where the reversal/cancellation happens before the original record was sent to EveryAction.

We've fixed a bug in the EveryAction integration where certain country codes allowed in ActionKit were not allowed in EveryAction, which could cause the integration to fail.

Thanks to Lee Henderson at Everytown for help identifying these bugs!

U.S. Legislative Targets

We now have names, email addresses, and phone numbers for almost all U.S. legislative targets. District offices for new members of Congress are still outstanding.

Some state legislator targets were missing phone numbers, which we've corrected. Thanks to MoveOn for calling our attention to it!

We corrected several state legislators whose names were spelled incorrectly, without accented characters. Thanks to Maggie and Jordan at MomsRising for noticing and mentioning it to us.

Thanks to NRDC for supplying email addresses for members of the Illinois State Senate.

We had the worst person in the United States as president for four years. A recent election corrected that error; the change is reflected in the U.S. President Custom Target Group.


Thanks Andrew at Dream Corps for reporting that the "churn" column was not displaying in the standard List Progress report. We fixed the issue.

We fixed an error in the code the "Pages" query builder used to calculate the sum or average of payments on a given page. Thanks to Nathan at MomsRising for the report.

We added a new table called summary_user, which contains the dates a user has most recently opened, clicked, or taken action from a mailing, among other useful stats. This is significantly faster than querying on tables like core_usermailing.


We now display more detailed errors for ACH donation errors. Thanks to Ty and Rebecca at DSA for the request.

We refactored the ActionKit Braintree Javascript integration so that it's easier to intercept the submit event, for example, to do an interstitial ask, or provide custom validation. Thanks to Aili at MoveOn and others for requesting this feature.

We fixed an issue where a non-whole number default donation amount would not show as the default. Thanks to Bianca at for reporting this.

Quality of Life

For clients with many tags, browsing pages in the admin was painfully slow. We improved the speed by only showing the 100 most-used tags in the sidebar filter. You can search for other tags in the search bar.


New State and Federal Legislative Target Data (Partial)

As the prophecy foretold, most newly-elected state legislators, at least for the majority of states that are already sworn in, will arrive in your instance by tomorrow morning. We have switched our vendor for US state legislator data to KnowWho and they expect to release the remaining states (Alaska, Arizona, Arkansas, Georgia, Iowa, Kansas, New Mexico, Oregon, Washington, South Dakota, Texas, Colorado and Illinois) next week.

We'll be updating federal legislators by tomorrow as well. Contacts and district offices will be added as they become available.

Yet More Zoom!

We added updated_at and created_at indexes to tables that were missing them. This should speed up some reports, as well as third-party sync queries on dedicated replicas.

Also, most mailing screens load much faster than before. The largest improvements are on the Mailing Targeting screen, which loads four times faster and the "Rebuilding" section on the Mailings Tab, which can load 10x times faster!

EA and SF Syncs

We released various fixes for syncing donations and handling financial batches with EveryAction. Thanks to beta testers at Everytown and Represent.Us. Submit a support ticket if you're interested in joining the beta!

We added a notice to the Salesforce Field Mappings screens to clarify that if your sync settings are configured to only send data from AK to SF or SF to AK (but not in both directions), then bi-directional field mappings will still only send data in one direction. Thanks to Jackie and Ethan at Third Bear working for Dream Corps for the report!


If you have a mailing that uses an hourly cached report in its targeting, we'll refresh the cache just before it expires, to help your mailings build even faster. This was inspired by Nissa, working for ECU.

We now show a warning if you use {{ "{" }}{ suggested_ask }{{ "}" }} in a mailing with a donation page that doesn't have a suggested ask rule. Thanks to Nathan at Faithful America for the report.

We adjusted the Re-engagement Overview and Settings screens to make it clearer when you have an active re-engagement job running. Thanks to Amy at Win Without War for the report!


  • We've added support for Canadian dollars using, in addition to the previously existing support through Braintree. Thanks to Lindsay at the Ontario NDP for suggesting this.
  • We improved emoji support! 😮✨🎉 Most text fields now accept emoji, including page content and custom fields. Some exceptions remain, like combined Name fields on action forms (which filter out the emoji) and user/click sources.
  • You can now delete survey questions via the REST API. Thanks to Ethan and Jackie at Third Bear working for ONE for the request!
  • We've tightened our anti-spam check for links in names to catch some links that got through previously, and added exceptions for some names and titles that could look like links to our code.
  • We had accidentally removed the Page from Model button from the Pages tab menu. Sorry about that! It's back! Thanks Joe from Everytown for the report.
  • We fixed a problem where you could create a GitHub connection for a templateset using the same branch for the live and preview versions. This would cause problems in previewing, so you can't do that anymore. Thanks to Rachel at 350 for the report!


Even More ZOOM!!!

New release, new zoom! We've got a bunch of speed improvements coming soon to an ActionKit near you.

Admin pages that display lots of minidashes are now much faster to load. That includes lists of mailings and pages. There's also a significant improvement in load times for the Pages tab and some related pages. (We'd understand if you have to go hit the Pages Tab a few times just now to see for yourself.)

We also sprinkled more zoom flakes on mailing build times. Mailings that use a lot of cached reports or target using other mailings now build up to 8 times faster. That's 800%!

Self Serve DB

Good news, you can now manage your own MySQL accounts for the shared reporting replica, if you're a superuser with two-factor authentication enabled, instead of needing to ask us through support. These accounts are necessary for direct database connections.

Each staff user's permissions page now indicates whether the staffer has a MySQL account. You can create a MySQL account if the staff doesn't already have one.

Or if they already have an account, but it isn't associated with the staffer, you can connect the two:

MySQL account management is limited to superusers with two-factor authentication enabled. Want to know who does or doesn't have 2FA enabled? That's now a staff filter.

If you have a dedicated replica you'll still need to contact ActionKit support to manage those accounts.

Paste Multiple Preview Lines Too

When composing a mailing, you can now paste in multiple preview lines just as you can paste in subjects. Once you have multiple subjects, paste multiple lines into the preview text box to set preview text for all of them.


The Mailer Limited Send Size setting now uses an absolute number of recipients. If you customized the setting, we'll use your custom percentage and current list size to set the absolute number. If you left the setting alone, we'll set the absolute limit to 5% of your list size up to a maximum of 10,000. If you use the limited send feature, you may want to review the new value and make sure it's in line with what you want.

Superusers, go to the Configuration > Mailer Settings > Mailer Limited Send Size to make changes.

We fixed a problem that sometimes caused mailings targeted to constituents of a legislative group to build very slowly. Thanks to Jenn at MoveOn for reporting the issue.

We fixed a bug where submitting an edit to a mailing's content at the exact moment it finished rebuilding could result in the mailing staying marked as building until a new build was submitted. This was most recently reported by Annie at Indivisible.

We fixed a bug that prevented certain mailings being used in targeting. Thanks to Jennie working for Jamaal Bowman for the most recent report.


It's easier to find which US legislators and built-in international targets have phone numbers or email addresses on file. Since most targets have both, we've added an icon to the target group admin screen to show where one is missing.

Thanks to Brittany at NRDC for the request.

You can now Bulk Edit to show or hide lots of Legislative and Custom target groups at once. Thanks to Joe at Everytown for suggesting!

We fixed a bug that allowed international users to take action without providing an address sufficient to identify their target. For Canada and UK MPs, we now really require postal code and country.

We added a new custom snippet type for Petition Delivery PDFs. You can add new custom snippets from the Config screen. Thanks to Brittany at NRDC for suggesting this too!


For users in the Salesforce sync, you can now trigger an instant sync from the user profile by clicking "Sync Now". Thanks to Shawn at JStreet for the suggestion.

And you can remove a user from the sync by clicking "Disconnect User". We've added docs on how to go about disconnecting a user. Requested by Mark working for FreePress.

Everything Else

  • We've added documentation on the recently added user-facing file uploads, prompted by questions from Eloise at StandUp America.
  • We've added a new report called Users Taking Action After Merge to help you find (and merge!) users who have taken action again after being merged. We also fixed an error that could occur when performing multiple user merges at the same time.
  • A recent release added rate-limiting as an anti-spam tool. With this release, actions caught by the rate-limiter are no longer saved. This release also extends name checking to catch more spammy links.
  • When displaying or filtering on user phone numbers in the query builders, you'll find some new "digits only" choices, which can be helpful for exporting or filtering. Thanks to Nicole at National Nurses United for suggesting this feature.
  • Custom user field names are normalized to lowercase before saving from a page. Thanks to Rebecca at DSA for reporting a bug that led to this change.
  • We fixed a bug with multiple-value parameters for re-engagement reports. Thanks to Sophie at MoveOn for helping us discover the problem.
  • Petition action resources in the API link to the actions targets, as with call and letter actions. Thanks to Third Bear (on behalf of for reporting this omission!
  • We fixed a bug that prevented page validation from catching some form values that were required but blank. Thanks to Rachel at 350 for reporting.
  • We fixed a bug in the display of the selected default Query Template. Thanks to Jase at 350 for reporting it.



We've improved the page load times for nearly every screen in the ActionKit admin. For example, the Reports Tab now loads 30 times faster! I was so excited I spent several minutes just hitting reload. (Sad but true.)

Most of the performance work doesn't lead to visible changes, except: we now only show 25 mailings of a type on the mailing summary screen instead of 75.

We also:

  • Optimized mailings that use a merge query or merge file for targeting so that they run faster and more efficiently.
  • Reduced the load time of the autocomplete widgets by more than 65%.
  • Improved rebuild times significantly for mailings that use a lot of cached queries or exclude a lot of other mailings. Maximum build times have been reduced by over 70-80% and average build times have been reduced by more than 50% across the board.

File Upload In Action Forms

We've added native support for accepting file uploads from users within your action forms. There's a new question type both in the survey builder and in the user-form-field customization options. You can restrict uploads to just images, or accept videos or document files. Uploaded files are stored in your AWS S3 bucket, using private URLs that allow you to download them without making them accessible to the public.

This feature does not work with pages that are hosted outside of ActionKit; contact us if you have a use case that would benefit from that capability. We've tested this feature on a variety of browsers, but let us know if you encounter any rough edges.

International Enhancements

We will now populate a user's city and region if they supplied a postal code when taking action.

We have improved postal-only geocoding for countries outside the United States. This was prompted by a report from Felix at ONE about issues with Canadian postal codes -- thank you!

We added a type to the display of international divisions so on your user admin pages you'll see "Constituency" for UK constituencies, and "Riding" for Canadian federal electoral districts. Thanks to David at ONE for suggesting this addition.

We added state, and if that's not available, region, to the Original print template for delivery PDFs. You can still customize PDFs however you want!

We improved the way we display error messages for form fields which have been hidden, such as the zip code or postal code fields which are hidden as you toggle between US and international addresses.

Mailings Bug Fixes

At long last, you can now specify users to view proofs for by email address as well as user_id. This was requested over the years by Jase for DFA, Michael for First Look Media and Shayna for Win Without War, among others. Thank you all!

We've edited the subject line for final mailing proofs for timed send mailings to note when they'll be delivered. Thanks to Erick at Presente for suggesting this improvement!

In a recent release, we added a check to let you know when you needed to exclude people who recently received a recurring mailing series, but that warning could misfire if you entered 0 for the series. This is now fixed -- thanks to Jessie at FCNL for the report!

We fixed a bug that prevented a recurring mailing series from stopping if you pushed stop at the moment that a mailing in the series was preparing to be sent. Thanks to Nicole from National Nurses United for helping us battle the undead.

We fixed a bug that could result in getting too few users when targeting a mailing with "Also Include" OR'ed criteria. Thanks to Aaron on behalf of Verified for reporting the MIAs.

Batch Delivery

You can now select which columns to show when delivering a CSV file of signatures to targets. With this change, you can hide users' full addresses, show international addresses, and include additional information like phone numbers. Thanks for the user cases to Kara at ONE, Caitlin at Courage and Virginia working for Ayanna Pressley.

When receiving a batch delivery proof, you'll now get a big red warning that this is a test message, much like you receive for one-off delivery proofs. Thanks to Emily working for 350 for the request.


You can now view which form types a user form field is associated with and filter UserFormFields by form types in the REST API. Thanks to Third Bear and Sky at MoveOn for the requests.

We made the relationship between custom boundaries and targets visible in the REST API. Thanks to Third Bear for requesting on behalf of ONE.


  • To frustrate some spam bots, ActionKit by default now allows only 20 actions from a single IP per minute. This is a limit that we set based on reviewing months of logs and confirming that this would only block spammy requests.

    API requests using a username and password are not rate-limited and, for now, unauthenticated submissions against /rest/v1/action/ are not rate-limited.

    You can disable the limit under Spam Settings on the Config screen. Read more in the docs, and please contact us if you have questions or issues.
  • We told you that if you used the importer's fast user field upload feature and only included an email, akid or user_id that we would automatically fallback to a normal import. In some cases, that was a lie.

    We now automatically turn off the fast user field upload option if you upload a file with only an email, akid, or user_id column. Really. We mean it this time.
  • If we know that your report results has too many rows, then we won't show the "Email report results (as table)" section anymore, since your only valid option is to download the results or email yourself the file.
  • It was easy to confuse snippets like {% verbatim %}{{ context.targets.title_last }}{% endverbatim %} (used on pages) and {% verbatim %}{{ targets.title_last }}{% endverbatim %} (used in mailings), especially when copy/pasting portions of a template from a page or mailing, so now we allow you to use these snippets interchangeably. Thanks to Senator Jo Comerford, formerly of MoveOn for the original request.
  • We fixed a bug that caused the express_lane custom user field to not be updated with information from ActBlue in some client instances. If this affected you, we’ll update the record in your database to fill in the missing information.
  • On the Action History and Transactional Mailing History pages of a user's record, we now display the timestamps in the staff user's time zone instead of server time. Thanks to Brandon at Mercy Corps for the request.
  • In some cases, the recorded time for tracked clicks could be off by a few seconds. Now it's not. Thanks to Adam at MoveOn for noticing the problem!
  • Custom fields using the "numbers" field type now use text behind the scenes; this prevents a rare HTML bug if you had an invalid number in your custom field and the custom fields section collapsed when you tried to save that would leave you unable to save your page until you either fixed the error or uncollapsed the custom fields section. Thanks to Josue at NRDC for finding this one!
  • Previously you'd get an unhelpful error trying to create custom boundaries by uploading a GeoJSON file that contained both polygon and multipolygon features. We now show a validation error and we've added the requirement that all of the geometries in the data must be a single type to the documentation. Thanks to Vanessa at Pollinis and Ben at ProgressNow for reporting the error.



We've got a bunch of improvements to snippets in this release.

We've added snippets to the Compose Mailing screen for your page content that you enter when setting up Petition, Letter, Call, and other types of pages.

Select your page from the "Landing Page" dropdown, then select the content you want to include for that page from under the renamed "Landing Pages" submenu. The snippets are divided by page type.

We also cleaned up some of the snippets menus when you're editing Pages to only show you snippets that are relevant to that Page's type.

We updated the snippets menus on the delivery job page to fix some broken snippets.

Finally, we removed some broken snippets on the Delivery screen for Petitions and Letters.


To facilitate organizing online and international events, we now save each event's time zone in a new column in the database. You can display this time zone in user-facing templates with {% verbatim %}{{ event.local_timezone|timezone_display }}{% endverbatim %} or query it from the events_event.timezone column. You can translate the names of time zones into other languages; see the documentation of the timezone_display filter for details.

We’ve made a few changes to the Original template set. We attempt to patch these to your templates, but if you don’t see these, we’ve outlined the changes in the documentation:

  • Region added to the Event Create template; region will display if the country selected is not the United States, so users can specify the relevant Canadian province, French department, etc.
  • Changes to event_search_results.html can speed up displays of the map if you have hundreds of events. Although we made several different change to this template, you can get most of the speed benefit by ensuring that this one short bit of modified JavaScript appears in your templateset: “Speed up map display by adding markers in bulk”
  • We fixed a bug where if you had moderation set up for your event campaign and you edited an event while Acting as Host, we would redirect you to the Moderator Tools page instead of the Host Tools page. If you are still being redirected to the Moderator Tools page after Acting as Host, you may need to update your templateset to pass the host_akid URL parameter.


  • If your page's after-action Redirect URL goes to ActBlue, we'll now fill the akid into the refcode2/refcode URL parameter, just like we do for /go/ redirect URLs and mailings. Thanks to Brandt working for Our Revolution for the request.
  • The REST API no longer requires trailing slashes! Thanks to everyone who's reported trouble with this.
  • Using the API to change orders with no import IDs resulted in invalid duplicate errors. This has been fixed. Thank you to Brandon at MercyCorps and Lee at Everytown for reporting it.
  • We've added SVGs to the list of image types we exclude from link redirection. Thanks to Aaron at Birdhouse working for Pollinis for the request!
  • We've fixed a problem where A/B tests were left running on pages the test was no longer attached to. Now, unattaching a page from an A/B test will end the trial for that page.
  • The Actions query builder now knows how to display and filter on the subject and letter text of letters to the editor. Thanks to Emily @ MiddleSeat for 350 and Liz @ CBD for requesting this feature.
  • If you don't have the permission to Manage Jobs and stop them, we now hide the button instead of showing you an empty list of jobs. Thanks to Phillip at ONE for the report.
  • The "rebuild at send" checkbox on the mailing "proof and send" screen only affects the behavior of scheduled mailings, so now we only show it if you are scheduling a mailing.
  • We added several useful text filters to the documentation. Thanks to Scott at MoveOn for the request!
  • We standardized email address tracking for state targets so it's the same as with federal targets:
    • is blank
    • TargetContact exists and has email only if a valid email exists for the target
    • TargetContact can also be created/overridden by clients and we won't change that data (until the legislator changes)


Recurring Donation Support in EveryAction Integration Beta

We've added support for recurring donations to our EveryAction sync. Contact support to join the beta today and help us test it out!

Pages Will Enforce If Postal/Region Are Marked Required

We've added code to allow you to require Postal and Region fields for international addresses. Previously we enforced Zip and State requirements but only for US addresses and we didn't provide a way to do the same for non-US addresses since there are countries that don't use postal codes. You can now set those fields required and they will be required for non-US users. We don't validate postal codes. We also added a "Required in US" mode for backwards compatibility with the old behavior of only enforcing zip/state requirements in the US.

Here's how it works:

  • In the user-form-field customization interface, there are now two versions of the "Required" mode for the State/Region and Zip/Postal entries: "Required", and "Required in US".

  • The "Required in US" mode matches the previous behavior of "Required": for US addresses, state and zip are required, but for international addresses region and postal are not.

  • The "Required" mode makes the relevant fields required for both US and international addresses.

  • The State/Region and Zip/Postal fields on all existing pages will show up in "Required in US" mode, and thus will maintain their previous behavior.

  • However, if you would like to require a region name and/or a postal code for international addresses, you can switch the corresponding entry in the user-form-field customization interface to "Required."


Customize Event-Related Emails Without Editing Templates

We've added a new step to Event pages called "Custom Emails" that allow you to customize event emails like event approval, cancellation, and similar emails without needing to make changes to your templatesets.

The options available are dependent on the page type -- the dropdown above shows the custom emails associated with the Event Create page type. Select an email type and the subject and body will be pre-filled from your templateset.

Select a type, make your edits and users who create an event on this page only will get them. Your templateset remains the same. Read more about this exciting new feature.

Customizing your events emails is easier with this new feature, but so is making mistakes! Be sure to test if you make changes.

House of Commons of the Parliaments of the United Kingdom and Canada Available as Advocacy Targets

These bodies are now available as built-in advocacy targets. As with US state legislators, you won't see these target groups in your instance until you enable them. You can do this from Pages->Targets->International Targets.

Simply select the body, customize the name if you'd like and save. The target group will then be available for selection when you create a Letter, Petition, Call or Whipcount page.

Currently you can only add the full body as a target group -- in an upcoming release you'll be able to target subsets of these bodies.

We match users to their electoral constituency or riding based on their geocoded latitude-longitude. The more address info provided, the more accurate the match. We suggest at least including postal code in the user form. Please note -- you cannot currently make postal required. This will be fixed in the next release, if not sooner.

You can also deliver signatures to targets for whom we have email addresses (100% for Canada and 98% for the UK). CSVs and a PDF template with appropriate fields for international deliveries is another upcoming addition.

You can use Page Target snippets and direct the mailing to constituents by selecting the Target Group or picking a Division:

Finally, international targets have been added to the user, target and page query builders.
We'll be monitoring for changes and updating our data regularly. Data about each target is in the core_target table.
This is our first step toward native support for international advocacy targets. Watch these notes for further improvements and please let us know if there's something you'd like to see! We may also add advocacy targets for additional countries in future -- please let us know where you are or would like to run targeted campaigns!


We continue to improve the Salesforce sync as well. This release we fixed a pair of SalesForce bugs that were using SF API calls by repeatedly sync'ing recurring donations, and by unnecessarily checking for missing donations. Thanks to Shawn at J Street for the reports.

We also added a 3 hour wait before we try again when any user fails to sync. Previously we only waited for new users.


  • By default, login_string tokens are good for 30 days, but you can also specify a TTL, in seconds, as an argument. An invalid TTL or a TTL longer than 30 days will by set to 30 days. Thanks to Ethan for the suggestion!
  • The embed widget now generates the code you need to include the Recaptcha spam prevention, if you have the Recaptcha Enabled custom page field set to 'Enabled'.
  • We fixed the Live Link Local Files template editing feature for Chrome that was broken by a recent Chrome release. Thanks to Aaron for Pollinis for flagging this!
  • We've improved how we email some reports. This resolves a variety of issues, reported by Mark on behalf of UltraViolet, including the occasional failure to deliver the reports.
  • There's a new filter for hidden in the Mailings Query Builder and Mailings Advanced Search so you can easily exclude these from your results.
  • We fixed a problem that prevented mailings with certain emoji characters in their subjects from building successfully - thanks to Blue America Project for the report.
  • Thanks for a report from Phil at ONE, we were able to find and fix a bug that sometimes hid the actual error when previewing a mailing with broken template code.
  • We changed a couple of names to improve clarity:
    • IP address checks: If an action taker's IP matches the block list, the spam check log will report: `Found in block list:`. If the IP matches the list of allowed IPs, the reason is `IP allowed`.
    • Multiple currencies: "Use Account Switcher" is now "Display Currency Switcher" to make it clearer that this is for switching between international currencies when dealing with donations.


Virtual Events

The events system now has support for creating campaigns for events that will be held online, by phone, or in other "virtual" settings. Campaigns will continue to default to hosting only on-site in-person events, but you can change them to support only virtual events or a mix of both.

Virtual events can be organized either for a local area or on a global basis. Local virtual events show up on an event map, but don't list a specific street address, while global events don't appear on maps and only show up in event listings.

For both types of virtual events, hosts are prompted to specify the conference hosting platform instead of an event venue, and to provide attendees with connection or dial-in directions rather than driving directions.

These changes appear in the Original templateset and will be merged into your templates where possible. If your event templates are heavily customized, you will need to incorporate the relevant changes before you can use these new capabilities.

EveryAction Integration

This release includes the first version of our EveryAction integration, which ships users and one-time donations to EveryAction.

Like the SalesForce integration, reports control which users and donations are synced.

You can edit the field mappings to control what data is synced and where it appears in EveryAction.

Spam Check

The Honeypot spam check has been replaced with a more reliable check that uses the Akismet service. Action details including IP address, user agent, referer and more are evaluated by Akismet and the action gets an up/down on whether it's spam or not.

The Honeypot check has been disabled. The Akismet check has been enabled for clients that were using the Honeypot.

Spam checks can be configured from the CONFIG page.


  • For petitions with large numbers of signatures (>500k), attempts to deliver CSV files showed an error about not being able to generate PDFs. While PDFs are still limited, CSV files are not and we have changed the error to reflect this. Thanks to Leonard and Tara at Color of Change and Zoe from Middle Seat working for ActionPac for reporting.
  • We fixed an unexpected error from the REST API for PATCH requests on certain page types. Thank you to Patrick Hensley with NRDC for reporting this to us.
  • REST API searches using custom fields should work more intuitively now. Previously, using field__name=x&field__value=y in API searches could return records where one custom field had the name 'x' and a different custom field had the value 'y'. Now we return only records where custom field 'x' has value 'y'.
  • REST API requests can now filter on action source. Thanks to Third Bear working for FCNL for this request and the one proceeding.


Release Notes

ActBlue by candidate breakdown

When recurring donations were broken out by candidate, ActionKit and ActBlue data could get out of sync if the amount per candidate was updated. To account for this, we've added columns to the core_actbluetransactiondetail table: amount, currency, amount_converted and candidate. Now, updates to recurring donation amount per candidate will be reflected in ActionKit. We'll be backfilling the data over the next few days. Thanks to a detailed explanation from Ethan at Third Bear, reporting on behalf of several clients.


This release includes a couple more QuickDonate improvements:

  • Fixed a bug that let staff log in as donors by following one-click links in mailings.
  • Fixed a bug where the ActionKit form could briefly be visible after landing on a QuickDonate donation page.
  • QuickDonate forms now use the default amount set for their ActionKit page.


  • We added a line to the User Donation History Page noting the mailing that prompted a donation. Thanks to Halley at for the request!
  • If you begin running a report, then navigate away or close the tab without emailing the report, we will stop the report since nobody would see the results.
  • We corrected how recurring first payment date is computed for recurring orders with a start date in the future. This affects the display on the admin recurring start interface and snippets. We also changed the user update recurring_info.html template to use this method for First Payment, instead of the create date of the recurring order.
  • You can now load event search results with a different templateset using {% verbatim %}&template_set={% endverbatim %}.
  • We fixed an issue with event search by state name that was causing past events to display. Thanks to Lee @ Everytown for letting us know about this problem.
  • We also fixed a bug with viewing events by year in the admin UI. Thanks to Jackie at Third Bear working for AOC for the report.
  • Previously, the timed send validation report on the haiku/confirmation screen could sometimes fail if database replication was behind. That's been fixed, thanks to Nathan at Faithful America for flagging.


Release Notes

Fix for incorrect next_payment dates for Braintree recurring donations

We fixed an issue for Braintree recurring donations that were configured to use a plan billing on a fixed day of the month. These recurring donations had an incorrect start date, and would therefore return the wrong date for next_payment_date. Going forward, the recurring start date and computed next_payment_date should be correct.

After this release goes out, we will run a job to correct the recurring start date of any existing profiles affected by this issue over the next few days. Thanks for Chris from 350 for flagging the discrepancy.

Record of templateset changes

When we make changes to the Original templateset, we automatically apply those changes to your templatesets if we can. But if your templatesets are heavily customized or you're using our GitHub integration, we often can't apply those changes; you need to make them manually in order to get the latest bugfixes or features. To help you make these changes on your own, we've added a section to our documentation with every change we've made to the Original templateset since we re-released it in October 2016. Thanks to Suzi at 350 and Mark working for UV, among others, for the request.

Quick Donate

We're continuing work on supporting one-click donations using the combined EveryAction/BSD pool of saved credit cards, including adding an option you can use to customize the text of oneclick donation links. Pass a "text" parameter: {% verbatim %}{% quickdonate_buttons text="Chip in now:" %}{% endverbatim %}


* You can now restrict event email targeting to users who are in the same (US) county as an event. You'll see a new "Same County Only" option on the mailing Targeting screen:

Checking this box will also check 'Same State Only'; unchecking 'Same State Only' will also uncheck 'Same County Only'. Thanks to Bianca from the Bernie campaign for the request.

* We now order tags by name alphabetically when you are selecting a tag for the mailing and selecting recipients by tag. This should help address a problem Dream Corps ran into with finding a "parent" tag when they had many "child" tags starting with the same letters.

* We fixed an issue where the Salesforce sync could fail when mapping to a Salesforce field of type Date. Thanks to Shawn@JStreet for flagging the issue.

* We fixed a bug where updates made to custom action field labels set in Customize Fields sometimes weren't visible on pages. Thanks to Virginia working for the Pressley campaign for reporting.

* We fixed a bug with erasing users where selecting the option to erase confirmation mailings errored if the user also had been sent other types of transactional mailings. Sandra at MoveOn helped us find this obscure one!

* The mailing snippets {% verbatim %}{{ donations.most_recent_all }} {% endverbatim %} and {% verbatim %}{{ donations.most_recent_date_all }}{% endverbatim %} (which show the most recent donation) now show a recurring donation's most recent payment, rather than when the recurring order was originally set up. Thanks for LJ from First Look for raising the issue.

* We've added snippets for a page's advocacy targets to the snippets menu for confirmation mailings. Thanks to Ben at JStreet and Robert at Demand Progress for the requests.


Release Notes

  • We upgraded the version of jQuery used by ActionKit admin pages. Note that your templatesets are not impacted by this change.
  • We optimized the donation-related queries generated by the query builder. Many newly-built donations queries should run even more quickly than previously.
  • Changing a target group did not force rebuilds for mailings that target constituents of the group. We fixed this! Thanks to Michael at First Look for reporting this issue.
  • If you tried to stop an automatic subject line test, but the test mailing had already finished sending, the winning subject would be sent anyway. We have now fixed this so that clicking stop on a test mailing always stops the test. Thanks to Keith at PCCC for the report.
  • We added an option to delete Salesforce mappings when merging users. This prevents merged users from creating duplicate contacts in Salesforce.
  • When building a donations query report, you can now display or filter on the user's federal or state legislative district.

    Thanks to Shawn at JStreet for the requesting both of these changes.


Release Notes

Event permissions change: You may need to adjust staff permissions today

We've separated Events permissions completely from Pages permissions, so if you have staff members that should only have access to Events, you no longer need to give them Pages permissions for them to be able to edit their events.

Similarly, if you have staff who manage pages but you don't want them to be able to manage events, you can give them only Pages permissions and they will no longer be able to edit or manage events.

Staff-users permission removed

To create new staff users and assign permissions, you need to be a superuser.

Custom user fields have a timestamp and action

We've added a field for the last time a custom user field has been updated, as well as the associated action, if there is one.

You can view these new fields in the core_userfield table as shown below (remember, the parent_id is the same as the user_id):

Thanks to Jase at 350 for requesting this feature!

Reporting replica delay notification

When you run a report from the ActionKit admin, it is run against our secondary ("replica") database for performance reasons. Occasionally, the replica falls behind. When this happens, recent actions don't show up in your reports until it catches up to the primary database.

Your data is safe and properly recorded, but it looks like data is missing, because there's no recent activity. That can be confusing and scary!

Now, we'll show you the time your report ran:


  • If you have auto excludes set up, and your mailing's auto exclude date does not match its local time zone timed send date, we'll show a warning.
  • An old Salesforce sync failure was sometimes reported on the User History page, even if there was a more recent successful sync. This has been fixed. Thanks to Shawn at J Street for flagging the outdated message.
  • We already check for duplicates when syncing donations to Salesforce. With this release, we've added a similar check for donations coming from Salesforce. If a transaction/recurring donation is received from SF that already exists in AK, a mapping is added but no new donations created in AK. Thanks to Chris at 350 for the report that prompted this.
  • We fixed a problem where if you tried to edit the details of a past event, you'd get an error on the form even though your changes would be saved. Now you can edit past events as needed.
  • We got rid of the confusing custom target group "US Governors" that we added years ago as an example, since the data was neither complete nor correct. We also eliminated related duplicates. Thanks to Conen at Progress Now for reporting the dupes.
  • We improved the performance of the mailing tab for folks with lots of mailings. If you found these pages slow in previous releases, give them another whirl!
  • We fixed a bug with A/B tests that caused optimization to stop working if it ran into stats that it didn't expect (like if your page had more actions than views). Thanks to Nathan at Faithful America for finding this one!
  • We added a note to the Communicating with Congress section of the user guide clarifying that it may take up to an hour for signatures to be delivered to the CWC system.
  • We've improved the error messages for donors whose donations fail due to AVS errors from Braintree. We've mapped error codes to new messages and added specific message about missing street or postal code.


Release Notes

We're expanding the beta integration with FastAction to include one-time donations on ActionKit donation pages. The FastAction/QuickDonate pool has millions of cookie-based saved profiles, and once a logged-in donor reaches your donation page, they can quickly donate without having to enter their personal or payment information.

On pages that use a FastAction account, the usual user form is replaced with an embedded QuickDonate form which can be styled to match the rest of your page.

We plan to add support for recurring donations in the future.

As part of the release we'll update the Original templateset and attempt to patch your customized templatesets. If we're not able to apply the two patches, you can apply them yourself:

Before the opening of the "content" block:

{% block body_extra_classes }}
{% if page.payment_processor_information.is_quickdonate %}
{% endif %}
{{ block.super }}
{{ endblock }}

After the end of the "content" block:

{% block below_form }}
{% if page.payment_processor_information.is_quickdonate }}
{% load_quickdonate %}
{% endif %}
{% block.super %}
{% endblock %}

If you’re interested in beta testing, please get in touch!

Use custom event fields to target mailings and filter using {% templatetag openblock %} withevents {% templatetag closeblock %}

You can now limit the events included in your mailing (using the “New” snippets) and target your mailings by the value in a custom event field. You can also limit the events returned using "withevents" and a new parameter.

You might use this if you have an event campaign that includes several types of events, differentiated by custom fields, like house party or rally. Until now, mailing users about only one of these types of events has been difficult, requiring a combination of custom targeting queries and mailing template code.

Now the mailing targeting screen includes an option under "event campaigns" that allows you to select custom fields used by your events and specify the values you want to match in those fields.

To match any one of several values, separate them with a comma or semicolon.

Your selection here works with the “New” snippets under “Events” just like other event campaigns targeting criteria. The snippets will only display events that match the selections you make in this section.

This capability is also available for mailings which use the {% withevents %} tag. Specify a custom event field by including a parameter like "rally" as event_field.activity to only match events whose activity custom field is set to rally. For example:

{% withevents with user as nearby_user 'my_cool_event_campaign' as campaign 30 as radius 1 as limit 'rally' as event_field.activity %}

To match any of several values, use the format "rally;march" as event_field.activity.

Thanks to the multiple clients who have articulated the use case for this feature, particularly Kenneth at Middle Seat working for Beto and several other clients.

View all events

A new link on the event campaign page, "All events for all campaigns", can be used to view all events across all campaigns. Again, thanks to Kenneth for suggesting!

Easy access to past and upcoming events for host

User account tools now includes a section with a user's Upcoming Events and Past Events, with links to their host tools page or attendee tools page as appropriate. Thanks to Jon for the Bernie campaign, among others, for the suggestion.

More Events

  • If a report takes an event_id parameter, then full event details will be available via an event object, e.g. {% event.starts_at_utc %}, as seen with user_id and {% user %}
  • Line breaks in the event description, note to attendees, or directions will now be displayed to the end user, instead of being rudely ignored. This applies to the Event Details page, the Event Signup page, the Attendee Tools page, and the Host Tools page. If you do not see these changes, you may need to edit your templateset's wrapper.html to add the following CSS:
    .ak-event-description, .ak-event-note-to-attendees, .ak-event-directions { white-space: pre-line; }
  • The Original templateset better supports event campaigns that don't require host confirmation. For example, the text displayed to hosts after they’ve created an event and in their after action confirmation email has conditionals to account for this setting. We tried to apply these changes to your templatesets as well, but if you've customized yours heavily you may need to make these changes manually. See event_email_created.html and event_created.html in the Original templateset for the code to copy.
  • Also, if your event campaign requires hosts to confirm their email but your Event Create page doesn't have a confirmation email set up, we'll remind you to set it up.


  • Proof mailings now show the expected send count in the subject line, just like final mailing notices. Thanks to Michael at the Bernie campaign for the request.
  • We fixed a grammatical error and clarified some language around when you can pick a winning email or subject line. Thanks to Sue Anne at MomsRising for the report.


  • If one of your users marked an email as spam, they wouldn't be able to receive password reset emails, donation confirmation emails, or event host confirmation emails. Now they can. Thanks to Marie at NRDC for the most recent report of this problem.
  • We fixed an issue where recurring donation updates at Braintree were failing to pass address information for AVS fraud checks. Thanks to Marguerite at First Look for letting us know about the issue.
  • The immediate delivery subject is back where it should be, above the immediate delivery body on the Delivery screen; thanks to Joe at Everytown for the report.
  • Previously, it was difficult to turn off Communicating with Congress delivery even if you’d removed the US House as a target group for your page. Now we turn it off automatically in that case. Please note you'll still need to remove any user fields on the Edit Content screen that were added for CWC delivery (like prefix and street address ) if you don’t want them to be required.Thanks to Jessie at FCNL for reporting the problem
  • When setting up action notifications, you can now use commas, semicolons, or spaces to separate your To email addresses. Thanks to Beca from Everytown for the request.
  • More emojis! We added support for emoji in confirmation mailings, tell-a-friend emails, action notifications, and social sharing titles/descriptions.


Release Notes


Event Date Criteria In Mail Targeting

Clients with event campaigns that last for multiple weeks or months can now use date criteria on the mailing targeting screen to limit the audience to users near events in a certain time period.

For example, if you have events happening every weekend, you can easily target users who live within a few miles of next weekend's events only.

You'll find these options on the mailing targeting screen when you select event campaigns.

Those date options are also passed along internally as default values for the {% templatetag openblock %} withevents {% templatetag closeblock%} tag if you're using that mechanism.

Thanks to several clients for requesting this feature, including Jase for DFA, Chris and Scott at MoveOn, and Michael and Robin at the Bernie campaign.

Custom Dashboard Reports On Event Screens

We've added support for two new special reports you can use to display event-related information in the admin interface.

If you create a dashboard report named campaign_dash the results will be displayed on the Campaign Dashboard screen. This report receives {% templatetag openvariable %} campaign_id {% templatetag closevariable %} as a parameter.

Similarly, you can create a dashboard report named event_dash to be displayed on individual event detail screens, using the current event's {% templatetag openvariable %} campaign_name {% templatetag closevariable %} and {% templatetag openvariable %} event_id {% templatetag closevariable %} as parameters.

These join the pre-existing event_minidash which could already be used for a compact display of at-a-glance stats on event list screens in the admin UI.

All of these reports are standard dashboard reports that can be used to display any event related details. If you haven't taken the time to customize your dashboards, now is a good time and it's easier than you might think! Check out this video on how to create dashboard reports.

Extended Emoji Support For Event Fields

While ActionKit's Unicode support means that it generally supports characters from all languages, there are some fields which don't yet support so-called "four-byte" character codes used to record some extended emojis.

We've recently added support for these characters to several event fields, specifically the public description, "note to attendees," directions, and internal staff notes fields.

Blocking Event Creation

If you want to stop new events from being submitted for your event campaign, you can accomplish this by hiding its Event Creation page with a few small changes to your templateset.

Previously, hiding the Event Creation page would prevent hosts from viewing or changing existing events, but ActionKit can now distinguish between creating new events and editing existing ones. This change also applies to moderators or staff users acting as an event host.

We've attempted to patch existing templatesets, so you might find that hosts and staff users are now able to edit events when the Event Creation page is hidden. But, if you have customized your event templates, it's likely that you will need to edit your templates. If this is the case, make sure that your templateset reflects the Original templateset in its use of host_akid in the event_host_tools.html template and mod_akid in the event_moderate_tools.html template.

Hidden Event Pages

The Event Campaign Dashboard previously showed a blank row if you created an event page but then later hid it; we now show the hidden event pages so you can review them and make them visible again if needed.

Permissions for Event Pages

We've added permissions to the Events - Manage plus Campaigns group so that staff users can edit, hide, copy, and create event pages and campaigns with these permissions alone. You don't need the Pages permissions to do this anymore.

Fast Import for Custom User Fields

If you regularly import information about existing users as custom user fields, you'll love the new fast upload option!

Import pages have a new checkbox labeled "fast custom user-field upload."

As indicated, this option works if your upload only contains a user identifier and one or more custom user fields and only includes existing users. New users are not created; if your file includes new users those rows will fail and you'll be able to download a CSV of the failed rows. If your file includes other columns we will fall back to a standard import, unless you specify that we should skip the extra columns.

While the exact difference in performance will vary from case to case, it is generally five to ten times faster than normal imports.

This increase in speed is a result of bypassing a number of steps which are included in the normal upload procedure: no actions will be recorded, the user's updated_at timestamp is not modified, and no subscription changes are processed.

If you use this feature on a regular basis, there's a new option in the "Configure ActionKit" screen that allows superusers to turn this on by default.

The API also supports Fast Uploads with the user_fields_only parameter. Read more here.

Salesforce Settings History

When you update the Salesforce Global Settings screen, your changes are recorded and can be reviewed by clicking the History link in the top right corner of that screen. That log can be useful for pinning down when changes were made and identifying which member of your team is responsible.

Mailing Volume Warning

Internet service providers tend to view sudden spikes in mailing volume as indications of spam. To help avoid deliverability problems, we'll now display a warning if you target a mailing to send to a much larger audience than is usual for your instance. That warning encourages you to split the mailing up into multiple smaller mailings, spread out over several days, to help prevent damage to your sender reputation.

Assorted Fixes And Improvements

Trailing Slashes in Event URLs

If the Host Tools page's URL didn't end with a slash, the Edit Event Details and Cancel Event links would break. Now all the links work whether or not the URL ends with a slash. (If you still see broken links on your Host Tools page, you will need to update your templateset. See event_host_tools.html in the Original templateset for an example.)

We also fixed this problem for the Cancel Signup link on the Attendee Tools page. (If you still get a broken link when attempting to cancel your signup, you will need to update your templateset. See event_attendee_tools.html in the Original templateset for an example.)

Editing Targeting Reports While Mailings Are Sending

There have occasionally been problems in the past when someone edited and saved a query report just as a mailing that uses that report for targeting was in the middle of rebuilding its audience before sending. We've done some work to make this more robust and hopefully put the issue to rest. Thanks to Mitchell at Mothership for Turnout for reporting the details of a recent occurrence.

Fixed Links For Custom Field Definitions

If you created a custom field definition whose name contained an underscore, some links in the admin interface led to "not found" errors. Thanks to Benjy at Zazim and David at ONE for helping us track down which combination of circumstances triggered the problem.

Transactional Mailings Included In User Action History

When you click on a row in the admin screen for a user's action history, you'll see a summary of the confirmation mailing for that action. That display now also includes any other transactional mailings, such as admin notification emails and "in honor of" mailings. Thanks to Marie at NRDC for asking the question that inspired this feature.

ActBlue Refcodes Consistently Recognized As Action Sources

We fixed an issue with the ActBlue integration where certain specially-formatted refcodes were not recorded in the action source. Thanks to Ethan at Third Bear for PCCC for reporting.

Debugging Confirmation Messages With requires_value And Staff Account

If you use the {% templatetag openblock %} requires_value {% templatetag closeblock%} snippet in an after-action email, then sign the page with a staff user that would fail that check, you'll now get an error telling you that staff user did not have the required value, to help you in debugging your confirmation emails. Thanks to Ethan at Third Bear for for reporting.


One Click Donations

We are excited to announce native one-click donation support, thanks to our beta integration with FastAction. ActionKit clients can now can include instant donate links in ActionKit mailings and take advantage of the millions of saved payment credentials in the combined EveryAction and EA Digital Tools (formerly Blue State Tools) pool. When clicking an instant donate link recipients are charged immediately, helping you raise more money faster.

Snippets in the mailer allow you to insert a stack of suggested asks:

You can edit the appearance of the buttons or provide a single link:

If you're interested in helping to beta test this feature, please get in touch!

With the release of this feature, we're disabling Remember Me and our old Instant Donate system. If you have any pages set up with Remember Me, don't worry -- that option won't show up anymore but your pages will still work. If you'd like to participate in the new hotness, check out Cross-site Prefill which uses EveryAction's pool of millions of cookie-based saved profiles.


Event hosts don't have to confirm their emails

You can now turn off the requirement that event hosts confirm their email address on the Campaign Settings page. (It's still on by default).

If you uncheck this, you need to consider how the rest of the event creation flow will work for volunteer hosts. For example, you may still want to send an after action confirmation email to host so they have a link to their host tools. An example of this has been added to the documentation.

Also, remember, the default thank you page after event creation tells hosts to check their email to confirm their event. You will want to edit the event_created.html template if you aren't sending a confirmation email.

End user event search by state

When your users are searching for an event near them, if they type in a state abbreviation or name instead of city or zip, we'll display all events in the state.

Donations Query Builder Bug Fixes

  • We no longer generate incorrectly high results for payment "totals" display columns for recurring orders when you use them in combination with the "was paid" filter criteria. Thanks to Mais at Syria Campaign for reporting the issue.
  • If you used the "Users > Number of Payments" or "Users > Sum Of Payments" items and then supplied a date range, the date criteria were previously applied incorrectly.Thanks to Marguerite at First Look for letting us know about the problem.
  • Amount of Highest Payment filter and the User Donation History page erroneously included recurring transactions that had been refunded. Thanks to Bianca at the Bernie campaign for reporting.

Salesforce Sync Improvements

  • Salesforce-origin opportunities synced into ActionKit only had a date in the created_at field but the field in ActionKit requires a time. Previously this defaulted to midnight, causing issues with reports and the Donation History page showing the incorrect date after timezone conversion. Now we use noon instead of midnight, so your reports and the Donation History page will display the correct date in almost all cases.
  • When a recurring order that originated in Salesforce is synced to ActionKit, we now create a row in core_transaction with the "recurring_order_create" type. This fixed a problem where some reports, like the Page: Recurring Donations Created (used in the Page Drilldown Dashboard), would not show these recurring donations. We've also retroactively fixed this for all affected orders. Thanks to Michael at Firstlook for flagging this and the one above.
  • We now accommodate a corner case where the sync would fail if a donation didn't have an associated payment. Thanks to J Street for finding this one!


  • Signatures are NOT delivered to federal legislators via immediate delivery, so if your page ONLY targets federal legislators, immediate delivery is no longer displayed as an option. If you aren't targeting the US House, Communicating with Congress is not displayed. Thanks to Emily at the Justice Collaborative for the bug report and inspiration.

  • Previously, if you used the code or plain editor modes to add a <meta> tag to one of your HTML fields, and then toggled into the visual editor mode, your meta tag would be removed. Our WYSIWYG had strong opinions about those tags only appearing in the <head> section of the page, which is technically correct, but in practice most browsers allow these tags to in the body, so we have updated the visual editor to be more flexible. Thanks to Mitchell @ Mothership for Progressive Turnout for pointing this out and clearly articulating the case for changing this.
  • When browsing the admin interface in recent versions of Chrome, many select boxes, aka drop-down fields, had two sets of arrow icons near their right edge, as Chrome recently changed which experimental CSS attributes they supported. We now supply both the Mozilla and WebKit versions of these attributes and these fields have returned to their normal appearance. Thanks to Jase at 350 for reporting!
  • We're still killing those erroneous prompts about losing data when you save your changes. Aaron for Pollinis found this one when editing and then saving the order of custom page fields. Please help us stop this insidious and irritating error! If you see something, say something.


Timed Sends

  • Timed Sends and Test Groups have made up and will now work together. Thanks to Nathan at Faithful America and Annie at Indivisible for letting us know. You'll see a rough count and send time on the haiku screen and the Test Group screen includes a note about the timed send:

  • On the other hand, Rebuild at Send is not available with Timed Sends. The targeting set only rebuilds when the targeting changes or a rebuild is requested by a staff member. This was not clear in the UI so we will now remove the Rebuild checkbox if you've made the mailing a Timed Send (either with a merge query or by checking 'Local Time' on the Proof and Send screen). If you change the mailing back to a standard send, the 'Rebuild' checkbox reappears. Thanks to Vojtek at SumOfUs for reporting.

  • Max emails/secondMax emails/second no longer displays as an option for a Timed Send mailing.

  • We've improved the notifications you'll receive associated with a Timed Send mailing. You'll get an email letting you know that your Timed Send messages are being built and an email notifying you once all message have been sent.

  • And, we've made some clarifications in the admin UI, like adding "Timed Send" under the mailing subject on the Sent mailings list and starting a Timed Send mailing on the Scheduled list with the status changing from Generating to Waiting to Sending before the mailing moves to the Sent list once all messages are out.

New Optional Email Notification When Event Details Change

We've added a new email that will be sent to hosts and attendees of a particular event when certain details change (e.g. new location), if the host checks a box on the Edit Event page:

By default, the email looks like:

The text for this email lives in the event_email_details_changed.html template and can be edited there.

To enable use of this email, a small change needs to be made to your event_create.html template. We've patched this to templatesets that are still very similar to Original but most of your sets are customized so you'll need to apply the change described in the documentation manually.

Thank you to Tibet at Demand Progress and Hannah from Bernie for the request!


  • On the after-action notification creation screen, you'll see a list of pages that have the notification enabled. Thanks to Jase at 350 for the request.
  • We fixed a bug that caused merge queries to fail if they had SQL like:

    SELECT id AS "user_id"
    -- , "foo" AS "foo"
    FROM core_user

    That works as a report and with this release, is also recognized by merge queries. Thanks to Sean, Robin, and Joel at Bernie for helping us find this one!
  • The HTML code generated for embedding an ActionKit page on your website now automatically includes support for source codes. When you create a new embedded page from the Embed AJAX Signup screen then include a source parameter in your URL, the action recorded will include the source. Thanks to Atiya at 350 for the suggestion.
  • Clicking the submit button on the "upload user data" form multiple times could previously cause multiple upload jobs to be fired off in parallel. This change disables the submit button for a few seconds after it is clicked. Thanks to Sam at ActBlue for bringing this problem to our attention.
  • Type-to-search is now available for four pull-down menu fields on the mailing compose screen: from line, email wrapper, merge query, and merge file.
  • If you used the query builder to generate a report that included currency values, and displayed the results using a Google Table view, then clicked the column headers to sort the results, the contents sorted in alphabetical order ($100, $2, $30). We've changed this so they now show up in numeric order ($2, $30, $100), which is almost always what you actually intended. Thanks to Kenneth working for AOC for flagging the issue.
  • We fixed a bug where users in some parts of Arizona were getting the wrong timezone assigned. Thanks to Nicole from National Nurses United for reporting.
  • When using the query builder, timestamps displayed in "Numeric Date" format were showing up in the "Abbreviated" format -- and if you asked for the "Abbreviated" format you actually got the "Written Date" format. This has now been sorted out. Thanks to Andy at Yang 2020 for the report.


Events Improvements

When linking attendees to an event using the campaign name instead of a page name, we now always display a page that matches the language used to create the event. Previously some links defaulted to English.

We also added an option to find events by federal legislative district to the Advanced Search on the Event Campaign Dashboard.

This change makes it easier to assign turf to moderators based on CD using the approach outlined in our blog post on this topic.

ActBlue one time donations that become recurring are recorded as such

We've accounted for a case where ActBlue converts a one-time donation to monthly so we can correctly assign all related donations to a recurring profile in ActionKit. This will happen automagically in future. After this release we will clean up missed donations in this category as well. Thanks to Adam at MoveOn and Lee at Everytown for the examples.

When no result is the best result

If you've got reports that intentionally return an empty string if all is well, you may have noticed that these reports never seem to complete. Now they do! And why would you write such a report? Our master of the admin UI dashboard, Shannon Turner, created such a report to include in UltraViolet's pre-flight checklist mailing dashboard, which you may have seen at ClientCon. The report would return nothing if everything was in order and an error if something was missing. Thanks to Shannon for finding the bug as a client and fixing it as a Walker!

No more creating a second report with the info you need to make sure your mailer targeting report is finding the right users.

Mailer targeting queries can now return additional columns, after the user_id column. The additional columns are ignored by the mailer but they make the report easier to spot-check and reusable for a merge query or regular report.

Error messages about emojis with emojis!

If an end user tried to submit unsupported emojis on one of your forms, they would see:

"Sorry, we're having trouble handling your request at the moment. Please try again in a few minutes."

We've changed this message to accurately describe the problem, which will not be fixed by waiting a few minutes. Now they'll see something like this:

And it's translateable too:

Thanks to Maya at Indivisible for flagging the unclear message.

Better international geocoding

We completed the last step in our improvements to geo-coding for international users. We've re-geocoded all existing international users with an address and turned on Bing as the fallback to Open Cage for new or changed international geocoding.


  • We've improved the error messages you see if you create a dashboard report that fails. Instead of “Report failed”, we’ll display a more informative error if possible.
  • We now check for daily/weekly cached merge queries that are about to expire and rebuild them for recent mailings that use them, so that proofs and targeting builds don't have to wait on these to run. Previously we only did this for cached targeting queries. Thanks to Tim for Bernie for the report.
  • With this release, only superusers or staff with the Users permissions can merge user records.
  • Previously some mailings that were stopped or died did not have the finished_at field set; now they will. Thanks to Brandon at Mercy Corps for the report.
  • We've changed the ActionKit ID assigned to recurring payments in Salesforce that originated outside of ActionKit. Going forward, these Opportunities will have an ActionKit ID of "RecurringPayment-[transaction id]". The value we were using previously would sometimes conflict with other ActionKit IDs, causing the sync to fail for these donations. After this release we'll clean up the conflicting IDs for old donations as well. Thanks to Shawn at J Street for discovering the failures.
  • We fixed a small error that led to all actions in the spam check log having a minutes value of :09. Thanks Jase at 350 for observing and reporting the issue!
  • We added retries to compensate for a rare infrastructure failure that could cause mailings to die. Thanks to Nathan at Faithful America for the report that helped us identify this issue.


"Save as Report" to Add Query Reports

On the Reports tab, we combined the old "Run Query" and "Add Query" menus. Click "New Query" and select a query type, then choose displays/filters or write SQL, and (if you want) run it to test. If you want to save your new creation, click "Save as Report" (at the top of the page or next to the submit button) to assign a name, etc. and save it.

Passwordless Login for Event Hosts

We've updated the templates for emails to event hosts to always include a login string and not require the host to set a password before using their tools.

If you've edited event email templates in your templateset, you may not receive this change automatically. The key change is to add {% verbatim %}&i={{ user|login_string }}&l=1{% endverbatim %} to links to host tools. You can also look at the Original templateset, which has related changes like text warning hosts not to share their personalized links.

Upload Volunteer Moderators for Events

In addition to being able to upload events and attendees, you can now upload a CSV or TSV file of volunteer moderators to review events. You'll see "Upload Volunteers" in the list of event pages on the Campaign Settings screen:

More Events Improvements

  • You can now base your event email templates on those of another templateset with code like {% verbatim %}{% extends "Other templateset/event_email_created.html" %}{% endverbatim %}. Thanks to Joe at Everytown and Matthew at 350 for reporting that this didn't work before.
  • In mailings to recruit event attendees, you can now use the code {% verbatim %}{% for event in events|dictsort:"least_full" %}{% endverbatim %} to sort the events with the most open slots to the top. Thanks to Bianca at the Bernie Sanders campaign for suggesting.
  • The event mini-dashboard report is now available on the Event Details screen as well as in the event list. Mini dashboards let you embed custom reports in certain parts of the admin user interface. You can learn more about mini-dashboards in the docs.
  • We've revised the event merge interface so it's clearer when we will send a message to hosts or attendees. Thanks to Rachel at 350 for bringing the issue to our attention.
  • We now handle event submissions or uploads with long US state names, like "Washington" instead of "WA." Thanks to Kenneth working for the ACLU's PeoplePower campaign for finding this issue.

Salesforce Sync Improvements

We now keep track of whether ActionKit user IDs and emails match between users and mapped Salesforce contacts. The sync relies on these fields matching, and contact updates or donations may not flow when they do not match. The user profile page will warn when there's a mismatched ID or email for a mapped contact. A new report, "Salesforce users with mismatched emails", helps identify users with mappings that match on ID but not email.

We've also normalized how we choose a contact when syncing a user for the first time, when multiple contacts have matching email. Now, the contact with the largest number of donations is selected.

Separately, we've made some fixes to donation sync. We now correctly import recurring payments as failed if marked Closed Lost in Salesforce, thanks to a report from Marguerite at First Look Media. We also better handle donations or recurring payments deleted on the Salesforce side, thanks to a report from Shawn at J Street.

Mailing Targeting Speed Details

You can now see how long each query in your mailing's targeting took to run, to help understand what's causing slow queries. On the Proof and Send screen, you'll now see a "View SQL and Query Times" link next to the Targeting section header:

You'll see the times in italics underneath each query:

Currently, run times for cached query reports aren't available in this view. We hope to add them at some point in the future. However, you can now see how recently a cached query was run in the Targeting section on the Proof and Send screen:

Everything Else

  • When composing a mailing, you can now preview a specific user's message by entering their email address or their ID. Thanks most recently to Jase @ 350 for the request:
  • We've fixed an issue where HTML editors in the admin could end up stuck in plain-text mode. Thanks to Keith at PCCC for reporting.
  • We've fixed an error that could cause petition delivery previews to incorrectly fail if the petition had test signatures more than a week old. Thanks to Lucia Martinez at FreePress and Irma Corado at Indivisible for reporting.
  • The query builder now produces faster SQL for queries involving multilingual campaigns. Thanks to Julia at 350 for reporting the performance issue.
  • The new ActBlue webhook integration will avoid resubscribing users who were unsubscribed since the date of their donation. Thanks to Eric for the Inslee Campaign for reporting the issue.
  • The new ActBlue webhook integration will now correctly back-date refunds when importing old data.
  • We've corrected a rare situation where a user submitting a PayPal-enabled donation form twice could result in a duplicate gift. Thanks to Brandon at MercyCorps and Marie at NRDC for their reports.


Prefilling: get more actions, do more good!

With this release, you can enable prefilling on your ActionKit pages using EveryAction's Action Profiles -- a pool of millions of cookie-based saved profiles from users who have previously submitted an action on EveryAction. Enabling this feature can boost your conversion rates from Facebook, your homepage, or other places users can't be recognized by their AKID. If you enable this feature, your users' data will be saved to the shared profile pool and will be prefilled on other organizations' forms.

Contact information, occupation and employer, and several custom fields that are built-in in EveryAction will be available for prefill (if the user has submitted values for them). No payment information is prefilled. This isn't a one-click donation feature, but that is coming in the future! Read the prefill section of the manual to see what fields are available and to read more about how this works.

Turn on this feature by following the "Prefill settings" link on the Pages Tab.

Improved UI for Sending to Your Users At a Specific Local Time

We've made a bunch of changes to offer you more choices and clarify what's happening when you choose the option to schedule a mailing to send to your targeted users at a certain local time. Specifically:

  • For users whose send time has passed, you can choose: either send the next day at 9 a.m. or send immediately.
  • The haiku screen has a summary of the expected send time.
  • The stopwatch icon indicates timed sends throughout the UI.
  • The mailing dash now says "Generating" during the initial send job, then "Waiting" while no mail has been sent, and then "Sending" once delivery has actually started.
  • The send time calculations are now based on mailing send time, not the current time -- the mailings won't look artificially slow.

Thanks to Courage Campaign, FCNL, Indivisible, PFAW, PCCC, and more who made suggestions!


Merging Events: You can now combine two events into one -- for example, if a host accidentally created a duplicate event or you only want one event in each city. Hosts and attendees from either event are all added to the event you select as final and all links to the old, merged event redirect to the final event. The merge link is available on the event detail page (reached by clicking Manage for a specific event from the list of events in any event campaign) and brings you to a screen in which you can select the second event and choose which pieces of information will be retained from each event.

Thanks to Everytown, the Beto campaign, and MoveOn, among others, for the use cases.

Multilingual events: When managing events, the Act as Host link now respects the language the event was created in rather than always defaulting to English. Thanks to Rachel at 350 for pointing out the issue!


  • Tags starting with special characters are once again findable through auto-complete in the mailer. Thanks to Nabil at Sum Of Us for pointing out the problem. (Also, check out A Tagging System that Works for why tags starting with special characters might be awesome for your organization.)
  • The parent mailing of a recurring series (the one you can't edit or send) no longer shows the count and targeting rebuild date -- we never rebuild the targeting sets for the parent. Thanks to Scott at MoveOn for flagging the issue.
  • Choosing a winning subject line for a mailing that is part of an A/B test group now correctly excludes all mailings from the group when sending the winner. Previously this worked correctly for choosing a winning mailing but not for choosing a winning subject. Thanks to Jay from DFA.
  • If you manually selected a winner for an automatic subject line test, a bug showed the automatic full send still running due to a UI error; it wouldn't have actually sent. You won't see that phantom send anymore, thanks to a report from Tara at Win Without War. Go Wolverines!
  • A new variable is available in the mailer: {%verbatim%}{{ recurring_schedule_id }}{% endverbatim%}. You can append it to links to, for example, keep track of welcome series' performance in your analytics tool. Thanks to Jake Holland for the request.
  • Check out the documentation for an updated list of donation snippets available in the mailer.
  • The mailing preview on the compose screen now shows the preview text below the subject line. Thanks David at ONE for suggesting.

Templatesets and Developer Resources

  • When you go to preview an edited template, we'll save your changes before loading your preview so you don't need to remember to save the draft first.
  • The staff user permission set "Pages plus Templatesets" now includes the ability to set up Github connections and manage custom templateset fields. Previously only superusers or those with All Models permissions could do this. Thanks to Scott at MoveOn for the idea!
  • We added more details on how to use {%verbatim%}{% log_context %}{% endverbatim %} for ActionKit development. Keep in mind {%verbatim%}{% log_context %}{% endverbatim%} is most useful when trying to determine what snippets are available to use on a page or mailing, and is not a key-value store of all of the data. Thanks to Jase at 350 for asking for more info!
  • ActionKit has a safety in place to keep you from deleting built-in templates from your templateset. Previously, if you tried to do this from Github, the attempt silently failed. Now we show a notification on the templateset page and a log entry on the job details screen. Thanks to Sky at MoveOn.



  • The Salesforce mapping validator now checks built-in fields like Transaction ID to make sure the type and allowed length are appropriate.
  • Salesforce mapping now shows a section with the fields that are required and not configurable.
  • Partial refunds made in ActionKit will now sync to Salesforce as written off payments.

Everything Else

  • The witch is dead! In this case, the witch is the core_orderrecurring.occurences field. If you've asked about it previously (and we said, "oops ignore that dumb field because whatever it says is wrong"), you'll be happy to know we just got rid of the dumb field. A few of you had included this in a report -- we've removed it since it was just telling you lies.
  • On the Pages and Reports tabs, accidental double-clicks will no longer cause the page or report to save twice in parallel. This will avoid the same report running twice and avoid duplicate form fields being created during user form customization when you create a page. Reported by Irma at Indivisible -- thanks!
  • You can now filter mailings and users by the year and month they were created, as you can do for Pages. Thanks Nikki at ONE for the request.
  • Report parameters can now skip the quotes! Use the syntax ORDER BY ccu.page_id LIMIT {% verbatim %}{% sql_unquoted limit %}{% endverbatim %} to enter a number that's not in quotes. Be careful with using {% verbatim %}sql_unquoted {% endverbatim %}-- this could be used an attack vector if an attacker can control the parameter values.
  • The schedule field on the proof and send screen doesn't have autocomplete anymore so you can always see the calendar picker. Thanks to Keith at PCCC for the report.


No more whitespace under mailing previews

If your mailing body or wrapper included elements with a relative height, such as a <table height="100%">, the on-screen preview function would often wind up becoming taller than it needed to be, leaving a lot of blank space on the screen that you would have to scroll through. We've taken steps to avoid this happening any longer.

(If you still notice the problem, please contact support and send us an example of a mailing where you're seeing this happen.)

Thanks to Alex at, Jadon-Maurice at Indivisible, and David at ONE for each reporting this problem, and for their patience as we figured out what all of their use cases had in common.


Normally, variables stored by tags are not available outside of the current template block. This means that a variable stored in a block, or inside an included template, cannot be accessed in other blocks or included templates. The {% remember %} tag allows a variable's value to be retrieved outside of the scope of the current template block within the same page render.

For example, the below template will output the last value that met the condition of the if statement:

{% for message in suggested_tweets %}
  {% if message|length > 140 %}
    {% remember message as last_big_tweet %}
  {% endif %}
{% endfor %}
{{ last_big_tweet }}


  • It's now possible to create mappings between ActionKit fields and unrestricted picklists in Salesforce. With these fields, Salesforce will accept a value from AK even if it wasn't an existing picklist option.
  • A tweak to the date format in the Salesforce sync will cut down on unnecessary API calls.
  • We addressed a few additional use cases in the ActionKit/Salesforce mapping validation.

Everything Else

  • We found and fixed another place where the 'changes not saved' error would pop up even though no changes were made.
  • The confirmation message you receive after saving a short link now includes the URL of the new short link so you can easily copy it for future use. Thanks to Jase at 350 for requesting this feature.
  • The "customize user form fields" feature allows you to choose names for custom action fields, and then automatically prefixes them with action_. However, if you entered a field name that already began with action_, we would invisibly add a second copy of that prefix but we don't anymore. Thanks to Julia at 350 for letting us know about this problem.
  • The donations query builder omitted a necessary table join when attempting to display the total number of first-time non-recurring donors. Thanks to Nathan at Moms Rising for bringing this to our attention.
  • When using Download Actions to get users' phone numbers, we previously only included phone numbers with the source user. Thanks to Ryan at UltraViolet, we're now showing phone numbers with any source.
  • The subject line autotest automatically picks a winner after a duration of your choice and sends to the rest of your targets. The winning mailing will now preserve any auto-excludes you set for the initial test mailing. Thanks to Jesse at FCNL for the report.



Check a box to send your mailing to users at a specific time in their local time zone.

The timed sends feature now includes a UI for sending to users at their local time. To schedule a mailing for each user's local time click "Schedule for Later" and then check "Send to each targeted user at the time selected in their local time zone." You can still use merge queries for other implementations. Thanks to ClientCon participants for your feedback!

Limit the number of users a staff member can email with the new Limited Send permission.

We’ve added a setting to the CONFIG screen that you can use to define a ‘limited send’ permission. By default, the limit is set to 5 percent of your list, but you can edit this number.

The setting is used by the new Limited Send permission that you’ll see on the Change User screen. Assign this to any staff member and they can only send to the percentage of your list defined in the Mailer Settings. Staff users with pre-existing send permissions can still send to your full list.

More mailer improvements:

  • The new {{ event.state_name }} snippet returns the full state name, in addition to the pre-existing {{ event.state }} that provides the state's two-letter abbreviation.
  • The "Stop jobs" feature on the Mailings tab, normally used to stop slow mailing rebuilds, would previously also kill scheduled mailings that were preparing to send. Scheduled mailings preparing to send will now be left alone, and we've made it possible to stop individual mailing rebuild jobs.
  • Extended run time for cached merge queries. When you define a merge query report, you may want to set it to refresh hourly, daily, or weekly to avoid running a slow report at send time. Previously, cached merge query reports only had 30 minutes to finish. We've extended that to 2 hours.

Thanks to Michael, Kendall and Robin from the Bernie campaign for flagging the three issues above.

  • We improved mailing targeting based on location radius so it uses lat/lon rather than location code. That matches how we target events and improves accuracy for users with street addresses.
  • An empty "Also Include" section in mailing targeting was inadvertently expanding targeting to all users. That's been resolved. Thanks to Gabriel at Majority Action and Nathan at J Street for the reports!
  • We adjusted the way we handle default list exclusions in mailer targeting to protect against an edge case where the default exclude was skipped. Thanks to Jase at 350 for the report.


Paypal: If you've set your PayPal User Requirements to “No user data required”, ActionKit will create an anonymous user as a placeholder. If the user completes the donation, we associate it with the email address we get back from PayPal, creating a new user if necessary. Previously, the donation action creating the new user didn’t have created_at=1, but it does now -- thanks to Brandon at Mercy Corps for the report.

And, we fixed a rare situation where users pressing Back could erroneously have PayPal recurring donations marked cancelled. Thanks Adam Klaus at MoveOn.

ActBlue: The new ActBlue sync takes some donation data and drops it into special custom user fields if they're set up. In addition to the existing employer and occupation fields, we now support an express_lane custom user field (using the text field type) to indicate whether users are ActBlue Express Lane users. This matches the previous version of the sync. Thanks to Kenneth working for AOC for the report.

Salesforce: When a user updated their recurring donation amount in ActionKit, that new payment amount wasn't reflected in Salesforce. We've fixed that issue, thanks to Alon at J Street who reported it.


  • You can now include past_due recurring donations in the query builder, thanks to a report from Marie at NRDC!
  • On the Compare Mailings Report, we've added a separate column for selecting the winner, which is hopefully clearer than selecting the winning subject. In a future release, we'll also make this change on the the Individual Mailing Report. Thanks to Jessie at FCNL for kicking off this change.


ActBlue Integration

  • Our new ActBlue integration now stores refcode as the action's source (just like the old integration). Thanks Lee at Everytown for the suggestion.
  • For users of the new ActBlue integration, failed one-time donations weren't marked failed in the core_transaction table, which could lead to erroneously high totals and one-time gift counts in some reports. We've fixed that. Thanks to Jack working for the Kamala Harris campaign for reporting the issue.

New Permissions

We've added new permissions for managing model mailings and model pages so only designated users can create and edit models. Staff users who already have Pages - Edit, View, Create and Mailings - Edit (with or without send) permissions currently have access to managing models, so they will be granted these new permissions automatically. You may want to consider and remove the new models permissions for some staff users. Note: The All Models permission is unrelated to this change -- it's used for granting unlimited access.


  • We made event recruitment emails a lot faster. Thanks to Robin working for the Bernie Sanders campaign and many others for the request!
  • Often, users see a login screen before accessing another page (like event tools). If the user's login attempt fails on the first try, we'll keep the post-login redirect information for subsequent login attempts. Thanks Eric at the Bernie Sanders campaign for the report.


One-off queries!

As promised, the life changing magic of temp queries will arrive in your instance tomorrow morning. You'll be able to run a query (using SQL or the Query Builder), see the results on the same screen, and edit and rerun to your heart's content. If you realize this is a useful report that you want to save, you can do so. You can also email or download the results.


Include multiple event campaigns in one mailing

We've made it possible to include multiple event campaigns in one mailing so you can easily do things like recruit attendees to the closest event across campaigns. You can do this using the new snippets that work with the event campaigns selected on the targeting screen. Just select multiple campaigns!

Alternatively, you can use a campaigns parameter with a comma- or space-separated list of campaign names with the {% withevents %} tag, listing the campaign shortnames between single quotes with the parameter campaigns:

{% requires_value %}
{% withevents with user as nearby_user 'party onemoreparty' as campaigns 30 as radius 30 as limit %}{% requires_value events %}
{% for event in events %}
    Event: {{ event.title }}<br />
    {{ event.starts_at_full }} <br />
{% endfor %}
{% endwithevents %}

The event search is conducted across all of the provided campaigns at once so that sorting can be applied to all of the results.

In the next release, we'll be adding support for including multiple campaigns on your event search page and map.

Host tools login

If you include a link to the host tools page in your bulk mailing to hosts, you can apply the login_string filter and hosts will be able to click through to their events without logging in or setting a password.

Silent event changes

In some cases, you may want to cancel or otherwise modify an event without sending a notification to the host. We now allow both staff and moderators to suppress notifications to hosts, although the suppression option may not work if you have heavily-customized moderation templates. Thanks Everytown, FCNL, and J Street for the requests!

Query string with corrected campaign name

If end users visit an event page with both a campaign name and an event ID, we redirect them to the equivalent URL with the correct campaign name filled in -- important if you're reassigning events to different campaigns through the API.

These redirects used to drop the user's initial query string, but we now preserve that information through the redirect. Thanks Ethan at People Power for the suggestion.

Advanced Pages and Mailings search options

Ever wanted to see only sent mailings in the last year that went to over 100K users? Or only mailings with a particular tag? Well now you can do that!

As on the Users Tab, we've added an advanced search feature, which basically exposes the Mailings Query Builder options so you can build your own search criteria. We also added a Saved Search section just like on the Users Tab so you can save and re-use search queries and use SQL to optimize long-running queries. Same things apply on the Pages Tab.

Thanks to so many of you for requesting specific filtering options for both pages and mailings -- you inspired this solution!


  • Salesforce: A new mapping option lets you send ActionKit list subscriptions over to your Salesforce contacts.
  • Petition delivery: We brought back the {{ section.signatures.count|intcomma }} for petition delivery cover letters after a temporary absence.
  • Failed credit card reports: We updated failed credit card reports to ignore ACH and PayPal donations, since users can't update their recurring commitments for those donation types. Thanks Marguerite at First Look Media for the report!
  • User phone numbers: Phone numbers entered from a user's overview in the admin will now have a source of admin instead of user, since the staff member is the one entering the phone number.
  • Clickable call page numbers: Telephone numbers for targets on call pages now appear as tel: links rather than plain text. The main feature of these links is you can click to call on mobile devices, iPhone-connected Macs, or a variety of call-capable desktop apps. This change has been applied to both main contact numbers and "local office" numbers. Thanks to FCNL for flagging!


Event hosts can now email attendees even when their events have hundreds or thousands of attendees without experiencing timeouts. Event-related messages have been moved to a background job if there are more than 20 recipients. Thanks to MoveOn and Courage Campaign for running huge events and requesting this feature!

The Salesforce sync is now officially out of beta. Thanks to the Courage Campaign, First Look Media, J Street, Ultraviolet and Faith in Public Life for helping us shake out the big bugs. The changes you'll see in this release:

  • Take control of which ActionKit donations sync to Salesforce with the new Salesforce Donation Sync report. For users that are synced to Salesforce, only donations and payments selected by a report categorized salesforce_donations_sync will transfer to Salesforce. By default, that'll be all donations. Thanks Alon at J Street for the request!
  • We resolved an issue that caused some recurring donations to skip pledges. The missing installments were being added by a fixer script we've been running, but that used extra API calls. With this change we'll use fewer API calls. Thanks LJ at First Look Media for letting us know!
  • We're using core_transaction.trans_id field for de-duplicating transactions between ActionKit and Salesforce, instead of so we've removed order_ID mapping setting.

Mailing Targeting

  • We fixed an issue where test groups that had already started running could fail if targeting rebuilt at the wrong time. Thanks to Tim working for Bernie Sanders for the note!
  • A/B test groups previously always rebuilt mailing targeting at send, causing some slower send times. We now support the option to rebuild in advance, thanks to Shelby working for Kamala Harris.
  • Swapping out the merge query that's used for targeting your mailing will now force the mailing targeting to rebuild. Thanks Robin working for Bernie Sanders for flagging.


  • We made a few more changes to international geocoding. We'll geocode international users, even without a full address, so they can be targeted for timezone specific sends. And we will not re-geocode international users unless their address has changed.
  • We updated permissions so staff with Pages permissions can create and edit Event Moderation pages. Thanks Scott at MoveOn for the request.
  • Whenever you save changes to a legislative or special target group, ActionKit will redistribute signatures for pages using that target group. Thanks to Manny at MoveOn for the report.
  • The query builder now recognizes that "active" recurring orders include both those with status active and status past_due.
  • In a previous release, we added support for geocoding events to their corresponding state legislative districts. That's now available in the query builder so that you can easily generate reports by the state legislative district where events are taking place.
  • When you set up automatic delivery using the batch option for petition or letter pages you need to manually include a link where your page's targets can download the signatures. This was too easy to forget! We've made the link required and available in the snippet menu for easy insertion. Thanks Conen at Progress Now for flagging the issue most recently.


Upload event signups

You now have the option to bulk upload a CSV of signups for a particular event from the Event Campaign Dashboard screen, next to the event signup page. Event signup uploads work just like user imports or event host uploads.

Each row of your file must include the event ID and the user's AKID or email address and can include other user information. Include an attended column with a value of 1 for users who were present or 0 for users who were not. Blanks leave a user's attendance record as is.

Each user who is uploaded will receive a confirmation email if you have one for the relevant event signup page. Suppress the confirmation message by changing Upload Settings or including a column, skip_confirmation, with a value of 1. If you're marking attendance, remember to suppress the confirmation so you don't remind users about the event they've already attended.

Relatedly, we've moved the "upload events" link next to the event creation page. For clients managing multilingual event campaigns, this means you can now upload events to each of your campaign's language-specific event creation pages, reflecting the language of the event creator.

Improved processing -- template changes required

We added support for's Accept.js. You can find a basic implementation in the Original templateset, and additional documentation on how to incorporate these changes into your existing templates.

If you fundraise using, we encourage you to make the changes as soon as possible. We will eventually require this for all donation pages. If you get stuck, please request help through the support tab and be sure to test the changes with a real donation.

Geocoding events by state legislative districts

In addition to geocoding events by federal congressional district, we now geocode events by state legislative district, making it easier to host events around state politics. You'll find this information in two new columns on the events_event table named us_state_senate and us_state_district which hold values in the format "NY_031". (Query builder support for these columns will be included in an upcoming release.) Thanks to Ben at PFAW for the request.


-Google pushed an upgrade to its charts, affecting the way our reports displayed. We've made the necessary changes for proper display -- thanks to Matt at 350 and Ben at Progress Now for flagging the issue. -Previously, if you changed your page's advocacy targets, we reassigned signatures to the correct target when a PDF or CSV was generated. This led to stale data in reports. Now, we'll reassign signatures if needed when the page is saved. In an upcoming release, we'll reassign them whenever a change is made to the target group. -A rare error involving Unicode output in dashboard reports has been fixed, thanks to Irma at Indivisible who found this sneaky bug. -If you used the query builder's mailing "performance" items as filters, you would not get accurate results, because the query builder did not know how to filter on aggregates. This oversight has been rectified, and the query builder now knows that these items need to use the SQL syntax for HAVING rather than WHERE. -We attempt to determine which time zone each user lives in based on the location data they provide. Now, the user, action, and clicks query builder report types all offer time zone as a field under the "Home Address" item in the display and filter tools.


-We resolved an issue where a failed mailing targeting build could leave a mailing in a bad state. The mailing would appear to be still building and wouldn't send at its scheduled time. Thanks Jordan at CREDO and Robin working for Bernie Sanders for the reports. -When users change their recurring payment amount, their user account view (/me) will show the amount received, not the amount of their new commitment, for past payments. Thanks Suzi at for the report.



We made major improvements to international geocoding: With full street addresses, users and events should return more accurate latitude/longitude. Thanks to 350, SumOfUs, and ONE for flagging issues with international geocoding.


  • Reusable reports are now easier to share and edit. See and edit parameters at the top of the report results screen.
  • Filtering on the user's email domain in donations query builder will no longer attempt to match the full user email address instead of the domain.
  • The Download Actions report can now successfully handle custom action fields with apostrophes. Thanks to Kenton at PCCC and Will at ECU for reporting the issue!
  • In the Users query builder, if you used the "Amount Of [First/Most Recent/Highest] Payment [During Time Period]" item using the modes "First Payment", "Most Recent Payment", or "Most Recent One-Time Payment", and you also specified a date range rather than "On Any Date", you would get a SQL error that prevented the query from running. Thanks to Matt at 350 for finding this error!


  • The user-facing recurring update forms now support ACH orders so your end users can update their bank info themselves.
  • We added caching for computed values for user and donation stats (like highest previous contribution and average donation) to improve mailing send times. Thanks to Maya for End Citizens United for originally flagging the slow builds!
  • Copy custom targets with custom boundaries without causing an error!
  • Custom donation amounts with commas (e.g. 10,000) now pass validation. Thanks Eileen at DSA and Scott at PFAW for reporting (and congratulations on getting donations with commas online)!
  • User field labels won't be overwritten by different-language translations. Thanks to Zazim and Felix for ONE for the report.
  • Staff can now mark a record in the spam log as "spam" (thereby unsubscribing the user) if the default setting in the config didn't suppress all spam records, or click to reverse the action.

Salesforce (Beta)

  • We no longer attempt to sync ActionKit users to Salesforce if they don't have a last name (required by Salesforce), even if you forget to exclude them in your sync report, saving you API calls.
  • We include a built-in limit on percent of Salesforce API calls used to avoid maxing out your Salesforce org's daily calls. You can now configure that limit in the Salesforce integration settings to suit your needs based on how ActionKit fits into your Salesforce implementation.
  • In ActionKit users' donation history, donations from Salesforce now include "From Salesforce" in the one-line record summary.


Re-Send Confirmation Mailings

When a user misses a confirmation mailing, they may get in touch asking for a copy. We added a link under eligible actions in the user's action history tab so you can resend confirmation mailings for actions on event creation, donation, recurring donation update or cancellation pages. This link will only show for actions completed after this release. A copy of the original mailing, including user-specific information about their donation or event, is resent and an additional transactional email is recorded and displayed on the user record. Thanks to NRDC, Represent.Us and Marguerite at First Look Media, among others, for requesting.

Referral Counts

Motivate your users to share your work with new referral counts, showing them how many times they've shared plus the clicks and actions they've generated. Referral counts are available in pages, mailings, and confirmation mailings. Thanks to FCNL for the request that prompted this change.

{% if user.stats.share_actions > 0 %}Thanks to you, {{ user.stats.share_actions }} have supported our work.{% else %}We need your help to spread the word.{% endif %}


  • Query Builder samples: We've added more sample reports, built with the query builder, to highlight information you can get without SQL and to answer some basic questions. Highlights include open rates by domain for a given mailing, unsubscribes per week for the last year, and contact info for event hosts in the next week. See the report reference for details.
  • Timezone in reports: If you selected a query builder filter criteria like "Is Donor [During Time Period]" or "Number Of Actions [During Time Period]," you could choose a timezone, which was applied to the SQL but not properly restored to the QB's point-and-click interface so it would be lost the next time you edited it. This has been corrected. Thanks to Maya at Indivisible for reporting the bug.
  • We've upgraded the integration to use a more modern library; if you use, please let us know if anything isn't working as expected.
  • PDFs: We addressed timeout issues with the new PDF generator. Thanks to Yuri at AllOut for reporting the problem!
  • Documentation: We made significant updates to docs for the API, dashboards, and the Salesforce sync.
  • User Interface: There are pretty new navigation links throughout the admin UI that should more easily guide you through page creation.

ActBlue (Beta)

Our new ActBlue integration is ready for beta testers -- let me know if you'd like to participate in the testing period.

Salesforce (Beta)

  • The Salesforce sync can now map to both checkboxes and picklists. Thanks to LJ at First Look Media and Alec at J Street for the use cases.
  • For data integrity, donations in the ActionKit/Salesforce sync should only be edited in the originating system. We updated the ActionKit admin interface to hide buttons when they don't apply, and made sure that ActionKit-originated orders remain unchanged even when edited in Salesforce.
  • More recurring sync activity is going through the bulk API, reducing Salesforce API calls.

ACH (Beta)

  • We've added the ability to override ACH verification for staff with the Manage Donations permission. This means they can override ACH without requiring bank login or a deposit verification just as they can update credit card numbers and bank information.
  • The update recurring form in the admin UI now supports ACH updates in addition to credit card updates for staff with the Manage Donations permission. Thanks to NRDC for the request.


A new setting for custom fields

You'll see a new checkbox option, "allow multiple", when you add or edit a pre-defined custom field (for templatesets, pages, mailings, and users). Unless that's checked, the admin interface will only allow you to add one instance of the custom field to any record. It's disabled for all new custom fields by default and for existing custom fields, it's enabled for any custom fields which have ever been used multiple times on a single record.

Most of the time you only want one value for each custom field, and there can be confusing side effects if you have multiple. For example, if you include two of a custom mailing field in one wrapper, the wrapper may not render. However, there are cases where you've used multiple of a field on one record to store structured metadata. This new setting provides protection against mistakenly added duplicates while allowing for the intentional use cases.

New A/B testing options for donations amounts on Pages

For your testing pleasure, we've added three new attributes that you can vary as part of an A/B test: the list of donation amounts to be displayed on the landing page, the default donation value, and the order in which donations amounts are shown.

Inline mobile preview for mailings

You can now toggle from desktop to mobile preview. The best way to preview a mailing is still through an emailed proof (and we added a warning to that effect) but this allows you to get a sense of responsiveness inline. Thanks Ana at Color of Change for suggesting at ClientCon 2018.

Lots of donation improvements!

  • Past due status: Thanks for your feedback on the newly-available "past due" status for Braintree recurring donations! In this release, we've built past due into more of your workflows, including adding the status to the active recurring orders targeting.
  • Braintree: We've changed how we interact with Braintree so that outages are on the Braintree side are much less likely to create problems on the ActionKit end.
  • PayFlow Pro Recurring Donations: We built a work around to capture payments toward long running profiles, which we previously wouldn't pick up. Congratulations to J Street on the long running profile! And thanks for reporting the bug.
  • ACH: We've improved monitoring and added a retry system for ACH recurring donation charges. We'll look back 3 days to see if any scheduled payments didn't happen, due to a temporary Braintree outage, network failure or other issue, and we'll prompt the payment. Thanks to NRDC for flagging the issue.

Everything Else

  • Events: When an event is cancelled, when a signup is removed, or when an attendee role is changed, the updated_at timestamp in the events_eventsignup table will now update. Thanks to Lee at Everytown for flagging this issue.
  • Mailing proofs: We fixed an issue that blocked proofs for sent mailings. Thanks David at ONE for the great bug report.
  • Merge files: While merge files are processing, they'll now show they'll now show that they are "processing" instead of "0 rows." Thanks Brandon at Mercy Corps for flagging.
  • Snippets: Custom snippet titles, in addition to custom snippet code, are now escaped so a broken snippet title won't break all your snippets. Thanks Everytown for pointing out the issue.
  • Query Builder: We've added payment method (ACH, credit card, PayPal) to the donation query builder. Thanks to Marie at NRDC.
  • WYSIWYG: We've fixed a bug that caused inaccurate warnings to display when users selected or copied using their keyboard and failed to warn when users used their mouse to paste in new content. Thanks to Keith at PCCC for the report.
  • Page Listing: Pages dashboards now display untruncated short names -- you'll see all of 2018-straw-poll-full-list instead of just 2018-straw-po... Thanks Kenton @ PCCC!
  • Image Uploads: You can now upload images directly from image custom fields and you can have multiple on a page or mailing.


First, we've updated the user's guide. There's a lot more here, including the object model, known limitations and workarounds, and updated mapping documentation.

Second, the mapping for the Salesforce sync provides a great deal of flexibility but it has been fragile. Invalid mappings can stop your sync entirely. To help you reduce the risk of selecting options that will break the sync we've added some validation. You'll get an error message with a description of the problem and need to change your mapping to save. The validation attempts to catch mappings to fields that aren't writeable in either system and mappings that will fail because the data types or values don't match.


New federal legislators went live in your instance on January 3. We're continuing to update with new office data and state and local data as it becomes available.

Event Mailings

We've made a bunch of improvements to make event mailings easier to use and more flexible. For now, you can continue to use the event snippets as you have in the past (they have 'old' appended). Or you can switch to the new approach which incorporates information from the landing page you select and/or the targeting choices you make. For example, with the new attendee recruitment snippet you don't have to enter the event campaign name or set a radius -- you just pick the event campaign and radius on the targeting screen. To change the number of events shown, just replace the 1 in the snippet with the number of events you'd like included; slice": 1" means return one event.

Read more about the new built in snippets and how to use them for common scenarios here

In future we plan to support additional options like limiting the events returned by a custom event field.

Spam Check Log

The spam check log is now faster and easier to use. The log now shows the outcome of a flagged comment -- whether it was suppressed or allowed -- and lets you delete spam actions right from the log.

Read the tips for more on how and why to use ActionKit's spam tools. Remember, actions flagged as spam based on your settings are not suppressed, and the user is not unsubscribed, unless you enable these.

Query Builder

We made lots of query builder updates for your reporting ease, adding query builder options for these query builder types:

  • Donations: custom action fields for recurring donations
  • Mailings: signature delivery mailings, message body text
  • Pages: individual targets for pages (not just target groups)
  • Users: user's first/most recent/highest payment in a date range, event ID for event signups

We also added the "clicks" report type to give you a sense of web traffic.

Thanks to Jin working for Beto for Texas and Real Justice, Emmett at FCNL, Cassandra at Win Without War, and the folks at First Look for the suggestions!

PDF Deliveries

We've modernized the PDF generation system for petition deliveries. This change makes PDF generation much faster and can handle even larger petitions. We've made this change as backwards compatible as possible, but if you have tricky PDF delivery templates, we recommend testing them before your next use.

Special Custom Fields

ActionKit has some built-in behaviors prompted by custom page fields with special names. We've added those special page fields to all client instances to make these behaviors easier to activate:

  • redir will cause all requests to view this action page to be redirected to the URL entered.
  • migration_redirect_url will cause requests from users who are not logged in as ActionKit administrators to be redirected, which can be especially useful when first setting up ActionKit.
  • ak_recaptcha_enabled will override your site's default settings for enabling captchas.
  • featured_image will show the designated image on pages, styled to be appropriately sized and mobile responsive (this page field is used in the Original templateset).

If you would prefer to never use these fields -- for example, to avoid accidentally turning on the Recaptcha feature -- you can hide these fields in the admin interface.

In addition, HTML custom user fields are no longer forced to always visible. Thanks to Kenneth working for Beto for Texas for the report.

Phone Numbers

On the admin screen for each individual user record, the list of phone numbers now includes the source of each number and the date on which it was last updated. For example, if the user entered the phone number on an action page, the source will be user. This should make it a bit easier to spot the most recent or most authoritative number to use when choosing how to contact someone.


Templatesets have their own custom fields that govern behavior across the templateset. ActionKit now stops you from adding more than one value per templateset field and provides a templateset field option to add military and territory addresses to state_select.html in the Original templateset. You can copy state_select.html from the Original templateset to use that behavior.


  • In addition to the simpler event snippets, you can now add co-hosts to an event with single API call using the promote_to_host param. Thanks to Mateo at Demand Progress for the request.
  • Report tags are now called report categories to distinguish them from the unrelated tags used for pages and mailings.
  • Mailings will try harder to find users for your proofs, rebuilding the targeting set if necessary; give a more helpful error if no users are found for proofs; and avoid sending two messages for failed proofs.
  • Minidashes are special optional dashboard reports that add more information to your pages list, users, mailing drafts, and more. You can now hide these reports to deactivate them in your admin.
  • If a staff user has two-factor authentication enabled and they STOP their 2fa text messages, ActionKit will prompt them to opt back into texts before logging in. Thanks to Marie at NRDC for flagging the issue.
  • {% save_sum %}, {% multiply %}, {% subtract %}, and other mathematical templatetags now return numbers instead of strings. Thanks Ed working for End Citizens United for the bug report.

Beta Updates

Thanks to our beta testers for your feedback on these projects!

  • ACH: We now support ACH-only donation pages without credit card fields. Also, first and last name are now required by the page because ACH requires both.
  • Salesforce: We've reduced and capped API calls to avoid hitting Salesforce API limits. There's also a new staff user permission for managing Salesforce settings.


Past due status for recurring donations

As mentioned in the last release, we're adding a past due status for Braintree recurring profiles. Expect to see the new status in your instance by late tomorrow -- after the next Braintree sync. Once the status changes in Braintree, we'll change it in ActionKit. Please be aware of this when viewing custom reports -- they may be inaccurate if you haven't accounted for this status. We have added past due to the query builder and updated built in reports to include it.


Send the winning subject line automatically!

Introducing... Automatic subject line testing! In response to your requests, you can choose a wait period, metric, and max unsub rate and we'll send the winning subject automatically.



Draft mailing minidash

We've added a draft_minidash report which will display next to each draft on your drafts list view -- similar to the minidash for sent mailings. The report will receive a mailing_id parameter and can give your admin users extra information about a given draft.

Thanks to Brittany at NRDC for the question that prompted this addition.

Event actions in query builder

You can now use the query builder to create a report for event-related actions that will include information about the event or campaign.

This lets you generate a report that includes both action information like source and custom action fields, and event information like event venue and start date.

We've included a number of basic event fields, such as title and address; please drop us a line if there is a specific field you would like to use that isn't available.

Thanks to Caitlin at Courage Campaign and Lincoln working for Bernie Sanders for Senate for documenting this use case.

For Developers

  • As promised, we enabled CORS: cross-origin resource sharing. You'll be able to set a list of authorized hostnames for which we will issue CORS headers. If you've been dying to bypass browsers' Same Origin Policy, this will make you very happy.
  • The new {% log_context %} template tag writes the current context to your browser's Developer Console as JSON upon rendering as long as you're logged into your admin. For pages, you also need to use the templateset previewer.


  • We added more zoom to search for users, large event campaigns, and mailing tags. Enjoy!
  • Only superusers can see and edit re-engagement queries and we've removed the link to edit these reports for everyone else. Thanks to Reuben from Demand Progress for finding the inconsistency.
  • Clean up your mailings list with a bulk hide tool linked from the Browse All mailings view. This is a great time to clean up your old drafts and speed up your Mailings Tab load time!
  • When you email users asking them to update recurring donations, you can now see the action rates from the mailing. Thanks again to Brittany at NRDC for pointing out the issue.


Source codes persist!

Your sources will persist through redirects! Thanks to requests from many groups, when someone comes to a page with a source appended to the URL, we'll now use that source for the redirect page. We check for a hardcoded source in the redirect first so we won't overwrite a source you add manually.

Recurring donations

Now when you try to cancel a recurring profile that's already been canceled at the processor, ActionKit gives you the option of updating the status in the ActionKit database. Thanks to Free Press and Represent.Us, among others, for the requests.

Query builder

Phone numbers: The query builders for users, actions, and orders now includes two prioritized options for displaying phone numbers. These return a single phone number for each user. The first displays the user's mobile number, or if that is not present, a home number, and then a work number, and then any other phone type on record. The second new option works the same way, but prefers home numbers to mobile numbers. Thanks to Nicole for Justice Democrats and Lincoln working for Bernie Sanders for Senate for pointing out the use case.

Transactional emails: The query builder for transactional emails previously counted all opens, but now defaults to counting unique opens like our built-in reports. The query builder for transactional mailings also now allows you to display and filter on the count and rate of unsubscribes they produce. Thanks to David at ONE and Kate at Demand Progress for the suggestions.

Reports on reports: You can now use the query builder to make a report about the reports in your ActionKit instance. This can be useful if you are trying to figure out which reports are used most often, review which reports are run automatically, clear out old reports, or perform other kinds of analysis. Thanks to FCNL for the request.

Mailing stats

Mailing comparison reports received an upgrade!

We broke out the elements of the individual mailing report, so it's easier to scan. We also added a column for New Users and a donation section, which only shows if your mailing includes a fundraising ask.

There's a new "Breakdown By Subject" checkbox on the Compare Mailings screen. Now you can see results both on a per-mailing and subject-line basis.

Config (for super users)

The "Your Progress" report is included in the Special Reports section on the CONFIG screen since it's one of the reports you can use to customize your admin. Edit this dashboard report to display info on your Home tab, like progress toward key metrics, or to point out frequently-used resources.

The custom snippets interface is more user friendly with title/textarea pairs instead of long blocks of text. If you haven't created your own snippets, give it a try! You can create a point-and-click custom button, whole FAQ section or other block of text, and more. Thanks to David at ONE for suggesting.


Fatal from lines: Double quotes in dynamic sender names would cause the remaining messages to die. Now we'll skip sending for any problem from lines and continue with the rest of the mailing. The from with quotes will still die so it's best to check for those in advance. Thanks Ben at PFAW, Sorcha for Progressive Takeover and others for the reports.

County targeting: When you're targeting by county, you can (and should) add in a state (e.g. Bucks, PA) to avoid confusion with another county of the same name. Now we have help text on the targeting so you remember the convention.

Event Targeting: We've improved the geocoding for event targeting. Along with the increased precision, you may see more failed mailings because we were previously fudging the radius for withevents to find events for users included in your targeting.

Previously, targeting was limited to ZIP-code precision but the withevents tag used better address-based locations. If you set the withevents and your targeting radius to the same distance, this meant you might be targeting some users actually outside of the radius. To keep you from getting lots of failed mailings (which can slow down your send), we would look as much as twice as far as your selected radius to find an event for a user.

Now withevents and targeting use precise locations and if no events are really within the specified radius of the user according to the precise location information, you'll get a failed user mailing. If you want to add back in the fudge, you can increase the radius you use in your withevents tag, or add "0 as strict_radius" to the withevents options.


  • We fixed an issue where hosts would see an error after sending event invitations, even though the messages sent. Thanks to James at 350 for the note.
  • Event campaigns with unicode characters in the title (like a degree) will now render correctly. Thanks Débora at 350 for the report.
  • The list of petition delivery jobs now includes the page title, short name, and ID so you can more easily differentiate between multiple pages with the same title.
  • We doubled the report size limit to 1024 MB so you can run EVEN BIGGER reports.



We've made changes to help the event tool handle huge campaigns more smoothly. And we've added the event campaign ID to the Campaign Dashboard so it's easier to locate for things like querying events. Thanks to Alec at J Street for asking.

We added a "Send moderation notification" checkbox to the campaign settings page. We'll send an event moderation notification to the staffer who checked the box after every moderator action so you can see in real time how your moderators are interacting with event hosts. By default, the notification will include the moderator's comment, event details, hosts, and signups. You can customize it and add recipients in Action Notifications.

Everything Else

  • The query builder for mailings can now display and filter on whether a mailing is part of an mailing A/B test group, including displaying which group it is part of or filtering for only the mailings in a particular group.
  • You can now add more people to the recipient list for scheduled reports! We bumped up the character limit to 4000, so keep those reports going. Thanks to Mercy Corps and Nikki at ONE Campaign for the request.
  • When you copy a survey page, survey questions already marked as ‘required’ keep the required flag in the copying process. Thanks to Luke at ONE Campaign for flagging.
  • We fixed up permissions so you can use EXPLAIN in SQL for zip_proximity in the events tables. That'll help you optimize queries for the sometimes-extensive events tables. Thanks to Third Bear working for Beto for Texas for the report.


Event Moderation

We’ve added more options for event moderation to support workflows beyond asking moderators to simply approve events.

The ‘Let Users Moderate Campaign Events’ checkbox has been moved to a new Moderation Settings section.

If you check that, you’ll see options to expose staff notes to moderators and to allow moderators to edit event details (like correct the location or time). The latter is enabled by default; uncheck it if you don’t want moderators changing event details. You can also edit the new template, event_moderate_details.html, that sets the event details available for moderator review and editing.

Also, previous moderator responses for custom event fields are now displayed in the previous moderator activity section (toggled closed by default). So a moderator can review previous moderators' responses on questions like ‘Has the host read the guide?’.

And moderators can now flag events, regardless of their approval status. You might use this to allow volunteer moderators to indicate which events still need follow up if you’ve got a list of criteria for moderators to confirm with hosts. This way you can have public, approved events that are still marked for follow up by moderators. Once an event has been flagged, the moderator can unflag it by approving it (whether or not the event requires approval). Relatedly, there’s a new search option for moderators that will only match events with status=flagged and we include flagged in the status on the event lists for staff and moderators.

Other Event Updates

  • We optimized the event attendee queries so host tools should load quickly even for really, really big events. Thanks to the Beto team for finding the problem by running a kick*** campaign!
  • We now use latitude/longitude directly for event targeting in the mailer. This allows us to use user street addresses to improve targeting precision (where we generally used 5-digit ZIPs before), and is the first step toward improving the accuracy of targeting outside the U.S.

Everything Else

  • Default from line: Building on the default from line in last release, your default from line will also govern the pre-selected from line for new mailing drafts.
  • Mailing fundraising totals: If your mailing raised money, see your fundraising totals in the mailing report rates summary, in addition to the raw numbers tab. Thanks to Robert at Demand Progress for suggesting.
  • User merge: We’ve made merging users a bit easier. From a user’s profile, click the “Merge Users” tab and we’ll prefill that user’s ID for you. Just paste in the other user’s ID and we’ll take you through the next steps.
  • Encoding: We fixed an issue where tell a friend sample text was sometimes showing punctuation as its HTML codes instead of punctuation. Thanks to Brenna at Courage for the initial report.
  • ACH donations: ACH is only available for donations in USD, so we're hiding the account switcher and non-USD accounts when you're using ACH.



Event targeting by congressional district

It's here! We know many of you host events specific to U.S. congressional districts -- a rally outside a district office, or a meetup to plan a lobby visit -- and you can now invite users to the closest event in their congressional district.

To limit events to congressional districts, add user.location.us_district as districts to your withevents tag in the mailing, then target by Event Campaigns and check the “Campaign Same District Only” box.

Other event updates

  • Event approval: We're now storing the time when an event is approved so you can use it to start post-approval workflows.
  • Bulk editing: See even more events! We've bumped up the number of events displayed when you click Show All to 300 so you can bulk edit more events at once. Showing more than this causes the page to time out. Thanks to Tara at 350 for the request.

Configuration and administration

The gear below the search bar in the ActionKit admin has handy settings for you! Superusers also have access to organization-wide settings like custom snippets, spam settings, announcements, and two factor authentication requirements.

Did you know...

That you can set up two-factor authentication for your own account, and that superusers can require 2FA across your instance? For those of you setting up lots of staff with 2FA, you can once again copy the token from Firefox. Sorry about this issue, Jin (working for Beto)!

That superusers can set up announcements just like the ones we use to highlight new releases? Now you can also set them to expire. Go into /core/admin/notice to choose a date and time to set a future expiry for your announcement, or check “Expire now” to expire the announcement immediately. Once the announcement is expired, it won't show at the top of staff users' screens.

ACH (bank account donations)

Two updates to ACH donations (still in beta -- let us know if you're interested in joining):

  • We've added snippets specifically for ACH donations so you can thank ACH donors specifically or invite non-ACH recurring donors to donate through their bank account.
  • We'll only show the Accept ACH checkbox when you select a payment account that is set up for ACH.


  • We defined staff in the UserStaffNote REST endpoint. Thanks to Ethan at PCCC for requesting.
  • For users created by a donation push, we'll check if there's a time on the donation and use that for the users' creation time. Practically, this means that we'll backdate users coming in through ActBlue so you won't have users with older donations who look brand new and mess with your reporting.

Everything else

  • Default from line: Set a default from line across your organization for notifications and confirmations. You can still create custom from lines and select alternate from lines; this just sets the behavior when you're creating a new notification or page from scratch.
  • Download actions: The Download Actions report will now display mobile numbers as well as home phone numbers.
  • Phone numbers in mailings: Add a user's own phone number to a mailing (perhaps to check if it's still accurate) using {{ }} or by type with {{ user.phones.home }}, {{ }}, or {{ }}.



Event moderation

The moderator tools screen now includes the full email log for the event, including messages sent by the host, attendees, moderators, or staff.

After a volunteer signs up to moderate an event campaign, a staff member needs to approve them from the Campaign Dashboard. An email, defined by the event_email_volunteer_approved.html template, is sent to the volunteer. With this release the link in the email leads to the 'set a password' page or directly to the list of events to moderate if the user already has a password.

More event updates

Searching for events by custom event field values is enabled for both the staff event under Manage Events on the Campaign Dashboard and the moderator advanced search. The search checks any custom fields you've added to any associated event page for the value you enter. It does not currently accept a name, value pair. For example, if you've added a custom field to the moderator page called next_followup, you would enter 8/29/18 in the search box not next_followup: 8/29/18.

You may have noticed the new Events section of the user record. We've added links to act as host or moderator (if the campaign allows moderation) for any event the user is signed up for as a host or attendee. You'll see a link to the email log for the event if there is one.

We've also added the event time, date, and location to the user's Action History tab so you can more easily distinguish between events.

Thanks to Jin working for People Power and Beto for Texas for inspiring these improvements.

Everything Else

  • After action notifications: When sending an after action notification to one of your end users, information about the recipient user can now be included. This doesn't apply to staff accounts, unless the staffer's email also has an ActionKit user.

  • Two changes to streamline reporting: You won't see the parameter help field unless there are parameters in your report, and we've added query builder support for "cancelled by failure" recurring status. Thanks to Clement at NRDC for the request.

  • Twitter sharing: If you include custom tweet text in a /share/link?type=tw link, that text is now stripped out before constructing the link to be shared, which makes for more compact and attractive share links. Thanks to David at ONE for pointing out the problem.

  • Links with ActionKit IDs: If you accidentally include links with ActionKit IDs in them in a mailing, tracking is broken, so we'll block you from sending. Thanks Credo and UltraViolet for flagging.



Find the link to email yourself report CSVs more easily! We've streamlined the UI so emailing reports isn't hidden behind a download button.

More reporting updates

  • Our built-in letter to the editor report now omits incomplete LTE actions so you get a more accurate count. Thanks to Brenna at Courage Campaign for flagging.
  • We updated built-in List Stats dashboard to note which stats are based on the past week and which are all time. Thanks to Will working for Progressive Takeover for the note on this issue.


We've added moderation actions to the admin-facing event detail screen.

More event updates

  • Sometimes Excel is ~very helpful~ and strips out leading zeroes from zip codes. We'll check uploaded events to make sure the zips have the right number of digits and add a leading zero to four-digit zips. (We already did this for user imports.) Thanks to Kenneth working for Beto for Texas for prompting the investigation.
  • We've streamlined event search for moderators. The search will run on page load, suggest using advanced search for more options, and jump down to the search results when you click Search.
  • We've added two fixes to help you avoid common event problems: Moderators need to acknowledge that event deletion is permanent before they can delete, and staff are prevented from deleting the last host of an event.


  • We fixed a bug where you couldn't submit support tickets that included the word password. Thanks to Jin working for Beto for Texas for flagging!
  • Remember when we said you could associate any page with your mailing using the landing pages dropdown? Well now it's actually true! Thanks to Tara at Win Without War for reporting the problem.


Event Moderation

We've added two new page types for moderators -- a moderator sign up page and a moderation page -- where your volunteers can greenlight events, contact hosts and attendees, mark an event as incomplete and request tweaks from hosts, or delete events outright.

To see these pages you'll need to check Allow Users To Moderate Campaign Events on the Campaign Settings screen for your event campaign. Two additional pages are then added to your Campaign Dashboard for you to set up.

1 Staff users set up Event Moderate and Campaign Volunteer pages

These pages have the usual text boxes for entering content as well as an area where you can add custom action fields to indicate specific items for the moderator. Read more about this and other options.

2 Volunteers sign up on the Campaign Volunteer page. You can ask them to agree to particular ground rules or provide additional information.

3 Staff users review and approve volunteers

4 Moderators search for events to moderate

5 Moderators have options to moderate individual events

In future releases we plan to expose custom fields to the staff and moderator event searches and add a moderator settings section to the Campaign Settings. Let us know if there are other changes that would make this new tool more useful!

Everything Else

  • Scheduled mailings will show up in the Rebuilding list as they rebuild at send (if that option is checked). This will be more noticeable for mailing targeting that takes a long time to run -- sorry to Brandy at Credo for the mailing that was invisible as it rebuilt, and thanks for the report!

  • To compare mailings, you can now paste in a comma-delimited list of mailing IDs into the Mailing Performance report in addition to manually selecting each mailing (the same goes for pages). Thanks Cassandra at Win Without War for the request!

  • You'll only be asked to pick a winner if there are multiple subject lines for the mailing.

  • On the Campaign Dashboard screen you can now search for events by the host's name, and sort events by the date they were created. Thanks to Jin working for Beto for Texas for requesting the former.

  • As promised last release, blanking out max_attendees will give events unlimited capacity, even if there was a limit before. H/T Kenneth at Middleseat.

  • You can now delete a mailing haiku in addition to replacing it from your haiku list. See the full list or click on the asterisk in a mailing haiku to add a new one.


ACH Payments

We're taking ACH (bank account) payments into beta! ACH payments typically have lower transaction fees, and people change banks less frequently than credit cards. It'll be available for U.S. banks for clients using Braintree as their payment processor. Thanks to NRDC and Mercy Corps who helped fund this feature and will start beta testing soon. Let us know if you'd like to join them!

User Recognition

Previewed at ClientCon: Gone are the days where you need to choose between showing one last form field and recognizing your users! We’ve added three new modes for user recognition: “Always Visible”, “Always Required,” and “Visible if Blank.”

With these new options you can do things like recognize users' existing information and still show them a survey question or require a current phone number every time they take action.


Gentle Save Notification

The mailing save pop-up doesn't take over your whole screen anymore! See a gentle note in the bottom right corner, and continue on your way.

Recurring Sent Tab

Thanks to multiple requests at ClientCon, we’ve added a “Recurring Sent” view to the Mailings tab and moved these mailings out of the “Sent” view.

Use All Landing Page Types to Associate a Page and a Mailing

Pages of all types are included in the landing pages dropdown on the Compose screen for mailings. Previously, landing pages had been restricted to donation pages and pages with targets. Thanks to Lianna at CREDO for the most recent request.


Upload Sharing Images from After-Action

Upload sharing images in the same place you set them. We've added an upload button next to the sharing image on the after-action screen, so you can get visual faster. Thanks to Kenneth for PeoplePower and Amy from Win Without War for the request.

No More Lost Survey Data

The survey builder will now warn you if you don't have user_ or action_ in each of your custom HTML survey questions -- you need those prefixes on fields to record the data from your survey.


Add to Query Builder

Adding criteria in the query builder is more streamlined; you can type to search for displays and filters.

Compare Pages and Mailings

On the Reports tab, we renamed the Performance by Mailing and Performance by Page buttons to Compare Mailings and Compare Pages, respectively. You'll see a new button to Compare Mailings on the Mailings tab that gives you access to the report, and ditto for Compare Pages on the Pages tab.


Late last year we set up an instance of One Time Secret ( that you can use to more securely send us things like payment account API keys. To use it, you go to, paste in the secret information, and get back a single-use-only link you can email us instead of the raw credentials.

We've set the help form up to remind you about One Time Secret, with a popup if your initial ticket message includes a phrase like "API key" or "password." We hope this makes it easy to remember to use it. Let us know if you need any help with One Time Secret, or if the help form changes cause you any trouble (e.g. the popup often triggers for messages without secret data).

Everything Else

  • We added an empty alt tag to the tracking pixel, so your HTML validator won't flag that as an error anymore! Thanks to Andy at CLCV for flagging.
  • Donation page names won't be able to collide with event page names anymore. Thanks to Sky at MoveOn for the report.
  • By popular demand, we added a snippet that your users can click to tweet your message at their electeds rather than just taking them to their targets' Twitter profiles. Thanks Cassandra at Win Without War and Raquel at Courage Campaign for the request.
  • API requests on core_usermailing are less likely to time out now, thanks to a report from Color of Change.
  • We ironed out some issues with custom boundary names, including letting you upload custom boundaries where the name is really a number (thanks MoveOn for the report) and improving the error if there isn't a boundary name field (thanks Brian from Progress Now for flagging).
  • Imports that unsubscribe users will use the date of the created_at column as the unsubscribe date, just like imports that subscribe users. If there's no created_at column, the import will still take the current date as the date of the unsubscribe.
  • We fixed a problem with A/B testing for Pages -- now a blank variation will always give you the original, whether you're working in WYSIWYG mode, code mode, or both. Thanks to Kenton from PCCC for finding the bug.
  • Add hosts to events from the new manage events screen even if the host had been deleted or demoted. Thanks to several folks at Beto for Texas for reporting.
  • Blanking out event directions and notes to attendees will get rid of the previous remarks in those fields. And, coming next release, blanking out the max_attendees field (event capacity) will also get rid of any previous capacity.


Event Admin

As you saw if you were at ClientCon, we've added a new admin screen for events. This fixes a gap in functionality that many of you had reported -- removing hosts. You can also manage attendees, send messages, and see a recap of the event information, without acting as a host. With Superuser or Event - Manage permissions, you can access this magic screen by clicking on the event name or clicking Manage:

Subject Text

Use the text of your subject line elsewhere in your mailing, or modify the email based on the subject text. Thanks to Gautham at Flippable for requesting.

{% if subject_text == 'Howdy'%}
  Was 'howdy' too weird of a subject line?
{% else %}
  Our subject lines, including {{ subject_text }}, are the very best.
{% endif %}

Survey Responses on User Record

See the full text of users' survey responses right from the user admin screen! They're not clipped anymore, so even long responses will be readable.

Congressional Delivery

If a U.S. rep. or senator wasn't in our vendor's data (because they didn't have a contact for them) and you added a contact, your addition was mismarked and didn't display. This has been fixed. Thanks Robert at Demand Progress for pointing out the issue.

Whatsapp Support

Links in your mailing to whatsapp no longer break inline preview and are now clickable (whatsapp: acts like tel: at the beginning of a link). Thanks to Benjy at Zazim and David at ONE for flagging.

Documentation Updates

  • For custom boundaries, we've documented that the data needs to be in the WGS 84 (EPSG:4326) coordinate system, since uploads won't be re-projected.
  • Send us a support ticket to turn on SSL everywhere (thanks to Joe at Everytown for pointing out that the process wasn't clear from the docs).
  • When users act multiple times on one page, we'll keep the first source. Thanks to Jase at DFA for pointing out that our docs and the behavior didn't match up.

Hidden Feature: Support Form

We learned at ClientCon this year that our handy support form is an unintentionally hidden feature! You can still email support, but the form helps us handle your ticket as quickly as possible. The support form tells you when support is open (or when we're closed for a holiday), collects browser information, gives tips on documenting bugs and requests, and provides fields for things we'll ask about like a link to where you're experiencing an issue. Check it out at the Support tab > Contact Us.


Staff Notes

Several of you have requested a way to record additional notes about users, such as interactions they had via phone or direct email, etc. This change adds a "Staff Notes" section that shows up on the bottom of each user's overview screen. Text a staff user enters into the "Add a note..." field is recorded in the log when you save the form and displayed along with the date and staff user name.

Some notes about notes

  • Notes may contain multiple lines of text.
  • Click the Edit link to make a correction to a previous note.
  • Removing all of the text from a note and then clicking save will cause the entire entry to be deleted.

Thanks particularly to Nate at MomsRising for building his own version and sharing with us!


We updated the name of the REST API permissions groups to make it clear that those groups grant access to all models and are essentially equivalent to superuser status (but without access to the admin UI). We hope this change will serve as a reminder to make sure you're working with a trusted partner when you assign this permission.

Permissions bonus bug fix: Staff only see the link to edit reports if they have permissions to edit reports. Thanks to Brandon at MercyCorps for the report.

Boundary Groups

From the list of boundary groups, we've added a link to overview maps. See a map that pulls in all the boundaries within that group! From that overview map, click on a boundary to go to its detail page.


A small number of Braintree transactions were recorded as completed but unsuccessful if we happened to catch them in the "settling" state. We fixed this issue. Also, we verified the status of existing transactions with Braintree and marked them successful where appropriate. Thanks to Marie at NRDC for reporting this!



Query Builder

We updated the query builder to make it easier to search for multiple IDs. With this change, pasting a comma- or semicolon-delimited sequence of one or more numeric IDs into a type-to-search report parameter field causes each of the IDs to be looked up and if a matching record is found it is selected.

This allows you to paste in a list like 32,57,82,43 on the Report Parameters screen to select a series of users, or a group of pages, or a set of targets, etc.

Non-numeric values, or any values which can't be matched to a record, will be left in the text-entry field to be processed normally. Thanks to Mateo at Demand Progress for requesting.

Built-In Reports

We added a few more "search queries" options on the users tab -- users who have taken action on a page with specified tags, users subscribed to particular mailing lists, and users who have ever made a donation or purchase. A reminder: search queries are reports tagged user search, and the built-in ones use optimized SQL to complete more quickly than they would using the query builder.

Mega Reports

When you attempt to email a report with more than 10,000 rows (too big to show inline) we now provide a link to download the report in the email, instead of just an error message.

Privacy and GDPR

Privacy Records on More Updates

User info doesn’t always come through user actions: import pages, the REST user API, and the user admin can also make changes. We’ve added ways you can create and optionally require privacy records for those updates, too.

Action Acceptance

We added a setting where you can choose not to accept an action from a user who doesn’t see the privacy UI after choosing a European country from a dropdown (perhaps because of a bug or an outdated form).

We've also updated the documentation with more details.

Mailer Popups

The popup when you save a mailing will only give you information about the mailing you're saving -- not other mailings in progress or sending. Thanks to Keith at PCCC for suggesting we prevent future heart attacks.

Custom Target Pronouns

We're asking for custom targets' pronouns instead of their gender on the custom target creation screen. Since we were only using gender to generate pronouns anyway, this change lets you directly select the way your target will be referred to in snippets, and it's more inclusive for targets who themselves don't fit into male or female boxes.

Technical Note: The column header for upload is still gender, with the options M, F, and leaving the field blank. To get they/them pronouns for your target on upload, leave gender blank.

Product Names

Product names don't need to be unique anymore! This means you can now have different "admin" product names on the backend but identical product names on different pages. Thanks to Nir from J Street for requesting this feature.

Hidden Feature: Redirects

  • Using a custom page field named redir will automatically create a 301 redirect to a URL you specify!
  • Using a hidden input field with the name redirect and value of a URL will change the after-action page to the URL you entered.

As of this release, both of these hidden features are now documented in the ActionKit manual.

5/24/18 (privacy and GDPR update)

We want to share a few more details on privacy features that were included in our latest release, but weren't explicitly called out in the release notes.

The updated documentation has details, and developers might find the new Original/privacy.html a useful reference. The biggest changes are:

1 We've redone the default privacy UI for users. Instead of checkboxes, Original/privacy.html can now show opt-in/out radio buttons, along with a notice and extra text to ask users to reconsider opting out.

2 Recognized users can be shown the privacy UI. You can show privacy options to recognized users in all of the countries you've configured by adding this tag to your form:

<input type="hidden" name="privacy_show_if" value="in_country">

You can use a value of 'missing' instead of 'in_country' to show the options only to those who don't have an active privacy record.

3 Opt-outs can unsubscribe users. Adding this tag to your form:

<input type="hidden" name="privacy_optout_unsub_all" value="1">

will unsubscribe users that opt out.

4 New options for handling confirmation emails. The section Handling confirmation emails in the docs covers how you can tweak or skip confirmation emails for opted-out users, with sample code.

5 Privacy records are visible in the user admin. Users with privacy records now have a "Privacy records" line in the "User details" section, and privacy records in the action history next to the corresponding action.

"Pre-GDPR" records coming shortly. If you've configured countries for privacy record support, we'll create records with type="pre_gdpr" and status="auto" soon.

As always, let us know through Support if you have any questions or need help.


ActionKitties are awesome! Everything in the release notes this time was inspired or reported by clients.


Admin subscribes and unsubscribes

Change a user's subscriptions right from the admin! Our new list admin interface lets you subscribe and unsubscribe users from individual lists, saving you a trip to a signup page or a cumbersome unsubscribe/resubscribe process. Thanks to Independent Media Institute, J Street, Story of Stuff, ONE, and several others over the years.

Stealthy members

We made it a little harder for suspicious characters to figure out whether a user is a member of your organization. When someone fills out a reset password form, they now get the same message regardless of whether they're in your database. Thanks to Kate @ NRDC for prompting an investigation.


Who created and updated

See who created and last updated your reports with a handy line in the reports listing. Thanks to Nikki @ ONE.


You can now get details on your transactional mailings from the querybuilder, making it easier to generate reports on the performance of after-action confirmation emails as well as tell-a-friend messages and admin notification emails. Thanks Kate @ Demand Progress for saying it would be useful.



In addition to lists and language, you can now include particular countries by default in your targeting. Thanks Manny @ MoveOn for the initial prompt.

Visual Editor

The visual editor knows that class is a valid attribute for td, so it won't strip out td classes when you save changes or switch back and forth between editor modes. Thanks Ben @ J Street for the report.


Multi-Currency Thermometers

We fixed a bug with progress meters on multi-currency donation pages. We're now summing donation amounts converted to USD. Previously we were summing units of currency donated without converting, so we would treat 1 EUR as 1 USD. Thanks Mais @ SyriaCampaign for flagging.

Braintree Recurring Profiles

We made two updates related to Braintree recurring profiles. If the amount of a Braintree recurring profile is different than what we have in ActionKit, the correct amount will be updated in the ActionKit database during sync. We also fixed an issue where a recently-updated recurring amount was overwritten if the update occurred during sync. (Note that this affected the recurring amount in the ActionKit database, not amounts collected by the processor.) Thanks Adam @ MoveOn for finding the bug.


Hey ActionKitties! We've got a crazy cool new feature, custom boundaries, coming out in this release as well as some small improvements that bring me great joy (editable phone number display for call pages! a list of mailing test groups!). I am also joyful about seeing many of you in June! This will be our biggest ClientCon with ~55 clients attending. You can still sign up for training on Friday, June 22 for $500 per person.

Anyhoo, just forget about the world for a moment and join me in rejoicing over small things!

Custom Boundaries

We're rolling out a new, experimental feature in this release: custom boundaries for targets! Upload a spatial data file to use as the jurisdiction for your targets, and we'll match constituents to the right target before sending. This gives you some of the same functionality for custom targets that we already have for built-in targets (U.S. House, Senate, many state houses). International groups, get excited! You can also draw map files right from the admin, so you could tell people about their local organizers, target just the liberal parts of a state/country, or map against local chapters. We’re looking forward to seeing what use cases you come up with.

Call Pages

You can edit the target and phone number display for call pages! We created a new template named target_list.html that you can customize. Shoutout to Auden at NRDC for suggesting that call target phone numbers should be clickable.

Mailing A/B Tests

See all of your A/B tests in one place with a new option in the Mailings Tab! A/B Testing Bonus: The mailer will let you know when the test group is done rebuilding.

Mailing Archive

From now on, we’ll archive the full HTML of your sent mailings -- including the wrapper, custom fields, and how snippets were rendered for a random user -- for auditing and copying purposes. You can also run SQL reports on the archived HTML to catch any content that’s hiding in custom fields (instead of core_mailing.html).

API for Recurring Donations

Donation push for recurring orders now allows order_id to be used for identifying profiles in addition to recurring_id. If you’re using the donation push API to record external recurring donations, you may have had failures to record if you had two profiles for different payment accounts with the same recurring ID. You can now use use order id as an alternative to recurring ID when adding payments or updating a profile.

More Updates

  • We documented how and when to prefill forms with basic (not sensitive!) user information.
  • When a non-U.S. country is selected in Forms, ZIP and ZIP+4 fields are hidden. That includes /me/update, where users update their own info.


Hey ActionKitties!

Tomorrow morning you’ll see new options for using social media to pressure your advocacy targets, more autocomplete options for reports, and tools to help you comply with GDPR.

And two reminders:

  • There are a few links to the user manual in these notes. Those links will work tomorrow, once the release it out, but not before then.
  • ClientCon 2018 is coming soon (June 20-21 in DC). This is a day and a half client-only conference (followed by an optional one-day training that we'll email about later this week). Learn more and sign up here.

Social Media Targeting

With this release, you can ask your users to pressure their federal legislators through their social media accounts. We have Facebook and Twitter addresses for 95% of federal legislators.

In the snippets menu, under Page Targets, you'll see new options you can use to embed a "Tweet Your Congressperson" link in the after-action thanks page, or to put a "Post a Question to Your Governor's Facebook Page" link in a mailing. We're looking forward to hearing about all the use cases you come up with!

The custom target groups interface allows you to enter these values as well. The fields are hidden by default in a new "Optional Fields" section at the top that allows you to reveal the ones you want to use. If you edit an existing target group that has values saved for any of these fields, those fields will start out visible.

More Autocomplete Options For Reports

We've enabled autocomplete, or type-to-search, functionality for tags, mailing lists, targets, users, events, and event campaigns. Yeehaw!

The functionality will be triggered if your report parameter names begin with any of the following: page_id, mailing_id, callpage_id, tag_id, list_id, user_id, event_id, campaign_id, or target_id.

When you type in part of the name or title of the related record, you can then choose from matching elements, as you can do with Pages and Mailings currently.

This should work seamlessly with reports you've created in the past as well as new reports you write by hand or generate with the query builder, but if you run into any rough edges let us know and we'll get them ironed out.

Thanks to Nathan and Ruby at MomsRising (among others) for suggesting!

Mailing Test Group Improvements

We made it easier to manage your mailing test groups. We’ve added a "scheduled" status for test groups that have been scheduled but not sent and a link to cancel the scheduled send time for an entire test group (and all the mailings in it). Thank you to both Brittany at NRDC and Sarah at AllOut for helping us find the sharp corners!

And we made it easier to start from a draft copy of your first mailing when creating a test group. If you create your test group from within a mailing and select "create copies" we’ll copy the mailing (instead of creating a blank draft). Thanks to ClientCon 2015 participants for suggesting! (Are you signed up for ClientCon 2018 yet?)

PA and NC Redistricting

Shortly after the release, we will do a mini-update and match redistricted users in Pennsylvania to the congressional district, and users in North Carolina to the state legislative districts, they will be in for the 2018 elections. We’re watching for decisions in other court cases that might lead to redistricting, but please let us know if you learn of other states!

The new data will be stored in the core_usergeofield table. Older, obsolete entries in core_usergeofield will be removed.

To report on or target users in these future districts you could use SQL like:

SELECT user_id FROM core_usergeofield
WHERE name = 'us_district_redistrict_2018'
      AND value IN ('PA_01', 'PA_02');

This snippet gives the district ID in a mailing (and other places where the user object is in context):

{{ user.geofield.us_district_redistrict_2018 }}

Here are the user geo field names currently in use:

  • us_district_redistrict_2018: future US Congressional district
  • us_state_district_redistrict_2018: future state house district
  • us_state_senate_redistrict_2018: future state senate district

Staff Permissions

Report Downloads: In our last release we modified who can edit and download reports. These changes created some problems. Sorry about that! Report related permission groups are now:

  • Reports - Anyone with this permission status will be able to create, edit, view and download reports. Full reporting access!
  • Reports View & Download - With this permission, staff can view reports in the admin and download them, but not edit them. Great for protecting your perfectly designed report from being altered.
  • Reports View Only - Staff can view the report within ActionKit, but they won't be able to edit or download the report.

Thanks to Brandon at MercyCorps and Aaron at Democracy for America for alerting us to the workflow problems!

Permission Standardization: Our built-in permission groups were not consistent across clients due to changes over time and customization. With this release, they’ll be standardized. This is the first step toward adding some more granular permission options.

We reviewed the changes and what they mean for your organization and do not anticipate issues. However, if a non-superuser staff member has problems accessing previously-available features, please report this to support!


Events: When creating a report with the events querybuilder, you can now display or filter on the source code for the action that created the event. We've also made it easier for you to access total signups for an event campaign in the templates. Requested by Beca at Everytown.

Snippets: Whipcount targets and response snippets have been added to the snippets menu for notification emails. Thanks to Chris at FCNL for the use case.

Donation Query Builder: We reordered payments and orders in the reporting querybuilder so the broadest option (orders) is at the top. As a reminder, the "all orders" options are associated with the original order information, while the "payments" options reflect individual transactions that transfer money into your organization's accounts. Thanks to Kate and Marie at NRDC and Mais at Syria Campaign for inspiring this change!

Mailing Page: In some circumstances, the “Performance” section on the top of a mailing result page was collapsed and could not be opened; this should no longer occur. Thanks to Caitlin at Courage Campaign for helping us with some complicated debugging.

Your Tweet Treat

Our favorite recent tweet and your bonus for reading all the way to the bottom!


Hey ActionKitties!

We've added a bunch of functionality to the admin and API to make complying with GDPR requirements easier for ActionKitties with European signers.

Our consent feature, to more easily track opt-ins, needs a bit more testing before going live and will be in our next release in early April.

Not subject to GDPR? There are still some goodies in here for you: A/B testing improvements, more granular permissions for reports and speeding up bulk mailings by a factor of 4x.

All this and more will be available in an ActionKit instance near you tomorrow, March 29th.

Right to Erasure

With this release, we’re rolling out the “Right to Erasure” feature to help you comply with the EU’s General Data Protection Regulation (GDPR). This feature anonymizes the user's data while leaving the relationships to actions and mailings intact.

To delete data for a user, first go to the Users Tab. If your staff account has superuser status, you will see an "Erase Users" button in the right side menu. Enter the User ID or email address of the user that will be erased. Checking the boxes below that allow you to get more specific with what data related to that user is erased.

The same functionality is also available via the REST API.

Erasing data in this manner is irrevocable, so take care.

You can review the documentation for this new feature here.

View Reports Permission No Longer Includes Download

To give you more control over which staff users can access large amounts of data, the View Reports permission group will only allow staff to view reports in the admin UI. They will no longer be able to download reports that return over 10,000 rows. The Reports permission group or superuser status is now required for downloads. Thanks to Sum of Us and MoveOn for requesting!

Even More Mailing Zooooooom

We turned mailings up to 11. The dedicated instances used to send mailings are now 4x's faster for all clients. For most mailings, this will translate directly to a 4x increased send rate. So proofread those mailings! (Note: this feature was made live on March 20th, so you are already seeing this speed up!)

A/B Testing Improvements

Preview of Thank You Pages for A/B Testing: You can now preview both your built-in follow-up (Variation A) and your test (Variation B) for any after-action options like thank you text or social media sharing from the A/B test dashboard screen. Just click "Thanks" under that variation. Thanks to Shannon at UltraViolet and Keith at PCCC for the suggestion!

Enrollment Decluttered: We fixed a bug that sometimes led to extra records being created in the lab_enrollment table. These didn't invalidate your test results, but they were confusing so we got rid of them. Discovered while investigating a report from Mark at CREDO — thanks!


Event Host Info: On the Host Tools screen, it’s now clear that the host’s personal email and address fields aren’t editable. They appeared to be previously, but attempts to edit them returned an ugly error. If a host wants to change their email address, they should use their user profile form at /me/update. Hosts who want to give someone else event responsibilities should use the attendee roster to promote an attendee to a co-host. Thanks to Everytown for reporting!

Special Page Fields Documented: There are a few special cases in which custom fields with a certain name trigger a built-in behavior at ActionKit. We’ve updated the manual to describe these:

  • A value in a field named redir will cause all requests to view this action page to be redirected to this URL.
  • A value in a field named migration_redirect_url will cause requests from users who are not logged in as ActionKit administrators to be redirected, which can be especially useful when first setting up ActionKit.
  • A value in a field named ak_recaptcha_enabled will override your site's default settings for enabling captchas.
  • A value in a field named image or og_image will be used as the sharing image URL for Facebook if one has not been set on the After-Action Info screen.
  • A value in a field named description or og_description will be used as the sharing description text for Facebook if one has not been set on the After-Action Info screen.

HTML in Reports: We've updated an internal filter used to format links in report results so it more carefully handles HTML in its input. If you're suddenly seeing raw HTML in a report output, and your report or query template uses the |link_text filter (or you're not sure if it does), contact us via Support.


Hey ActionKitties! Do you enjoy these release notes? Are there people at your organization who might find them useful? Please forward this ActionKitties sign up link to anyone who might be interested:

Improved Save for Mailings

Remember how irritating it was to scroll back down to the Content section of a mailing after hitting the “Save” button? No more! Experience the joy of saving in place! Complete with a pop-up alert to tell you if your work was saved, or if there are errors that need to be fixed first.

Donation Fraud Filters and High Risk Country List

We offer donation fraud filtering through MaxMind minFraud service which you can turn on in your instance. MaxMind uses a variety of factors to give each donation a score on how likely it is to be fraud. The donor’s country is one of these factors and MaxMind maintains a high risk country list and blocks donations from IP addresses in those countries.

Up until now, this list has been fixed (Ghana, Nigeria, and Vietnam). We can now vary this list on a per-client basis. If you'd like to add or remove countries from this list, let us know via Support!

Targets and Delivery

  • Last release we updated state legislator contact data. This release we added a script to load the latest data we have to your instance nightly. Changes still won’t be immediate -- our data source pulls most of this information from the websites of the various state legislative bodies. But you will have updated info almost as soon as we do!
  • We fixed a bug that could cause immediate signature delivery to fail. If immediate delivery was set to disabled in the backend because 30 signatures had already been sent to a target in a 24-hour period, and then you set the page to unlimited immediate delivery, immediate delivery still remained disabled. We found the source of the problem and fixed it. Now you can move to unlimited delivery for a page at any point. Thanks to Mais at The Syria Campaign for reporting the problem.
  • We updated federal and state districts to validate against U.S. boundaries, instead of known legislators. This means you can include vacant districts when you select recipients for a mailing without writing custom SQL so you can easily target constituents of these districts in advance of an election. But remember, it’s best to exclude these districts from standard advocacy mailings that use target snippets because there is no target name! Since the target snippet requires a name, the mailing will fail to send to anyone in the vacant districts, but failed mailings slow down your send. Thank you to Ben at People for the American Way and Matt at MoveOn for requesting.


  • Starting with the last release, a CSRF token is now required to edit an existing event on an event create page. Tokens were patched into your event_create.html templates.
  • Also, some parts of the REST API supported JSONP responses. This is now disabled.
  • We’ve strengthened the warning against forking actionkit.js -- this will break something. If you need to do something and you aren’t finding a good hook, please let us know.
  • The hint for filtering on "Lat/Lon, Distance" is now attached to the "Geographic Coordinates" selection (where the choice resides) in the Query Builder for Users, Actions, Events and Media instead of “Home Address” (where it doesn’t). Thanks to Chris at FCNL for alerting us to the error.

Documentation Updates

We updated:

  • Instructions on how to upload your custom event fields for events. (Hint: custom event fields are a type of custom action fields, so name your column action_[field_name]). Thank you to Lee at Everytown for Gun Safety for the suggestion.
  • DonationPush requirements. A string is expected for amount. Thanks to Micheál at Civis Analytics for reporting the unclear error!
  • Template tags. The page.type tag can be used by all Page types in the thank you text. Thanks to Ben at ProgressNow for template tag questioning!
  • Mailing Tools/From Line section. Our requirements have changed.


Hey ActionKitties! Just a few new things coming to your instance late tonight. We're continuing work on events improvements (like adding an event moderation tool and support for timezones), Instant Donate upgrades, exposing social media info for advocacy targets, and more.

User Form Field Customization for Pages

You can now set fields that use radio buttons or select lists to required when creating your page and we’ll enforce it. Thanks to Jin @ PeoplePower for reporting that we weren't previously!

Also, we moved the "is required" error message above the first input field or after the last one where possible as we do with other field types. Previously the message would show above or below the first input element of that type.

State Legislator Data

We’ve updated state legislator data in all client instances. Please let us know if you see anything off!


  • We’ve added a notes field to the Query Template creation screen. The notes as well as the created and updated dates are now displayed on the Query Template list. Thanks to Jase at DFA for the suggestion.
  • A few weeks ago, we added subscription change types for re-engagement related subscribes and unsubscribes. We’ve just now added these to the query builder. Reports for users subscribing or unsubscribing to various lists now include all change types. Thanks to Reuben at Demand Progress for reporting the oversight.
  • We fixed a missing join in the Mailings Query Builder. You could previously get a count of total failures but breakdowns by subject or user domain were incorrect. This has been fixed, however, this adds an additional join between some very large tables so expect to wait a bit. Thanks for requesting to Courtney at Color of Change.


  • If a web-viewable mailing used a mergequery for targeting, an ISE occurred when a user tried to view the mailing because the temporary targeting table didn’t exist. We now save data from mergequeries that aren’t cached for one week. During that week, web views are available. After that, the user will get a generic mailing view error message, not an ISE. Thanks to Zazim and Mercy Corps for reporting the specifics.
  • We’ve made mergefiles and mergequeries work for signature delivery mailings. Delivery mailings can use any of the columns in core_target for mergequeries and mergefiles. Thanks to Shannon at Ultraviolet for the use case!


  • We continue to make improvements to Instant Donate based on your feedback. Instant Donate now works on a page that you’ve enabled for PayPal donations. If the user selects PayPal they go to their PayPal account. If they go through the standard donation flow they see the Instant Donate pop up. For this release, we prettified the shared pages, like the user profile and privacy policy, that end users can see to look more like our Original templateset. These are Instant Donate pages that are shared across participating clients so they have a plain vanilla appearance and aren’t customizable. We’re still looking for beta testers this so let us know if you’re interested!
  • We cleaned up the formatting for currency symbols and ISO codes for display on donation pages. Thanks to 350 for asking about this!
  • Braintree only: We added an option to the CONFIG screen in the Recurring Retry section. If you set "Cancel After Retries" to true, we’ll cancel the profile at Braintree and set the status at ActionKit to canceled as well. Currently the profiles remain active unless you cancel them at Braintree manually or through the ActionKit API.


  • We added some text to the signature delivery screen clarifying that immediate delivery continues only until 30 immediate messages are sent to any target in a day then delivery switches to batch. Prompted by inquiry from Marie at NRDC.
  • We fixed the search tooltip that was covering up the username and other text beneath it. Thanks to David at ONE for noticing!

2/27/18 (announcement re: GDPR compliance)

Hi ActionKitties:

Europe will begin enforcing its General Data Protection Regulation (GDPR) at the end of May 2018.

These regulations give EU residents greater control and ownership of their personal information. The penalties for not complying with GDPR can be as significant as the larger of 4% of annual revenue or EUR20mm.

We've been working with our vendors to verify that they will all be GDPR compliant on or before the May 25th, 2018 deadline. All of our impacted vendors either are or will be compliant before the deadline.

You can build a GDPR-compliant solution on ActionKit today, but there are two specific GDPR requirements that we'll be making easier for you to comply with in the near future.

The first is the "Right to Erasure". EU subjects have the right to request that you delete or anonymize any data you've collected from them.

We'll be implementing an anonyimization feature, accessible via both the ActionKit admin UI and a REST API endpoint, that, given an ActionKit user id or email, will anonymize all of the personal information we've collected on that individual (specifically, all data stored in core_user, core_user_original and, optionally, core_order_user_detail tables). We will also track that that user id was anonymized for audit purposes.

This anonymization is permanent and irrevocable. We will not be able to honor any requests to restore data anonymized via this feature.

The second requirement is that you obtain the consent of EU subjects to collect and use their data. EU subjects must positively opt into any data collection. A pre-checked checkbox or language buried deep in a linked privacy policy is not sufficient to comply with this requirement.

To track consent, we will be implementing a system that allows administrators to define default consent wording for each language, along with the ability to override this language on a per-page basis.

You will be able to choose whether this language is displayed for all users or only for a list of countries that you designate.

If the consent language is displayed, the associated checkbox will need to be checked for the action to be processed. We will also record the consent language that we served, along with a timestamp, for every action, so you will have a permanent audit record.

You will be able to deploy this functionality regardless of whether you host your pages directly on ActionKit or embed them in your own CMS.

If you have existing consent information that you want to port over to our tracking system, let us know and we will work with you to figure out a migration process.

Both of these features will be available in your instance in March.

Finally, the GDPR landscape will evolve over time. We'll continue to monitor the state of the art and expect to revise and add to this feature set in the future.

If you have any questions or thoughts, please let me know.


Hey ActionKitties! We’ve got a big one coming your way this evening with lots of juicy new bits.

Support for Partial Refunds (currently Braintree only): You can refund part of a donor’s one time donation or recurring payment, if the donation was processed through Braintree. We’ll be adding support for partial refunds at other merchant vendors in the coming weeks.

You prompt a partial refund by clicking 'Reverse' from the user’s Donation or Action History screen, just as you would for a full refund. This brings you to the 'Reverse Donation' screen and if the donation has settled, you’ll see a link to 'issue a partial refund'.

Click that link and a box with the amount available for refund will display. We subtract any previous partial refunds so you can’t refund more than was donated.

Braintree donations generally settle overnight and you’ll see this message until partial refund is available.

For reporting purposes, ActionKit will reduce the amount in core_order by the amount refunded, and add a row to core_transaction with type='credit' and the amount refunded as a negative value. As of this month, query builder reports and ActionKit built-in reports that reference core_transaction count credits where applicable.

New Options for A/B Testing on Pages: You’ll see a few new checkboxes under 'Fields to Change' on the A/B Test screen for Pages.

The Statement Lead-in Text option corresponds to the Lead-in Text on both Petition and Letter page types. It has no effect on other page types. Similarly, the Statement/Letter Text option allows you to test variations in the script for Call and Whipcount page types, and the statement for Petition page types. Finally, the Survey Question option exposes the survey question for Call, Whipcount and Unsubscribe page types. You can see all this info in the tooltip for the relevant option.

There's also a new checkbox that allows you to test user recognition. This will modify the page setting that controls whether user AKID recognition is disabled, or is disabled for users who've already taken at least one action. Thanks to Mark at CREDO for requesting!

We documented how to use custom page fields and templates to A/B test page layout changes like disabling the thermometer.

And we added tooltips to each of the statistics on the Test Dashboard providing a bit more information about how the number is calculated. Thanks to Shannon at UltraViolet for highlighting the value of this and suggesting some descriptions.

Instant Donate: Thanks to those who took me up on the offer to see our Instant Donate set up. We got some excellent feedback and as a result have started on adding a monthly upsell to the flow. This will be built into the Original templateset for Instant Donate only. Expect to see this in the next release or three.

We also hotfixed a change that makes it possible to override the default button style for the one click snippets in the mailer. You can’t change the text or the basic structure but the appearance can be modified to match your look and feel. Details are in the Instant Donate section of the guide.


  • We now skip totally blank lines in merge files and we fail mergefiles that have a blank for the key column with data after it. Thanks to Nathan at MomsRising and Duncan at for the examples.
  • We made the error message clearer for merge files and queries that include multiple rows for one user. The mailer only accepts one row per user in the file. Thanks to Adam at MoveOn for reporting.
  • If you were a very speedy clicker with slightly bad luck it was possible to click the button twice to confirm scheduling your recurring mailing and have two copies of the mailing set up at the exact same moment to send at the exact same time. Just try to do that now! Thanks to Mark at Progress Texas for quick draw scheduling.
  • Recently we added a warning about links that had query strings in the URL that we couldn’t parse but it was displaying incorrectly in some cases. This has been fixed. Thanks to Chris at FCNL and Ben at Alternet for reporting.
  • We now allow whitespace chars other than spaces around "AS" in merge queries. This bit Jeff at M&R because our code searched for 'as column_name' expecting a space before 'as' and was fooled by 'as' appearing at the beginning of a line preceded by either a newline or tab character.
  • It was possible to use a recurring mailing parent as a targeting inclusion/exclusion, although this led to build errors on the mailing that targets the parent. These are now excluded from the targeting drop downs.

Braintree-Only Changes

Braintree Javascript upgrade: We added a {% braintree_js_libraries %} tag to load javascript libraries that Braintree donation pages depend on. You can use this in your donate.html and recurring_update.html templates to automatically load the latest version of the libraries that we have tested as working. We attempted to patch this to all client templatesets. If you don’t see this in your donate.html or recurring_update.html templates, you can insert {% braintree_js_libraries %} instead of the following lines:

If you want to target a specific, constant version, you can use {% braintree_js_libraries "3.12.0" %}.

Sync recently-cancelled profiles: We synced only active profiles, so if a payment was made the same day you or a donor canceled the profile, the final donation might not have made it into ActionKit. Now it will. Thanks to Scott at MoveOn for the use case. Sync status change: If the sync finds a profile that has been canceled, the status is only changed to 'canceled_by_processor' if the profile was previously 'active'.

Salesforce Sync

Work on the Salesforce sync continues! Recurring donations have been added and are now in testing.


  • We added a new option to the spam settings, accessible from the CONFIG screen, called "Email Blacklist Check" which accepts regular expressions to use for identifying spam email addresses. This allows you to block an entire domain. Please use with care. Don't blacklist gmail! Read more about the setting.
  • The optional inline TAF box (present but disabled in the Original templateset) had a typo that caused the preview feature to not work. Thanks to Ben at Progress Now for reporting the issue.
  • We added permissions to view the recently-released email log for transactional event emails to the 'Pages-Edit,View,Create' and 'Events-Manage' permission groups. This change was hotfixed so it's already in your instance. Thanks to David at MoveOn for flagging.
  • We changed our approach to freeing the emoji! For most of you this won’t change anything, but for international clients content that was previously converted to numeric entities should convert back in the visual editor, so Hebrew will become Hebrew again, etc. You may need to force a reload for your browser to load the new code. (Technical description: we now only convert the four-byte characters into numeric entities while leaving other characters alone). Thanks to Benjy @ Zazim for letting us know about the problem.


Hey ActionKitties! For this release we banged out some bug fixes and minor improvements, which you'll see in your instance by tomorrow morning.


  • We’ll show an 'Estimated Finish' for mailings with a rate limit on the mailing report screen in the speed section, so you don't have to calculate manually to see if your mailing is going to take 3 days to send.

  • Re-engagement jobs are displayed and can be stopped from the 'Manage Jobs' button on the Mailings Tab.

  • When we unsubscribe someone who marks your email as spam, they now have a source of 'mailing' in core_action for the unsubscribe. We already recorded the mailing_id. Thanks to Courtney at Color of Change for reporting the missing bit.

  • We fixed a couple of problems with mailing previews.

    • First, we'll use fake data to generate a preview on the compose screen if your mailing has a target set that had no users the last time it was built, instead of displaying a 'list index out of range' error. Thanks to Sara at Free Press for reporting.

    • And, if the preview hits an exception using fake data for an uncached merge query, you’ll see a more informative error:

      "We're unable to generate a preview for your mailing. This might be because you're using a merge query that isn't cached, so we're substituting fake data for it in the preview. You can fix this by either setting the merge query to cache or generating proofs instead of using previews. Proofs will run your merge query and use real data. Here's the original error we found: [error]"

      Thanks to Josh working for People Power for flagging.


  • For one-time donation reversals, we now display the name of the staffer who prompted the refund on the user’s donation history screen. Thanks to Michelle at NRDC for the request.
  • We updated some code in the admin UI to know about recurring profiles with delayed start dates so they wouldn’t be marked as failed while awaiting the initial payment. Thanks to Brandon at Mercy Corps for the example.
  • We stopped lying! On the Download Actions screen you can check a box to include 'full address' with the results, and that now includes address2. Thanks to Ben at J Street for flagging!
  • And we acknowledged reality. We still had Obama listed as President. Sadly, this has been corrected.


Happy New Year ActionKitties! In this release we have a few improvements to our code related to advocacy targets and we’ve added tracking for event-related transactional emails. As usual, you will see these changes in your instance tomorrow. Also, we’re starting to make plans for ClientCon 2018! Watch your inboxes for a survey on timing and location.

New Features Demo

Have you been thinking of trying out Instant Donate or Remember Me? Monitoring progress on the Salesforce integration? Let me know if you're interested in joining a call where I'll show how they work and how to set them up!

Congressional District Targeting

Historically we’ve used zip-to-district mapping to assign users to congressional districts. With this release, we’re moving to assigning users based on locating their geocoded latitude and longitude within TIGER census boundaries. We fallback to a new (TIGER-derived) zip-to-district and lower precision lat-lon lookup. State districts have already been using TIGER-derived boundaries.


  • We made a few changes to speed up the Advanced Search from the Event Campaign Dashboard in the admin UI.
  • And we changed how we calculate the “Count” for Tags on the user record. Previously we counted the number of actions. Now we count the number of pages. The tag order for specific users may change as a result. This speeds up the user record load time if the user has many tags and actions.
  • We fixed a bug that kept the required asterix from displaying for “Name” when first and last are both required. Thanks to Mark at CREDO for flagging.
  • The action query builder was unable to display whipcount targets or their responses; this oversight has now been rectified. Thanks to Chris @ FCNL for flagging the issue.
  • We increased the tweet limit to 280 characters. Thanks to Katie at PFAW for the request.
  • We fixed a place in the documentation that referred to but should've been event.title. Thanks to Ethan working for People Power for taking the time to point it out!