Daily portfolio data quality queue for Addepar ops teams

Open one screen each morning, work through flagged holdings and missing client data in Addepar, fix what you can inline, and escalate the rest.

App
AddeparJiraSlack BotOperationsFinanceData SyncNotifications & Alerts
PromptCreate

Build me an app that my portfolio data operations team opens every morning to work a firm-wide data quality exception queue in Addepar. The people using it are data ops reviewers who each own a set of households, plus a team lead who watches the whole queue burn down through the day.

The main screen is the exception queue: a list of flagged holdings and entities grouped into exception types. Start with three types. First, stale valuations: assets with no valuation posted in the last N days, where N is a setting that defaults to 5 business days. Second, incomplete records: positions whose owner entity or owned entity is missing attributes that its entity type requires, which I find by reading the required attributes for each type with Addepar List Entity Types and comparing them against what the entity actually has. Third, large moves: holdings whose market value moved more than a set threshold since the prior close, defaulting to 15 percent. Each row shows the entity name, the household it rolls up to, the exception type, the specific detail such as days since last valuation or percent moved, and its current review state. Let me sort and filter within a group, and show a count next to every exception type header.

Loading the queue matters a lot here because Addepar rate limits are per firm, at 50 requests per 15 minute window and 1000 per 24 hours. Build the queue from a small number of batched Addepar Query Portfolio Data calls that pull market value, prior close value and last valuation date as columns across many holdings at once. Do not fetch per row. Compute the exception types in the handler from those batched results. There is no bulk list endpoint for snapshots, so detect valuation staleness from Query Portfolio Data columns rather than trying to list snapshots. Use Addepar List Entities and List Positions to resolve entity names, types and ownership links for the rows in the queue, again in batches. Any single Addepar request that runs longer than 60 seconds fails, so if the firm-wide extract is large, submit it with Addepar Submit Async Portfolio Job and poll for the result. Cache the loaded queue in the app's own storage, show a last refreshed timestamp, and give me a manual refresh button instead of refetching on every page view.

Clicking a row opens a detail pane beside the list. The pane shows the full entity record from Addepar Get Entity including its attributes and which required ones are blank, the ownership link from Addepar Get Position showing owner and owned entity with inception details, and recent activity from Addepar Get Transaction for the transactions tied to that holding so the reviewer can see what last moved.

The pane has inline fixes so most exceptions never leave the app. A form to fill missing attributes and save them with Addepar Update Entity, showing which fields the entity type requires. A form to correct inception details, display name or custom attributes on the ownership link with Addepar Update Position. And a form to post a refreshed value for a stale asset with Addepar Create Snapshot or Valuation, taking a value and an as of date, using a snapshot for share or percent based assets and a valuation for value based assets like real estate, private equity and hedge funds. After any successful write, update that row in place and mark it cleared rather than reloading the whole queue.

Anything the team cannot fix inline gets escalated from the same pane. An escalate action opens a form prefilled with the entity name and the exception detail, creates a ticket with Jira Create Issue in a project I configure, and posts a note to our ops channel with Slack Send a Message that names the entity, the exception type, the reviewer who escalated it and a link to the Jira issue. Store the resulting issue key on the exception so the row shows it and nobody escalates the same thing twice.

Review state has no home in Addepar, so persist it in the app's own storage. Each exception can be marked reviewed or accepted with a free text note, and I want to see who set it and when. Let each reviewer filter the queue to just the households they are assigned, with the assignment list editable in a settings view, and remember each person's last filter. Show an open versus cleared counter at the top that updates as rows are worked, so the team can watch the queue burn down through the day. Keep the settings for the staleness window, the move threshold, the Jira project and the Slack channel in one settings view rather than hardcoded.

What does this prompt do?

  • Gives your data operations team one morning screen listing every flagged holding and client record in Addepar, grouped by the kind of problem: values that have not been refreshed recently, records missing information their type requires, and holdings whose value jumped more than your threshold since the prior close.
  • Opens a detail view on any row showing the full record, who owns it, and its recent activity, so a reviewer can see what went wrong without switching systems.
  • Lets reviewers fix most issues right there by filling in missing details, correcting an ownership link, or posting a refreshed value back to Addepar.
  • Escalates anything that needs a specialist by raising a ticket and posting to your operations channel, then tracks every item as reviewed or accepted with a note and shows an open versus cleared counter as the queue burns down.

What do I need to use this?

  • An Addepar login for your firm with permission to view portfolios and edit records, since the app both reads flagged items and writes fixes back
  • A Jira account and a project where escalated items should be raised as tickets
  • A Slack workspace and the operations channel you want escalation notices posted to
  • A list of which reviewer covers which households, so each person can filter the queue to their own book

How can I customize it?

  • Change what counts as an exception: how many days without a refreshed value is too many, and how big a move since the prior close is worth flagging
  • Point escalations at a different Jira project or a different Slack channel, and adjust what the ticket and the message say
  • Adjust who is assigned which households, or add your own exception type alongside the three built in

FAQs

Does this change anything in Addepar automatically?
No. Nothing is written back until a reviewer fills in a fix and saves it. The app finds and groups the problems, a person decides what to do, and only then does the correction or refreshed value go to Addepar.
Will loading the queue every morning hit Addepar's limits?
Addepar limits how many requests a firm can make in a given window, so the app is built to pull the whole queue in a few batched requests rather than one per row. It caches what it loaded and refreshes when you ask it to, so a team of reviewers browsing the list all morning does not burn through the allowance.
Can each reviewer see only the households they cover?
Yes. Reviewers filter the queue to their assigned households and the app remembers that choice, while the team lead can still view everything and watch the open versus cleared counter for the whole firm.
Where do the review notes and statuses live?
In the app's own storage, because Addepar has no place to record that someone looked at an exception and accepted it. Marking an item reviewed or accepted, the note, and who set it all persist in the app and stay there between sessions.
What happens to an issue nobody on the team can fix?
The reviewer escalates it, which raises a ticket with the record name and the problem detail already filled in and posts a note to your operations channel. The ticket reference is kept on the row so the same item does not get escalated twice.

Related templates

Share of voice dashboard for your brand and competitors

See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.

GDELT
Notion
Slack Bot
App
Approval war room for every social post awaiting sign-off

One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.

Hootsuite
Slack Bot
App
Turn champion job changes into new pipeline in Attio

Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.

Boomerang
Attio
Slack Bot
Agentic Task
Collect social post requests and schedule them in Hootsuite

Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.

Hootsuite
Slack Bot
General Input Database
App
Voice agent QA review board for your Hume EVI calls

Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.

Hume
Linear
Slack Bot
App
Clear your Guru verification backlog in one weekly app

A personal queue of every overdue Guru card, sorted by how late it is, with one-click verify, reassign, comment, and an agent that drafts the refresh for you.

Guru
Slack Bot
App

Stop chasing portfolio data problems across spreadsheets.

Give your data operations team one queue they open every morning, work down through the day, and actually finish.