A blog about technology in general and nonprofit technology in particular - musings, stories, tutorials, and links. Written by Jason Samuels, an IT professional working in the nonprofit sector. Any opinions stated here are my own.
This post shares a Google Sheets template that collects an operating budget from department and personnel budget owners, consolidates it, and produces a file formatted to import into Sage Intacct as a board approved budget. Up front, here are the downloadable resources: copy the Nonprofit Budget Planning Sheet for Intacct and its technical specifications from this folder . A note on the…
Here’s a free Python script that reads a list of URLs from a CSV file and downloads the file at each one . I recently used it to pull a 35+ GB batch of almost 13,000 files out of Airtable for a client’s data migration. I didn’t write this script - Claude did. But the code is short and readable enough that I could follow what it does, and I can attest that it worked exactly as…
What do you do when an external system transmits multiple simultaneous rows of data that all belong to the same transaction? That’s the integration engineering challenge I encountered recently. A constituent checks out once - an event ticket, a raffle ticket, a guest’s registration - and the upstream system sends one row per item. Those rows need to be consolidated into a single…
This blog post documents how to configure an automated cart abandonment email for Blackthorn Events in Salesforce. I built this for a client who wanted to re-engage constituents who visit an event registration form and begin but do not finish the registration process. It’s basically the same tactic online retailers use when you leave something sitting in a shopping cart, applied to event…
Did you know that the Google Docs API has built-in mail merge functionality ? And that it’s available in Zapier’s Google Docs connector? If you’re a Salesforce admin who didn’t previously know that, you might be thinking what I thought when I found out - aha, I don’t need a document merge package any more! This blog post walks through how I implemented this for a…
Last summer I co-authored a capstone analysis of NTEN’s Tech Accelerate survey data. The data transformation engine behind that analysis was a Power Query model built in Power BI Desktop. This blog post shares and walks through that data model. This article serves two purposes: it’s an example of how a data model can be used to ingest raw nonprofit program data and manipulate it into a…
Earlier this year I shared a Power Query data model for consolidating Salesforce profile permissions . This post shares a new version of that data model, which now consolidates permissions from multiple profiles into a single new baseline permission set. Salesforce has been steering admins towards permission set-led security for years. In 2023 they announced that permissions in profiles would be…
In any integration design, the most foundational decision is what it writes to. My answer, almost every time, is a custom object that exists for that purpose. A few months back I wrote about building a hyper-efficient review queue interface in Salesforce , and tucked inside that post was an opinion I stated emphatically - that when you’re integrating data into Salesforce from a third-party…
**NOTE** please see this newer blog post for an updated data model template and instructions . Two software tools that I use a lot to deliver value from my consulting work are Salesforce and Power Query in Power BI Desktop. The latter is not very well known among my Salesforce peers, but I think it’s a hidden gem of a powerful free tool for data analysis and scripted transformations. This…
I really enjoy the challenge of engineering integrations, working through the process of figuring out how a schema on one side fits a schema on the other side using elegant and maintainable plumbing in-between. Every use case is different and it’s always important to have a conversation about whether an integrated data feed should be trusted to create new records on its own, or whether…
My last blog post was about implementing a CSV import feature. This blog post documents utilizing that screen flow feature to facilitate attendee group management for Blackthorn Events. The scenario is an events center that uses Blackthorn Events and Salesforce for their day-to-day operations. Most of their event registrations are processed in their own system, but some events they host are run by…
This is a tutorial for how to build a Salesforce Screen Flow that leverages this CSV to records lightning web component to facilitate importing data from another system via an export-import process. My colleague Molly Mangan developed the plan for deploying this to handle nonprofit organization CRM import operations, and she delegated a client buildout to me. I’ve built a few iterations since. I…
Power BI is a powerful tool. In my consulting work I utilize Power Query for Power BI to transform and prepare constituent data for system migrations. One recent breakthrough in regards to making that even more powerful and efficient was the implementation of Python scripting and the dataprep library . The following articles were very helpful for figuring out how to do this: How to Use Python in…
So, uh, long time no blog. It’s been over four years since my last post. A few things have happened since. I figure the best way to brush off the digital cobwebs is to share something amusing. I like gadgets. I’m not embarrassed to admit that, except when I think back to my Google Glass year a decade ago. Most of my technology purchases now are more reasonably priced, everyday tech,…
It’s a pretty cool feeling when you’re looking to build something very specific and you find a platform that does that specific thing really well. I recently had that experience and as a result have become a fast fan of Glide Apps. The use case at hand is for box office staff working at the American Craft Show to look up and check in members from our database. Free admission to the…
Had an interesting challenge to work through the other day - I wanted to hide some description text on a webpage behind a Show Description link, but had to accomplish that using only CSS animation because our CMS (rightfully) will not allow me to inject arbitrary Javascript into a page via the WYSIWYG. I mean I didn’t really have to, I could have gone through the process of staging an update and…
My org cut over from Raiser’s Edge to Salesforce in January 2018, and one of the pain points we encountered early on was that donation soft credits were recorded at the contact level but not at their household account level. A structural solution to this issue became available with the launch of NPSP Customizable Rollups in June 2018, and I’m now in process of building them out for my…
This blog post is overdue. My organization cut over from Raiser’s Edge to Salesforce early this year. Data conversion was a huge challenge, and this post aims to pay forward some tips, scripts, and spreadsheets for tackling an RE migration. It needs to start with some acknowledgements. These SQL scripts derive from the scripts in Jon Goldberg’s post on Exporting Raiser’s Edge for CiviCRM . I don’t…
Throughout the years I’ve written numerous case study blog posts which then contain a file download link to obtain a template of the work described. It recently came to my attention that most of my download links were broken. Turns out I missed this annoucement about Dropbox shutting down links from the old Public folder as of September 1. The links have been restored and files can be…
My organization is in the midst of a Salesforce implementation. We’re going in phases, replacing systems in order and getting departments live as they’re built out and ready to go. Our first department that went live on Salesforce converted over from a legacy ACT! database. This is a case study of the steps taken to get contacts and notes data out of that system. The department that we…