This article represents generalized questions and answers that were discussed during the Advancement: Ask Us Anything Community Conversations.
Portals/Dashboards
Question: How do I fix the Research Person dashboard panels (they look broken) and make the Donor Profile portal match Clean Slate branding?
Answer: The source panels on the Research dashboard were splitting into two rows instead of staying on one row because your institution’s branding CSS was overriding the default <a> tags.
Fix:
Open the Research Person dashboard → Source → find the “source panels” section.
Copy the entire <div> block.
Paste it into an AI tool (Grok, ChatGPT, etc.) and say: “This is creating two rows instead of one; fix it so everything stays on a single row and looks clean.”
Paste the AI’s improved version back into the dashboard (it swapped <a> tags for <span> tags that work better with your branding).
Save → refresh. Panels now roll up correctly.
Donor Profile Portal CSS:
The “Open PDF / Profile” link on the dashboard points to a full portal.
Go to any working portal (e.g., MGO portal or Donor Profile in Clean Slate).
Click Edit Template (this is where all the nice CSS lives).
Copy the entire CSS block.
Paste it into your Donor Profile portal’s Edit Template section and save.
The portal now inherits Slate’s mobile-friendly branding automatically.
Tip: Always keep a backup copy of the original HTML/JS in Notepad before editing.
Question: How do I link “Recent Contacts” (contact reports/entities) to the correct form instead of the Interactions modal? Also, how do I link Event Registrations to the actual event form?
Answer: Express Portals have limited built-in methods/views, so you have to edit the HTML/JS directly.
Recent Contacts (Contact Reports):
Edit the dashboard section that currently links to the Interactions modal.
Replace the link with an <a> tag that points to your custom contact-report form.
Pass the Person GUID and the entity/form GUID into the form (lazy pop-up or full page).
You already have the GUIDs in the portal export; you just need to wrap them in the correct HTML.
Event Registrations: This one is easier.
In your Events export, add the Form GUID (not the Form Response GUID).
In the portal HTML for the Event Registration section, change the link to: manage/event/form?id={form_guid}
Wrap the entire table row (or the link text) in an <a> tag so it’s clickable.
The Form GUID can stay hidden (not displayed) but still be available to the HTML.
You can make the link open as a pop-up or navigate to the full form. The same technique works for other entities.
Queries
Question: Why does my materialized view query error?
Answer: Materialized view queries are subject to the timeout limits as other queries. Depending on your environments data and configuration, sql execution plan ultimately has the most impact on query performance. In some cases, referencing a separate materialized view within the current view may remedy execution time outs. If this approach does not solve the issue, it’s appropriate to enlist more advanced query building assistance in the community forums.
Alternative: For resource-intensive calculations, consider adding a custom-scoped field to house the results of the calculation. This field may be updated by a rule or an import/export source format as needed.
Question: Why am I getting “group by” errors when my donor query references a gift-based Materialized View?
Answer: In Slate, “group by errors” usually happen when a query, report, or subquery is trying to summarize data, but the selected exports or joins do not line up correctly with the grouping logic. Below is an example of one “group by” error.

