Skip to main content
Home

Main navigation

  • Home
  • Updates
  • About me
User account menu
  • Log in

Breadcrumb

  1. Home

Pondering Large-Scale Redirects: Moving from Blackbaud Luminate to GiveCampus

By joehahn , 27 March 2026

If you’ve ever managed a CRM or digital fundraising platform transition, you know the anxiety of ensuring every old link still works. I recently navigated this exact challenge: migrating giving pages and ensuring seamless continuity for donors. The key? A robust, automated 301 redirect strategy.

The SEO and UX Power of 301 Redirects

When transitioning platforms, old URLs inevitably break. Many of our Luminate links go back nearly a decade and are floating around across hundreds of different web pages, old email campaigns, and printed materials. Unless those legacy links are accounted for, they will become dead 404 links the moment Luminate shuts down.

A 301 redirect is a permanent redirect that passes SEO equity from the old URL to the new one. This ensures search engines don't drop your pages from their rankings. More importantly, it ensures donors clicking those decade-old bookmarks or past emails land right where they need to—without experiencing a frustrating error.

Luminate's Internal Redirects vs. URL Shortcuts

Blackbaud's Luminate Online offers a few ways to handle URLs internally:

  • Scheduled Redirects (Published Status): When a giving page is unpublished or expires, Luminate can automatically redirect it to a scheduled replacement. This relies entirely on the page's "published" status within Luminate's ecosystem.
  • URL Shortcuts: Luminate allows you to create vanity URLs (e.g., /givetoMED). These shortcuts act as simple pointers to longer, complex strings.

When moving entirely away from Blackbaud's hosting to a custom server setup, these internal tools simply won't work anymore. We needed a server-level solution that operates independently of Luminate.

Gathering the Map: Incomplete Lists and Browser Extensions

The first massive hurdle is simply knowing what to redirect. Our team had a list of scheduled redirects provided by another developer, alongside a list of sources and destinations. However, these lists were incomplete and still required extensive manual review to correctly handle destination mapping (like prepopulation parameters).

On top of this, Luminate's "URL Shortcuts" section contains dozens of critical vanity links. To ensure none were missed after Luminate was shut down, we utilized a browser extension to scrape the table data directly from the Luminate admin dashboard. Only with these combined lists could we be confident our map was comprehensive.

Decoding Giving Links: df_id vs. px

If you've spent time analyzing Luminate URLs, you'll instantly recognize the structural nuances of their query strings:

  • df_id (Donation Form ID): Used for standard giving pages (e.g., ?df_id=1818). When dealing with hundreds of campaigns, this ID is the primary key to map an old page to a new destination.
  • px (Participant Extension): Used for TeamRaiser or peer-to-peer personal pages (e.g., ?px=1234567).

Understanding how to extract these distinct query parameters was crucial for building routing rules that accurately target the right links.

Designation Prepopulation vs. The "Write-In" Field

Another interesting detail was how designations are handled on the new forms vs. old forms. When possible, the redirect mapped the legacy URL directly to a prepopulated designation on the new platform using query parameters (e.g., &designation=Medical+Alumni+Annual+Fund).

However, not all legacy designations strictly existed in the new system's explicit dropdowns. For these, we leveraged the special_instructions query parameter in the new platform. This acted like a "write-in" box, ensuring the intent of the donor's original link was preserved, even if the exact fund wasn't pre-configured in the new primary menu.

Automating .htaccess Generation with Python

Writing hundreds of Apache RewriteRule and RewriteCond statements manually is a recipe for typos. With our aggregated spreadsheets ready, we used a custom Python script. The script iterated through the CSVs, used regex to extract df_id, px, or vanity URLs, and automatically generated the precise Apache mod_rewrite syntax. What could have taken hours of mind-numbing manual data entry took milliseconds, producing a clean, accurately formatted .htaccess file ready for production.

Deployment and the DNS Waiting Game

With the script finished, the final .htaccess file was placed on our webserver within the specifically configured 'giving' Virtual Host (vhost).

The transition step was the DNS update. We changed the giving subdomain's CNAME/A record from pointing to Blackbaud's services directly to our own webserver's IP. Remember: DNS propagation takes time. By having the .htaccess fully primed on the new vhost, the moment the DNS resolved for a user anywhere in the world, their requests smoothly flowed through our new server and onto the correct destinations.

Testing with Windows PowerToys and the Hosts File

Before flipping the DNS switch, you absolutely have to test. But how do you test server-level redirects for a domain that is still pointing to Blackbaud in public DNS?

The answer: modifying the local hosts file. By mapping the giving subdomain to our new web server's IP address locally, I could test the .htaccess rules on my machine exactly as they would run in production. For Windows users, the "Hosts File Editor" in Windows PowerToys makes this incredibly easy, circumventing the headache of diving into C:\Windows\System32\drivers\etc with notepad as an administrator.

Summary: What You Need to Know Before Taking This On

If you are preparing for a similar migration, here is what you must have in place:

  1. A Complete URL Map: An accurate spreadsheet mapping old URLs to new destinations. This may require combining existing developer spreadsheets, manual reviews, and even table-scraping browser extensions.
  2. Understanding of Query Strings: Know exactly what variables (df_id, px, etc.) identify unique pages in your old system.
  3. A Scripting Language: You need Python or a similar tool to automate the rule generation and avoid manual errors.
  4. Server Access & Knowledge: You must understand Apache Virtual Hosts and mod_rewrite rules.
  5. A Testing Strategy: Know how to override local DNS (via hosts file) to validate your redirect logic before the public DNS change goes live.

Conclusion

Migrating away from a massive ecosystem like Luminate requires careful orchestration. By combining team collaboration, Python automation, a solid understanding of Apache routing, and thoughtful local testing, what could have been a messy transition with broken links instead became a seamless, SEO-friendly upgrade. Keep building, keep learning!

Recent content

  • Pondering Large-Scale Redirects: Moving from Blackbaud Luminate to GiveCampus
    11 minutes 32 seconds ago
  • The Great Re-Platforming of the Mind: When Drupal 11 Met Salesforce Lightning
    1 month ago
  • Error Handling for Humans: My Algorithm for Avoiding the Flu
    2 months ago

Monthly archive

  • August 2025 (1)
  • September 2025 (7)
  • October 2025 (3)
  • December 2025 (1)
  • January 2026 (3)
  • February 2026 (1)
  • March 2026 (1)
Powered by Drupal