Sync perks to a CMS
Keep the perks in your own content system — a headless CMS, a database, a static site generator — up to date with Paylode, without editing them by hand.
If your site renders content from a CMS rather than calling APIs at request time, you'll want your perks to live there too. This guide pulls a collection on a schedule and upserts each perk into your CMS by its stable id, so adds, edits, and removals in Paylode flow through automatically. It's a background job, not a customer-facing request — which changes one thing about how you call the API (see step 3).
How it works
You run a job on a schedule — a cron entry, a CI job, a scheduled function. Each run fetches the full collection, then for every perk:
- upserts it into your CMS keyed on the perk
id(create if new, update if changed), and - removes or deactivates any CMS record whose perk id is no longer in the collection.
Because you key on the perk id, re-running the job is safe — it converges to
whatever the collection currently holds.
Before you begin
- Your API key. Sent as the
X-API-Keyheader. See Authentication. - Your collection id.
- A runtime that runs on a schedule. Cron, a CI pipeline, or a scheduled serverless function all work — the job is a single GET plus your CMS writes.
Steps
1. Fetch the collection
curl https://perk-collections.paylode.com/perk-collections/example-rewards \
-H "X-API-Key: sk_example_0000000000" \
-H "X-Disable-View-Tracking: true"
2. Map each perk to your CMS model
Pull the display fields onto your CMS record. Store the click_url as-is — it's
the Redeem link and must be used verbatim (don't wrap it):
{
"id": "42",
"title": "Get 16 free meals",
"callout": "up to 70% off",
"description": "Meals that are easy to make, delivered to your door.",
"redemption_note": "Applied automatically at checkout.",
"coupon": "PAYLODE20",
"click_url": "https://link.paylode.com/?upid=sample-opaque-ref",
"metadata": "Food Tasty Cook"
}
metadata is a string, not an object. It's free-text used for on-page
search (keywords describing the perk) — store it as a plain string. Treating it
as JSON will throw.
3. Suppress view tracking on sync jobs
A perk read normally counts as a customer viewing that perk. A sync job isn't a
customer, so tell Paylode not to record the view by sending
X-Disable-View-Tracking: true (shown in step 1). Skip this and your background
job will inflate your perk-view metrics.
4. Upsert and prune
For each perk in the response, upsert into your CMS keyed on id. Then delete or
deactivate any CMS record whose id wasn't in this run's response — that's how
removals propagate.
Once you're live
Pick a cadence that matches how often your perks change — hourly or daily is typical. Each run reconciles your CMS to the live collection, so a missed run self-heals on the next one.
Worked example
A daily Node job that syncs a collection into a CMS:
async function sync() {
const res = await fetch(
"https://perk-collections.paylode.com/perk-collections/example-rewards",
{
headers: {
"X-API-Key": "sk_example_0000000000",
"X-Disable-View-Tracking": "true",
},
}
);
const { perks, groups } = await res.json();
// perks[] is flat; groups[] carries display order if you need it
const seen = new Set();
for (const perk of perks) {
await cms.upsert("perk", perk.id, {
title: perk.title,
callout: perk.callout,
description: perk.description,
note: perk.redemption_note,
code: perk.coupon ?? null,
redeemHref: perk.click_url,
search: perk.metadata ?? "", // string, not an object
});
seen.add(perk.id);
}
await cms.deactivateMissing("perk", seen);
}
Troubleshooting
If your perk-view numbers jump on the schedule your job runs, you've forgotten
X-Disable-View-Tracking: true. Add it to the sync request — leave it off only
on real customer-facing reads.
Reference
This guide uses the getPerkCollection operation. See the perk-collection
operations in the API Reference.
Related
- Perk Pages overview — what the product does and how this page fits it.