Contextual Recommendation: The best approach based on the scenario presented during the call is to build a ‘kitchen sink’ materialized view on the Donor base. All of the desired exports could then be calculated in advance, and easily referenced from donor-scoped query builders in lieu of calculating aggregates in subquery exports “on the fly.”
Tip: Use a Query Library for simple, reusable gilters (e.g., Is Hard Credit Gift).
Question: Can I query or filter gifts by specific date and time (e.g., for Giving Day)?
Answer: Yes — it just takes a small SQL formula instead of a normal filter.
Fix:
In your query, use a subquery on the gift table.
Pull from one of these fields: gift.created, gift.updated, or the gift date itself (form submission date automatically includes time).
Use a SQL formula to format the time (Eastern Time, military format) so you can filter by exact date + time range (e.g., between noon and 4 p.m.).
Tip: Stephen recommended building this once and saving the formula for future Giving Days — it’s quick once you have the pattern.
Question: When should I filter gift reversal/corrections?
Answer: Gift totals should exclude reversal/correction gifts whenever you are calculating net gifts. An example where including reversals and corrections is appropriate would be a general ledger feed query; including offsetting entry details will facilitate reconciliation. Actual giving activity is reflected by excluding reversals and corrections.
Question: Why does my query output inactive addresses instead of high priority ones associated with the same record?
Analysis: The query used a generic Address join with a Row Offset of 1, which returns a single address but doesn't specify which one. Slate selects one randomly.
Solution: Use a specific, ranked address join to define which address is returned.
Rank Overall: Returns the single highest-ranked active address.
Address by Type and Rank: Returns a specific address type (e.g., Mailing) at a specific rank (e.g., Rank 1).
Note: Slate's ranking logic ignores inactive addresses. If the highest-ranked address is inactive, the query will return null.
Reports
Question: Do I need to repeat “no reversal” and “no online” filters on every report part, or just at the top level?
Answer: No—you only need to set the filters once at the top-level report (Edit Report → Filters).
Choose the report base Gifts.
Apply “No Reversed Gifts” and “No Online/Pending” there.
Those filters automatically apply to every report part underneath.
You do not have to repeat them in each fiscal-year column or sub-section.
Important note: When you’re inside a report part you will still see the full unfiltered counts in the preview. The reversals/pending gifts are only removed when the final report actually renders. This is normal behavior.
Imports
Question: Why didn’t my upload dataset create a small specific set of gifts out of the full file of the gifts imported from GiveCampus?
Answer: For a gift to import successfully into Slate, each record must include all four required FAST data points:
Fund
Amount
Status
Type
If any of these fields are missing or incomplete, the gift will not be created during the import process.
Tip: The “successful” import reports that the import file successfully matched a person or dataset record. Success of ancillary imports cannot be generically summarized. Querying on source format uploads has been and continues to evolve; we recommend setting up basic auditing queries to run before and after the import to measure success.
Question: Why is my large query (650k+ records) timing out on force pickup, even when it’s set to only pull updated records?
Answer: The timeout was caused by extremely deep, nested subquery exports inside the salutation/formal-name calculations (rank-1 subqueries on top of other subqueries). Even though the query was filtered to updated records only, the complexity of those exports made the full run too heavy.
Solution:
Make a copy of the query and simplify the exports.
Replace the deep rank-1 subquery exports with shallower, direct calculations for each salutation component.
Preview both versions side-by-side to confirm the output is identical.
Once simplified, the full production run (JSON output) completed successfully.
Performance Tips:
Add a hard filter on the query itself: Person → Updated = Today.
Set the query Properties to Retrieve all records each time the query is run (do not rely on the Person queue “only new/updated” setting).
The filter runs faster than the queue logic and dramatically reduces the number of records the export calculations have to process (e.g., ~1,000 updated records vs. 688,000 total).
Pro Tip: The same pattern applies to rules—if a rule works fine on normal daily volume but suddenly fails after a large import, simplify the logic.
Question: JSON file vs. CSV: What do I need to know when setting up a JSON source format?
Answer: Because of how your on-prem Oracle/Banner environment handles CLOB fields, CSV exports fail or truncate long text. JSON works cleanly, including messy legacy formatting.
Key Differences & Setup:
Ad-hoc import only supports Excel, tab-delimited, or CSV files. There is no direct JSON option.
You must first create a new Source Format (Database → Source Formats → New).
Set Layout Type = JSON.
Define the file structure using an XML layout (node/row, then each column with its JSON path and a friendly name).
One-layer-deep JSON files are straightforward; deeper nesting gets more complex but is still doable.
Tips:
You can copy an existing source format and tweak the XML if you have multiple similar contact reports.
Use AI (Grok, ChatGPT, etc.) to generate the XML structure from a sample JSON file—it’s usually very accurate.
Test everything in the sandbox first. Source formats transfer cleanly via Suitcase.
Exports
Question: What’s the best way to batch-export a bunch of GIF/documents in Slate?
Answer: Use Slate’s Document Export Process query base.
Fix:
First configure your materials for export (there’s a Knowledge Base article for this).
Build a special Document Export query that selects the documents you want.
Run the query — it creates a zip file with one row per document (plus an optional index file).
Access and download the zip directly inside Slate using SFTP Explorer (no external FTP tool needed).
Tip: There’s a 5,000-row limit per export. For bigger batches, just split them into multiple runs. You can run the query on-demand or schedule it.
Automation
Question: How do I add Google Tag Manager (GTM) to Slate forms for tracking campaigns implemented by a Slate partner?
Answer: For global GTM tracking, add the code to /share/build.xslt to apply it to all generic Slate pages and forms. For specific forms or within portals, add the code directly to the form’s CSS section.
Tip: For testing, use a Time Warp environment to test the updates without impacting live forms.
Question: How do I align my custom fields with a Clean Slate suitcase example?
Answer: There is no automated tool that will compare your custom fields to another Slate database.
Additional Context:
Field IDs: Cannot be renamed. The friendly Name can be changed, but the underlying ID is fixed. Changing the field key effectively destroys any existing data stored under the previous field key.
Data Set GUIDs: The guids for custom datasets will vary in each individual database. These are critical for briefcase/suitcase imports. Mismatched GUIDs prevent direct transfer of complex objects like portals using suitcase.
GUID Alignment: For key data sets (e.g., Class Years, Prospect Management), Technolutions can run a script to align the GUID in our database with Clean Slate's.
Process: Create a new, empty data set locally. Technolutions then runs a script to update its GUID.
Note: This requires migrating any existing data from the old, non-aligned data set to the new one.
Manual Recreation: Use Clean Slate as a guide to manually build the dashboard or other object, mapping its components to existing local fields.
Question: How secure is a remote external user account with SFTP permissions?
Analysis: The remote SFTP connection is highly siloed and secure.
Access: Limited to the specific SFTP folder; no access to the database, person records, or other files is granted by creating an external user account.
Encryption: Files are encrypted in transit, so a breach of the vendor's SFTP would yield gibberish to a third party.
Vulnerability: The primary risk is a bad actor at the vendor uploading a malicious file, which can be remedied as necessary using a Time Warp environment within the 60-day window.
Question: Is it possible to view previous files shared via SFTP?
Answer: The process is an API web service, not a flat file transfer. The file is never "at rest" on the server, so there's no way to view the exact file sent.
Workaround: Schedule a separate query to save a backup file to a local SFTP folder for auditing purposes.
Question: How can I restrict someone with Record Lookup permissions, but not Record Update from creating new records?
Answer: Replace the default new record form with a custom one that has its own permissions.
Build a new record form with the correct scope and desired permissions.
From the Records landing page, click on the Configure List (aka abacus) Tool.
Click on Shared Views.
Click on Edit Lookup.
Select the form you created above from the dropdown list of forms.
Click Save.
Advanced: On the new form created, you can use submission conditions to provide additional permissions granularity as needed.
Question: Why has there been a large drop in email open rates which raises concerns about engagement tracking?
Analysis: Email analytics are increasingly unreliable.
Security Scans: Email providers (especially .gov, .mil) block pass-back data, preventing accurate tracking.
AI Pre-Clicks: AI agents now click links to scan for threats, inflating click rates with non-human activity.
Possible Solutions:
Use Deliver Insights: Compare your institution's metrics against the 2,000+ institution average to gauge relative performance.
Track Measurable Actions:
Query String Parameters: Embed appeal codes in links to track gifts and form submissions.
Ping Tracking: Add Ping code to emails to correlate website visits with email campaigns.Check Suppression Lists: A single email address can be added to a global suppression list from any institution using Slate after three bounces. This blocks all future mailings from any Slate database.
Question: How do I make the search bar find ALL emails and phone numbers on a record (not just the rank-1 device)?
Answer: The default Person Index Rule only searches the rank-1 email and the rank-1 phones that are stored on the Person table. To search all devices:
Create (or edit) the Person Index Rule.
Build a subquery export that joins to the Device table.
Use Concatenate to return every email or phone as a comma- or pipe-delimited list.
Filter the device type and status if desired (e.g., only Active/High/Normal).
Add the new export into the rule’s Formula field.
Run a retroactive refresh on the records (or the whole population) so the new search values are written to the index.
Question: Why does my retention policy designed to delete person records without gifts fail?
Diagnosis: The “Database | Error Logs” revealed the cause: "unable to delete an account with gifts." The retention policy query incorrectly filtered for "has no gifts with a gift status of received" instead of "has no gifts."
Solution: Change the retention policy query to exclude records that have any entry in the gifts table; the gifts table also includes pledges and planned gifts. The existence of gift table records block the deletion of the donor record causing the retention policy to fail.
Additional consideration: Scaling: If timeout errors occur while executing large batches of deletions, contact Technolutions to coordinate a one-time mass record purge.
Question: How do I automate refreshing a person field nightly based on start and end dates stored on a related record?Solution: Use a Query-to-Web Service automation chain in conjunction with an ‘On Update’ rule.
1. Query: Select records to be updated.
2. Web Service: Configure the query to export the data as JSON.
3. Source Format: Re-import the JSON, clearing the custom field. The source format setting “Disable Update Queue” should be set to “Allow records to enter update queue upon import (allows rules to fire).” The source format “Update Only” setting should also be set to “Update Only” to ensure errant field mappings do not create new records.
4. Rule: The re-import will trigger a rules update; the end result is that the field will be re-evaluated and refreshed for the selected records.
Alternative: An Exclusivity Group with two ranked rules (one for each condition) provides a simpler, record-by-record alternative.
Question: Why don’t my rules execute in the test environment?
Explanation: Test environments are intentionally throttled and lack overnight processes to conserve resources for production.
Recommendation: Build directly in production, using filters (e.g., a "test" tag) to isolate changes to specific records. This ensures accurate testing with full system functionality.
Question: What are advanced debugging techniques for users with a sql background?
Solution: The “Database | Standard Query Library | Slate Data Dictionary” page contains a list of all of the database table details within the instance. An example of the typical join pattern is the “id” field, frequently referred to as GUID in the interface, maps to the related table’s “record” field.
Question: How can I eliminate using an “OR” in rule filters?
Problem: A rule to identify trustees used an OR filter (End Date is null OR End Date > today), which caused timeouts in the test environment.
Solution: Replace the OR with two subquery exports.
Export 1: Returns 1 if End Date is null.
Export 2: Returns 1 if End Date > today.
Final Filter: Check if the sum of the two exports is >= 1.
Alternative: An Exclusivity Group with two ranked rules (one for each condition) provides a simpler, record-by-record alternative.
Question: Can I rename an entity without breaking existing queries, reports, and other automations?
Solution: Renaming an entity is safe because Slate uses GUIDs for internal connections. To see the new name, refresh existing queries.
Question: Why does my query return entity rows that are not the most recent?
Symptom: A query for a user's portfolio returned incorrect records and blank rows because it failed to isolate the current staff assignment from historical entity rows.
Solution: Use Main Query Joins to enforce a 1:1 relationship with the most recent entity row.
Create Joins: Add two Main Query Joins:
Enforce 1:1: For each join, set Rank Offset = 1 and Sort by Updated Date DESC.
Filter: Use standard filters against the new joins which now appear as separate groups in Direct Filters.
Performance note: This solution is more precise but slower. For large datasets, a Materialized View is recommended to pre-process the data.
Question: My campus is merging departments. How would we update our records to reflect the new department structure while preserving historical integrity?
Option 1: Translation Codes
Translation codes are best for simple, one-off queries. They allow Slate to transform text values to up to five other values per unique value. In this instance, a value of “Zoology” could be translated to a value of “Biology” for reporting purposes, while retaining the original historical value.
Additional consideration: Applying translation codes requires an additional export configuration step in both query and report builders. Likewise, the translation codes must be maintained on an ongoing basis.
Option 2: Custom Field & Data Migration
Creating a custom field named similar to “Original Major” could house the historical data. Once the data has been replicated into this new destination field, the existing field can be updated to the new values, if different.
Additional consideration: This approach requires a one-time data migration and conversation effort.
Recommendation: Based on the option that best suits your institution’s needs, document the chosen method for consistency. If needed, contact Technolutions to assist with a data migration effort.
Question: Why did my payment receipt email fail to provide the credit card last four digits?
Background: The form communication included Liquid Markup that did not render properly. Other content of the confirmation receipt rendered as expected.
The correct syntax without curly braces looks like this: {% if form-payment-receipt.last4 %}
Forms
Answer: In this instance, the conditional syntax for liquid markup does NOT utilize curly braces surrounding the variable name.
Question: How can I show a simple “yes/no” indicator on a form that a material (JPEG, PDF, etc.) was uploaded?
Answer: You want an administrative indicator (yes/no or checkmark) so staff know a file was uploaded and can download/send it to the coach or print shop.
Solution: On your person-scoped form, go to Edit Properties → Exports and create a new export under the Custom List Fields that checks for the existence of a material.
Steps:
Join Person → Material (one-to-many).
Set the export to Existence (yes/no).
Filter for the name of the material you want to flag.
This will display a simple “Yes” or “No” on the form registration list so your admin assistant can quickly see which registrations have materials attached and process them.
Question: How can I hide the Submit button on a Slate form when someone selects “Business” (so they are automatically redirected to another form without seeing or clicking Submit)?
Answer: Yes — there’s a simple JavaScript fix for this.
Fix:
Copy the following JavaScript snippet:
const $button = $("button.default[type='submit']"); $('input[name="form_FORM-FIELD-GUID"]') .on('change', function() { $button.toggle(this.value !== 'FORM-FIELD-VALUE'); }) .filter(':checked') .trigger('change');Go to your form → Edit Scripts.
Paste the code into the Scripts section, insert the GUID of the form field to the designated place in the code, and the value that the logic is should be based on in the designated place in the code.
Save and refresh the live form.
Now the Submit button disappears completely when “Business” is selected, but reappears for the other three options.
Tip: Always test it thoroughly on the live form before rolling it out. The script checks the value of a specific form field and hides the button accordingly. You can tweak it with AI (Grok, ChatGPT, etc.) if you ever need different behavior.
Question: Why do the available prompt list entries differ within the same form even though both refer to the same system field?
Cause: Form logic is cached separately from the public-facing form.
Solution: Make a minor edit to the form and resave to force a cache refresh, making new prompts available for all references to that field.
Events
Question: How do I set up mobile badge printing? I’m struggling with the merge fields on the badge template.
Answer: Here’s the exact process:
Fix:
Rename your merge fields to be Liquid-friendly (lowercase, use hyphens instead of spaces).
Open the Mobile Pass / badge template and switch to Source view.
Free-type the merge fields directly into the HTML (no helpful list appears on the right like in other areas).
Join out from the registration form → person → jobs → client record to pull in extra data not asked on the form.
Configure the QR code, front/back of the foldable badge, and save.
Hardware Tip: Use a dedicated cheap Windows laptop (~$300 Surface) per printer with nothing else installed. University laptops with IT security software almost always block the scanner/printer connection. Once set up, you just launch the Slate scanner app, scan the QR code, and it prints the badge instantly.
Payments
Deliver (Email, Text, Documents)
Question: Are there specific trainings or resources focused on constitutent outreach in Slate?
Answer: Yes—recruitment and campaigns are heavily covered on the Admissions side of Slate.
Recommended Resources:
Slate documentation and webinars on Campaigns (initial blast → follow-ups at 7 days, 14 days, etc.).
Look for upcoming trainings on outreach, and marketing automation.
Summit sessions on campaigns.
Pre-conference “Slate Presents” webinars (free) leading up to Summit.
Tip: Summit is a great place to see how peer institutions are handling recruitment—register soon (price increases periodically).
Stewardship
Question: What’s a good way to build a stewardship program in Slate?
Answer: Stewardship can be built many ways in Slate (forms, reader, portals, rules, etc.). There is no single “right” answer—map your process first.
Strong starting point:
Assignments (new last year) – Stewardship team get a personal list of constituents they are stewarding.
Set up cadences (next steps: thank-you call, invite to event, ask for gift, etc.).
Combine with a Donor Profile portal so everything lives in one place.
Showcase already has a basic stewardship example using moves management and rules. The team is actively expanding Assignments examples in Showcase and Clean Slate right now.
Recommendation: Post your planned process on the Slate forums for peer feedback—every institution does stewardship a little differently.
Question: Is the Slate Showcase “Performance Management” data set the best way for gift officers to track their gifts and goals?
Answer: It is one very good way, but not the only way. The Performance Management dataset was built from community input to give gift officers:
Goal tracking (year-over-year)
Historical views
An out-of-the-box Performance Management portal
Alternatives that may be simpler for some shops:
Assignments (Gift Officer Portfolio) – quick, shows your assigned prospects, and you can ask Slate AI questions about them.
A combination (dataset for goals + assignments for daily work).
The dataset is especially strong when you want evergreen, historical goal tracking. Assignments are lighter-weight and already integrated with AI.
Recommendation: Start with whichever matches your current process. Many offices use the Performance Management dataset for formal goal tracking and Assignments for day-to-day portfolio visibility.
Gift Processing
Question: Can you edit a gift in a batch if there’s a problem? Why did unprocessed batch gifts still appear in our Workday integration?
Answer: Unprocessed gifts that are still sitting in a batch should not appear in a standard Gift-based query. When a batch is created, Slate adds a row to the Gift table, but it does not assign an record GUID to the record column of that row. Instead the GUID or the associated record is added to the record_pending column. The system automatically filters out any row without an record GUID on the main Gift query base (the SQL is applied behind the scenes).
However, those same unprocessed gifts do appear in sub-queries (for example, when you look at a Person record → subquery for Gifts). This is intentional so you can still see pending batch items.
The duplicate gifts in Workday occurred because the gift-entry person manually entered the gifts directly on the person record while the batch was still open/unprocessed. The integration picked up both the manual entries and the batch rows that had already been created (even though the batch was never processed).
Fix / Best Practice:
Use a standard Gift-based query (not a person sub-query) for your general-ledger / Workday feed.
If you are using custom SQL for the feed, you may need to add SQL code to exclude rows where the Gift record column is null.
Every gift that is processed will have a value in the record column of that gift.
Question: How do I update the tribute type (In Honor Of / In Memory Of) on existing gifts? Retention delete isn’t fully clearing the old data.
Answer: The fastest and cleanest way is to fully delete and re-import the gifts.
Fix:
Export the gift records (include everything you need).
Run a retention policy to completely delete those gift records.
Re-import the gifts using the new tribute mappings.
Important: The old “occasion” column on the gift table still holds the legacy value unless you delete the entire gift record.
Question: How do I map multiple fund codes to a collection of campaigns without adding a field to the Funds dataset?
Solution: Create a campaign-scoped entity that includes a “Related Dataset Row” field that links to the Funds dataset.