How to use an API to run a normalization process on a set of records in five easy steps
In this blog post we will show how to use an API to run a normalization process on a set of records in five easy steps.Note that in order to run a normalization process on a set of records via an API you will need an API key for Read Write in the "Configuration" area.Here…
Automating Alma Analytics for Librarians with VBA Macros for Excel and Power BI
Automating Alma Analytics for Librarians with VBA Macros for Excel and Power BI This VBA macro streamlines the process of downloading and parsing XML reports from Alma Analytics via its REST API. It dynamically extracts column headers and row data, then populates them into an Excel worksheet—perfect for librarians looking to automate data retrieval and simplify…
Implementing self-checkout product integration for CampusM and Alma with multiple libraries
The campusM - Alma product integration (PI) for self-service loans was released in CampusM/Library Mobile in August 2025.The Self Checkout product integration enables patrons to borrow library items independently using their mobile devices or desktop browsers. It supports barcode scanning (via camera or manual entry) and integrates with only Alma (at present).Single or Multiple PI/tiles…
How to use the REPLACE function to replace all or part of a string in a letter
This blog will show how it is possible to use the REPLACE function in the XSL of a letter to change all or part of a string text of values.For example, in a certain letter we might want to change the text of a library or location but leave the actual name as it already…
NDE Customization: How to build a component that requires values from the pnx
How to create a componentHaving implemented customizing for Primo versions for more than 10 years, I was very curious to see how customizing works for Primo NDE. As a member of the NDE Customization Focus Group, I was given early access and some information. One of my first test cases was displaying a link to a journal…
Primo NDE: Programming an Add-on
MotivationIn recent years, other institutions have often asked us whether they could reuse some of our customizing modules for Primo.Back in the days of jQuery, this was easy: we simply shared a snippet of code that could be copied into custom.js.With Primo based on AngularJS, things became more complicated.Technically, we could (and did) package modules…
How to use XSL configuration to change the date format in a letter
This blog post will show how to change the format of the due date in the borrowing activity letter so that it will be YYYY-MM-DD instead of DD/MM/YYYY.While we are making a change to a specific date in a specific letter, the important point is that this method can be used for any date in…
How to use a template to replace all or part of a string in a letter
This blog will show how it is possible to add a function to the XSL of a letter to change all or part of a string text of values.For example, in a certain letter we might want to change the text of a library or location but leave the actual name as it already appears…
IHP: The First Institution to Go Live with Primo NDE UI – Our Journey, Customizations, and Lessons Learned
We are IHP (Index to Hebrew Periodicals), a bibliographic database created and maintained by the Younes and Soraya Nazarian Library at the University of Haifa. On August 13, 2025, we became the first institution worldwide to go live with the new Primo NDE user interface and gain access to MixPanel.We want to share our experience,…
PRIMO Primo VE Primo VE NDE Primo VE NDE Customization Package
XSL Normalization Rule to add current date in 998 field
We added this to the Save Function so that it automatically runs when we save a record. On save, the current date is added to the 998 field.<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" indent="yes"/><!-- Main template that processes each record --><xsl:template match="record"><xsl:variable name="today" select="format-date(current-date(), '[Y0001]-[M01]-[D01]')" /><xsl:copy><!-- Copy all elements except 998 --><xsl:apply-templates select="@* | node()[not(self::datafield[@tag='998'])]"/><!-- Rebuild…