Advancement FAQ (Ask Us Anything)

Prev Next

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:

  1. Open the Research Person dashboard → Source → find the “source panels” section.

  2. Copy the entire <div> block.

  3. 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.”

  4. Paste the AI’s improved version back into the dashboard (it swapped <a> tags for <span> tags that work better with your branding).

  5. 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.

  1. In your Events export, add the Form GUID (not the Form Response GUID).

  2. In the portal HTML for the Event Registration section, change the link to: manage/event/form?id={form_guid}

  3. Wrap the entire table row (or the link text) in an <a> tag so it’s clickable.

  4. 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: 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:

  1. In your query, use a subquery on the gift table.

  2. Pull from one of these fields: gift.created, gift.updated, or the gift date itself (form submission date automatically includes time).

  3. 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.

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 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:

  1. First configure your materials for export (there’s a Knowledge Base article for this).

  2. Build a special Document Export query that selects the documents you want.

  3. Run the query — it creates a zip file with one row per document (plus an optional index file).

  4. 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 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:

  1. Create (or edit) the Person Index Rule.

  2. Build a subquery export that joins to the Device table.

  3. Use Concatenate to return every email or phone as a comma- or pipe-delimited list.

  4. Filter the device type and status if desired (e.g., only Active/High/Normal).

  5. Add the new export into the rule’s Formula field.

  6. 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.

Forms

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:

  1. Join Person → Material (one-to-many).

  2. Set the export to Existence (yes/no).

  3. 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:

  1. Copy the JavaScript snippet

    1. const $button = $("button.default").show();

      $('input[name="form_FORM GUID HERE"]')

       .on('change', function() {

         $button.toggle(this.value !== 'FOMR FIELD VALUE');

       })

       .filter(':checked')

       .trigger('change');

  2. Go to your form → Edit Scripts.

  3. 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.

  4. 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:

  1. Rename your merge fields to be Liquid-friendly (lowercase, use hyphens instead of spaces).

  2. Open the Mobile Pass / badge template and switch to Source view.

  3. Free-type the merge fields directly into the HTML (no helpful list appears on the right like in other areas).

  4. Join out from the registration form → person → jobs → client record to pull in extra data not asked on the form.

  5. 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:

  1. Export the gift records (include everything you need).

  2. Run a retention policy to completely delete those gift records.

  3. 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.

Still looking for what you need?