<?xml version= "1.0" encoding= "utf-8" standalone= "yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Architecture on Spinning Code</title>
    <link>https://spinningcode.org/tags/architecture/</link>
    <description>Recent content in Architecture on Spinning Code</description> <generator>Hugo -- 0.157.0</generator>
    <language>en-US</language> <lastBuildDate>Sat, 25 Jan 2025 12:00:00 +0000</lastBuildDate> <atom:link href= "https://spinningcode.org/tags/architecture/feed.xml" rel= "self" type= "application/rss+xml" /> <item>
      <title>Architectures for Constituent Portals Part 2</title>
      <link>https://spinningcode.org/2025/01/25/architecture-for-portals-2/</link>
      <pubDate>
        Sat, 25 Jan 2025 12:00:00 +0000
      </pubDate> <guid isPermaLink="false">https://spinningcode.org/2025/01/25/architecture-for-portals-2/</guid>  <description>To make the right selection you need to balance your overall data ecosystem, staffing, budget, audience interest, as well as projected growth over time. I keep wanting to create a simple decision matrix, but an easy solution eludes me still.</description> <content:encoded><![CDATA[<p>In <a href="/2024/11/30/architecture-for-portals">part 1</a> I talked about the kinds of architectures you should considering when planning a Constituent portal. In part 2 I’ll give you some guidance about how to pick the right architecture for your project.</p>
<h2 id="reminder-of-the-options">Reminder of the Options</h2>
<p>Part 1 provides a detailed review of the directions that data can flow, and the types of architectures you can use to support your solution:</p>
<ul>
<li>Data can be outbound to constituents, provided by individual constituents, or exchanged among constituents.</li>
<li>There are all-in-one solutions, two-system solutions, and solutions with an API or data proxy layer.</li>
</ul>
<p>Three patterns, three potential solutions: it’s temping to think they align 1:1 – but then a whole second article would have been a waste of time. But it is important to keep them in your mind as you determine the best-fit for your organization and use case(s).</p>
<h2 id="portal-architecture-considerations">Portal Architecture Considerations</h2>
<p>To make the right selection you need to balance your overall data ecosystem, staffing, budget, audience interest, as well as projected growth over time. I keep wanting to create a simple decision matrix, but an easy solution eludes me still.</p>
<h3 id="audience-engagement">Audience Engagement</h3>
<p>The first major consideration is how will your audience actually engage with the portal. This should drive not only how you build it, but if you build it at all. Lots of organization believe their constituents are all waiting for a great portal to see all their information, update their addresses, and even communicate with each other. This is rarely true. None of us is short on things to do online – you need to be clear about what makes your portal worth their time.</p>
<p>When you align your project to your audiences interest, a portal is powerful, useful, tool that can make a huge impact. But if your audience isn’t interested in what you offer them, you just spent a bunch of money on a web site no one uses. There are times when the most effective constituent portal is none at all – because you can use those resources elsewhere.</p>
<p>Think carefully about how many of you constituents want to log into your portal enough to:</p>
<ol>
<li>Remember it’s there.</li>
<li>Care enough to take the time to log in.</li>
</ol>
<p>You spend something like 40 hours (probably more) a week thinking about your organization’s work. They spend 40 hours (or more) a week thinking about their employer’s work, also their families, friends, all the companies and nonprofits they interact with, politics, meal planning, shopping, and whatever else – there isn’t much time left for your organization.</p>
<p>Think about the features you can provide that are valuable to your audience and the best way to deliver those. For example, organizations often want to give people places to update their address or payment information. But think about the last time you moved, did you want another place to change your address information? Another common ideas is that nonprofits want to make delivery of annual tax receipts cheap and easy. If successful that means a wave of use once a year that might save your on mailing costs – of course you can also ask for a gift in that mailing so it might not actually be a net gain.</p>
<p><strong>Questions to ask:</strong></p>
<ul>
<li>What problem does this portal solve for my constituents? Do they care if I solve it?</li>
<li>What is the best way to deliver our solution to our constituents?</li>
<li>Will my constituents be willing to log in at all?</li>
<li>How will this portal empower themselves or to support our work?</li>
<li>How many people need to use the portal each week, month, or year for it to be successful?</li>
<li>Do we expect that number to grow over time?</li>
<li>Will likely traffic be spread out, or come in a wave?</li>
</ul>
<h3 id="technology-and-data-ecosystem">Technology and Data Ecosystem</h3>
<p>Your portal does not exist is a vacuum. Your organization has lots of technology kicking around these days, and you want the tools you select for this project to build on your overall technology landscape. When I make a recommendation to a client, I spend a lot of time asking them about the tools that are already in place and how they are used. I’m looking for tools that could be the basis of the portal, reveal the expertise of their staff, and would work well with Salesforce (or other technologies I’m part of introducing). I am also trying to understand some of the history about those tools and how they came to be.</p>
<p>If there are other complex systems, and they are working well, that’s a sign that an organization can probably handle more complex architectures. It’s also a sign they probably know how to benefit from that complexity. But it’s also a sign their staff may be consumed with what they have. If they have all simple systems I am going to be inclined to keep my solution equally simple.</p>
<p><strong>Questions to ask:</strong></p>
<ul>
<li>How many interconnected data systems do we have today? Do they work well, or are we struggling to keep up?</li>
<li>If we add a new system will it enhance our digital presence or pull attention from other critical systems?</li>
<li>Are the solutions we are considering related to technology we already use, or are they entirely new?</li>
<li>What kinds of resource, limits, and features does my main CRM provide?</li>
<li>What other technical resources do we already have in place that we could leverage?</li>
<li>Did past projects go well, or leave a bad aftertaste?</li>
</ul>
<h3 id="staffing">Staffing</h3>
<p>Your solution will require staff support. Even the simplest of systems will trigger requests for help using it. The more complex the solution, the more skilled your staff need to be to make sure it runs smoothly – and the more staff you need to support it.</p>
<p>You staff bring two things to the table: time and skills. They need to have the skills to support your solution, and the time to use those skills effectively.</p>
<p>Please do not just plan to push your staff harder, you need to find ways to remove other tasks from their plate or add people to your staff if you want to avoid burn out.</p>
<p>If you use an all-in-one solution, you probably just need people who understand that platform, know how to engage with your user constituents, and can work with to provider’s support team. The more systems you need the more platforms your team needs to understand, and at least one person needs to have a deep understanding of how the whole thing works.</p>
<p>You also should consider aligning your technology selection to what your team either knows, or wants to know. Most of the time you want to play to your team’s strengths not ask them to develop a whole new skill set from scratch.</p>
<p><strong>Questions to ask:</strong></p>
<ul>
<li>What roles do we need to have for your portal to work?</li>
<li>What work do we want done by our staff vs consultants?
<ul>
<li>Who will answer support requests?</li>
<li>Who will respond if there is an outage?</li>
</ul>
</li>
<li>Do our current staff have time for new responsibilities?
<ul>
<li>How can we reduce their workload to offset new requests?</li>
</ul>
</li>
<li>Can we hire more staff?</li>
<li>What technologies do our current technical team members already know?
<ul>
<li>What are they interested in learning?</li>
</ul>
</li>
</ul>
<h2 id="budget">Budget</h2>
<p>Obviously all this will cost money. There will be some combination of license costs, hosting fees, implementation costs, support contracts, staff salaries, and other expenses. Just because a sales person says their solution works “out of the box” does not mean it’s free to get started.</p>
<p>You need to account for the implementation cost: how much will it take to setup and train people on the new system?</p>
<p>You also need to plan for maintenance costs: what will it cost to keep it running every year?</p>
<p>In very broad sweeping terms my experience is that most of the time an all-in-one solution will be cheaper and faster to implement than a two-system solution. But all-in-ones often have higher annual operating costs. Those operating costs are likely to grow linearly with audience size. A two-system solution, while more expensive to setup because of the complexity, will often have a lower annual cost and lower price escalation curve.</p>
<p>When you are considering your options, those are the two budget figures to make sure you understand. What will it cost to setup? How much will it cost over the first 5 years? And what factors will impact those two figures?</p>
<p>Different organization can tolerate different cost structures. If your organization prefers to invest up front and have lower long-term costs, you should make a plan to optimizes for that. Other organizations want the lowest upfront risk, but can tolerate higher costs – particularly if they are linked to a successful and growing solution.</p>
<p>More complex systems are also riskier to build. There is a greater chance of hitting problems that require extra budget to resolve.</p>
<p><strong>Questions to ask:</strong></p>
<ul>
<li>What will each of my main choices cost to implement?</li>
<li>What are the 1, 2, and 5 year costs likely to be?</li>
<li>What factors will drive costs?</li>
<li>What is my organization’s budget tolerance for up-front vs long-term costs?</li>
<li>How firm is the budget? What are my contingency options for overruns?</li>
<li>What are my options to control costs if there are problems?</li>
<li>What can our staff realistically do vs what do we need to pay consultants to do?</li>
<li>If we learn the portal isn’t working, what will it cost to cancel our contracts early?</li>
<li>If my traffic will be in small bursts, will I have to pay extra for those bursts, or pay all year for services we’re not using?</li>
</ul>
<h2 id="closing-thoughts">Closing Thoughts</h2>
<p>There is no one right answer to these questions, and they lead to complex matrix of decision making.</p>
<p>Take the questions I’ve posed, and have a robust and honest discussion about them. Ask your own questions. If you have a consulting partner you trust, have them test your answers and add their questions as well (sure, they are incentivized to get your to build it, but they should still have insights you want).</p>
<p>To make your final selection I suggest you write out a 3-5 year plan – this is a thing consultants can help you do well. Test it with your internal team before taking it to leadership. Make sure you understand it, and that your team understands it, particularly if a consultant wrote it.</p>
<p>I’ve been down this road a few times, and seen organizations make great decisions that led to successful projects, careful decisions that led to portals no one used, and wise decisions to walk away from their vision for a new plan. You need to be open to all possible paths.</p>
<p>Good luck!</p>
]]></content:encoded> </item> <item>
      <title>Architectures for Constituent Portals</title>
      <link>https://spinningcode.org/2024/11/30/architecture-for-portals/</link>
      <pubDate>
        Sat, 30 Nov 2024 12:00:00 +0000
      </pubDate> <guid isPermaLink="false">https://spinningcode.org/2024/11/30/architecture-for-portals/</guid>  <description>One of the common needs, or at least desires, for CRM users is to link their CRM to some kind of constituent portal. There are several ways you can architect a good data pattern for your constituent portal. The trick is picking the right one for your organization.</description> <content:encoded><![CDATA[<p>One of the common needs, or at least desires, for CRM users is to link their CRM to some kind of constituent portal. There are several ways you can architect a good data pattern for your constituent portal. The trick is picking the right one for your organization.</p>
<p>This is the first in a series on what your choices are, and now to select the right one. The architecture you select will drive the implementation cost, maintenance costs, and scalability.</p>
<h2 id="the-purpose-of-your-constituent-portal">The Purpose of Your Constituent Portal</h2>
<p>Before deciding on the architecture of your portal, you need to have a clear understanding of its intended purpose and expected scale. The purpose of the portal will also dictate the direction(s) data flows, and the scale will help you plan the long term costs.</p>
<p>If you can’t clearly state why you need a constituent portal, you don’t need one.</p>
<p>Different organizations have different reasons to create portals. Companies that sell products may want a warranty or support portal. Nonprofits often want a donor portal that provides tax receipts and allowed recurring donors to update their gift information. Member organizations want a place for members to see their benefits, update their information, and renew their memberships. And so on.</p>
<p>The purpose of your portal will determine the direction that data flows through it. There are essentially three directions that data can move.</p>
<h3 id="outbound-data">Outbound Data</h3>






<figure class="figure-left">
  
  <a href="/images/posts/architecture-for-portals/Portal-Data-Outbound.jpeg" target="_blank" rel="noopener noreferrer">
    
    

    











<noscript>
  <img class="rcf-image" src="/images/posts/architecture-for-portals/Portal-Data-Outbound.jpeg" alt="A simple diagram showing data outbound from a CRM to the user." loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/images/posts/architecture-for-portals/Portal-Data-Outbound_hu_7a33920d67f2e7d3.jpeg 680w, /images/posts/architecture-for-portals/Portal-Data-Outbound.jpeg 709w"
     data-src="/images/posts/architecture-for-portals/Portal-Data-Outbound.jpeg"
     src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIADoAgAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&#43;Tl5ufo6ery8/T19vf4&#43;fr/2gAMAwEAAhEDEQA/APfaKKoTXbLcNDEAWAySTQBfoqiBeHnzE/KlMd1t4lX8RQBdorNa4ltY90xVgOpFaCMHRWHQjNADqKKKACiiigAooqKS5ggwJJFUn1NAEtFIGDAEEEGloAKKKKACs/yEmu5Sw545rQrOkkeKad0TceOKAJjY5Hyyuv40i2Tr96d2qidZkXaptX3egqUavIf&#43;XV6AJprSMQMSC31NXIuIlx6Vni7eeB8wsn1q&#43;Di3B/2aAH5HrS5HrWbboskZZ5DuJ9al&#43;zw/89T/AN9UAWnmRELMeBRFMkse5TxVTyIScFif&#43;BVGP3F4Ej5RuSvpQBf9&#43;1eU/ESSSTVrcQXyooPI3dK9Wf8A1ZPtXz94mO/Xm8wnb55Bz6ZrpwWtQ4cwname0aNcINChYziXZGCWU9araX4v0vVLxrW3lPmqcFTXAT6pbeHZI1s7pngmj&#43;dAcgcdq57w/q0Gm&#43;IluVVjvf8Ama0&#43;qud2ZTxyp2pn0KOlFRwSebBHIP4lBqSuI9NBVSP/AI&#43;pfwq3VNy8EzPs3K3pQA&#43;5tfPQbDtPqKp2ulPDOJDcOwH8Jqx9tjYchl&#43;opxvYwvXP0FAD7nH2d8elSxjMSg&#43;lUpJ2njKxxNzxyKvIMIoPYUAR/ZYf7go&#43;yw/3BU1FAFSWyR0Oz5W7H0p1vbeQvPzOerVZooAY4zGw9q8l13wjctqILtGyzSnb7Zr1xhlSK5&#43;78MpdziR7mbKtuXB6VrSqezdzmxFL2mh414q0iXRZ4beRlPy54rDs/wDj9hP&#43;2P517lqHgWw1V1e6kkkdeMk1Wj&#43;Gejwyo435U5HNejTx1O2p5lTLqntLwOw0/wD5B1v/ALg/lVmmRRiKJI16KMCn15T3PbWwUUUUhiFFPVRSCNB0UflTqKADA9KKKKACiiigAooooAKKKKACiiigAooooA//2Q=="
     data-sizes="auto"
     width="709" alt="A simple diagram showing data outbound from a CRM to the user."
     loading="lazy" />



  </a></figure>

<p>You can send data from your organization to your constituent. That could be things like receipts, memberships status, or product warranty information. Anything that is data you have, that your member might need to see, but not update.</p>
<h3 id="data-exchange">Data Exchange</h3>






<figure class="figure-right">
  
  <a href="/images/posts/architecture-for-portals/Portal-Data-Bidirectional.jpeg" target="_blank" rel="noopener noreferrer">
    
    

    











<noscript>
  <img class="rcf-image" src="/images/posts/architecture-for-portals/Portal-Data-Bidirectional.jpeg" alt="A simple diagram showing data exchanged between a CRM and the user." loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/images/posts/architecture-for-portals/Portal-Data-Bidirectional_hu_fa4c796e0edcb26b.jpeg 680w, /images/posts/architecture-for-portals/Portal-Data-Bidirectional.jpeg 702w"
     data-src="/images/posts/architecture-for-portals/Portal-Data-Bidirectional.jpeg"
     src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIADsAgAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&#43;Tl5ufo6ery8/T19vf4&#43;fr/2gAMAwEAAhEDEQA/APfaKKrXV19nC5GWY4FAFmiqTfapRkOq0my9/wCeiflQBeoqlm6iGTtapLW6&#43;0qezKcEUAWaKKKACiiigAoopCwUZJAFAC0U1JEkGUcMPY06gAooooAKoX0azTQqwyM1fqldnFxAfegBPsbKv7uR1/HNH2WfH/Hy9VZdbERIaCQ4bHSn/wBtp5e7yJPyoAn&#43;xll/eSO344osY1jmmVRgZqKPWFkkRPIkG72qa1Obif60AXCQByeKhiuI5i2xs7eKgunLTJESVU/xf0p32ONR8hK/SgC3njrUMdxHIzBWyV4NR/Yx/wA9n/OoZbdLYCSNsN796AND&#43;Gud8YTSJoU6wzrFIV4JbFdBEcxAn0rzL4nyODGoYgFDwDWlJXqHNiqns6ZZ&#43;GslwEnF1eiXLfKu/OK6nUvE&#43;naXeLaXMuyRhkV5R4at0g0STUkvDDPC/TP3hUHiHV7fWb2C6eQF41w2K7HR9pUOKlivZ0D3W3njuIEljOVYZBqeuV8F6rHqWjRiP/ll8tdTniuCqraHo0qvtFcWqV1/x8wf71XapXud8ThS2084pGpPLCskbKoAY98VmNplzuBWYAZ6VfF7Dj5m2n3p/wBqhx98UASJGqqMgZA61Vtf&#43;Pmf/ep7XsOPkbcfaks9/wA7su3caAJ54UmTaevaqMdnISwlkYj&#43;HBxWlRQBS&#43;wDHDvn/epsFlIsm6Zt4X7tX6KAGjgVwvjnQrnVSksShkRTu5xXdE8Vkarpl1qCbYbtoUIwwA61dJ8jujKrT9pTseOz&#43;Grmz0SS9XIhI5&#43;auR57V70/g&#43;WbTTYyXrtCRgjFY3/CpbEf8vL16dLFU/8Al4eRVwNT/l2P&#43;FIzo0x/269DxxWF4c8NxeHLRoIZC4Y55rezxXm1anPUbR6mGpOnT5GLRiiiszoGGJG6oD&#43;FHkRf3Fp9FADBEi9EA/Cn0UUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k="
     data-sizes="auto"
     width="702" alt="A simple diagram showing data exchanged between a CRM and the user."
     loading="lazy" />



  </a></figure>

<p>You can allow constituents to update information. That could be address changes, support requests, donation schedule updates, event registration details, and more.</p>
<h3 id="data-network">Data Network</h3>






<figure class="figure-left">
  
  <a href="/images/posts/architecture-for-portals/Portal-Data-Network.jpeg" target="_blank" rel="noopener noreferrer">
    
    

    











<noscript>
  <img class="rcf-image" src="/images/posts/architecture-for-portals/Portal-Data-Network.jpeg" alt="A simple diagram showing data exchanged between a system, users, and between users." loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/images/posts/architecture-for-portals/Portal-Data-Network.jpeg 621w"
     data-src="/images/posts/architecture-for-portals/Portal-Data-Network.jpeg"
     src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAHkAgAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&#43;Tl5ufo6ery8/T19vf4&#43;fr/2gAMAwEAAhEDEQA/APfaKKKACiiigAooooAKKKKACiiigAppIpM8Vwfjfxfd6BdwxW8QIbliauFNzdkZ1aipw52d/RWR4d1VtY0iG7kTYzDpWtuX1FQXfS4tFFFAwooooAKKKKACiiigAoopM8UALRWbezzCaOOBwCevenNczwqDNHwO4NAFxzsjZvQZrxXxl4ilvLxFWFCFcr8wz3r2iZt1q59VNfPuuhvt7MFJ2zMTj6124JfvDzsxqfu7HofhnxU9vFDZ6lb/AGbK/u3xhTXN&#43;IPEerW/ilo4LlhAXGOeMVS1jxMbzSbWOKPyzDgEsOtcxPqVxczGSUhmPQ11U8Lf94cNfFNe4fSGmzi4sIZdwYlBkg1c7VwvwzvJbrQG81idr4Ga7jPFeXVp8lRo9qjU56amPooqjcXbpOsMZAZhnmoNS9RVIwXEg&#43;afH&#43;7SfZZv&#43;fp6AL1FUvInQZWc/jTYrphciCUgswyCKAH3ty1si7V3Mx6VD5lxdDEaGNe5NPnYLeqZCAqjvSz3qoFEeGZjgUAKkcNohd2y3cmq1xdpcMkKhtxYdRViK0LPvnbeT27CrQgiDhwg3CgAZQYSrdMYNeba94e0y2uIZI7g5mlw/wA3TNemMoZSp6Gsabwzpk0m6SDPOeTWlOp7Myq0vaHlPjnR7TSrW3&#43;ySl9x55zXDYPpX0PP4f0R9sc0KH0B5pP&#43;EO0LH/HlGfwruo4501Y8yrls6lS5gfCoH&#43;w5v&#43;uld/jiqmnabaaXB5NpEI164FXe1cFWpz1Gz06VL2dPkFrPngSa&#43;2suTt61oVSdxHel27LUGon2RkX93K6/jmj7LPj/AI&#43;Xph1e0/ifbj1pU1ezkHyyigBws2df3kzt&#43;OKYLdIbuLavrzQNZss8SdKeZllngZPutmgC4yKw&#43;ZQariwg37wmCPSrVFAABgYooooAKr3kxggLBSx9BVikYAqc0AZ1paxyQtI53s/U&#43;lJazGO6NvgsnZvT2qTTf&#43;Pd/wDfanWQ/duSOd5oAu4ooooAO1UmAa9IPTbV2qRONR5/u0ARXOmWzQk&#43;SGI5x61kyRSRnEdkGX6YrqKTAoAy7PToJIFaS3VG9MVO6CK6gReAM1eqlMQb2Hn1oAu0UyeVYY9xqp9rm8ssISAOeTQBeoqC0uPtEAkIwT2qegAqOeVYYyzMAPepKjuIUnjKNQBR04f6M3&#43;0xNOtbhAWh3DzNx4pouHtAYnQsf4SB1qW2tsv58oHmH9KALtFFFABVa4tVnYNkqw6EVZooApeTdoPlmB&#43;oo2Xv/PRPyq7RQBT8q6I5lA&#43;gpYLNY33szM/qat0UAVL05tm9RyKIbyCVFTcMkVaZQykEZBqqbOIx7AoXHQjtQBE0Elu/mQHKf3KkW/iWMtIdpHVfSohNJaMFlG6M9H9PrU0tvBIhk2qWIzmgCyrB0DA8HmuR8U&#43;NIPDdxHA0bOz810lrLsswz/wg5ryTx3rNjqN9ETblihK5z1row1L2lSxzYmr7Knc9T0jUodZ06K8jHysK0TyK4rwZ4i0&#43;awjskT7PIg4RuM1h6z471HTfEbWSKrQ7wOaX1eftGg&#43;sU4U&#43;c9UoqCznFzaRTcZZQanrBnQnfUKKKKBhRRRQAUUUUAFFFFAFe8thcwGLcVz3FQLYnywryO2OOuKv0UAV3iWOzdV6bTXz9r526gCR8omb&#43;dfQsq742X1GK8s1zwk1vcoz3Kss82FBXpmuvC1fZtnFjaftKehlazr2nrptnLZxr56KAzDgiuZvda&#43;2XX2mWP5&#43;xrb8Z&#43;HzolrADKrbj/CK43vXo0oU3TueNiKlT2lpnu3w91STU9DDS5&#43;RtvNdl2rz74U/wDIDl/66V6D2rx8R/E0Pdw38IWiiiszpCiiigAooooAKKKKACiiigBrLuQj1rmLzwql5KGlu5ztbcvzdDXU0wdaaMa0FLc5TUPA1tqkaJd3EsgXpk1nf8Kq0j&#43;9J&#43;dd96UtP289ifqtPsY&#43;geHrfw/aNb2zEqTnmtiiipOg/9k="
     data-sizes="auto"
     width="621" alt="A simple diagram showing data exchanged between a system, users, and between users."
     loading="lazy" />



  </a></figure>

<p>Your third option is to allow you constituents to exchange information with each other. This could be a any form of member community where they engage with each other.</p>
<p>When planning a network, remember you have to plan for content moderation and acceptable use policies.</p>
<h2 id="primary-portal-data-architectures">Primary Portal Data Architectures</h2>
<p>To support your portal, whatever the data flow is, there are three main data architectures you can choose from, each which a different strengths and weaknesses. The more complex your architecture the more options you will have for what it can support, but it will also increase costs and maintenance efforts. Bigger is not always better – sometimes it’s just more expensive.</p>
<h3 id="1-all-in-one-constituent-portals">1. All-in-One Constituent Portals</h3>
<p>In an all-in-one solution your constituent portal is part of your CRM. For obvious reasons this is the type of portal that your CRM vendor wants to sell you. In Salesforce land this means Experience Cloud. There are also many nonprofit-focused CRMs which include one in their solution. When your portal is part of your CRM you get a bunch of advantages:</p>
<ul>
<li>Data all lives in one place. There is no data sync to worry about setting up or maintaining.</li>
<li>You have one vendor. That means you can centralize your support arrangement and billing.</li>
<li>They are often fastest to implement. They are designed to be fast to market to help make them the obvious choice.</li>
<li>They generally do not require a developer. Again, your CRM vendor really wants you to select this path, so they clear as many hurdles as they can.</li>
<li>There is only one technology stack. By leveraging the technology of your CRM your investments in learning that technology carry over, at least in part, to your portal.</li>
</ul>
<p>There are also downsides:</p>
<ul>
<li>New template system to learn. The CRM’s portal likely has a different template system than the CMS on your main web site. That may be hard to make match your primary online branding.</li>
<li>The vendors make a lot of assumptions. To provide that ease listed above they make assumptions about how data flows, security, user experience, and how other elements should work – those assumptions may not match your ideal solution.</li>
<li>Costs often scale linearly. There are usually license costs that are scaled based on user count meaning your costs grow as the portal grows at more or less a 1:1 rate. While there are price breaks and other incentives this is the right expectation to have for estimating.</li>
</ul>
<h3 id="2-external-constituent-portal">2. External Constituent Portal</h3>
<p>In this pattern an external constituent portal moves the user experience from within your main CRM’s sphere of influence into a separate platform. In my career I’ve mostly built these with Salesforce as the CRM and Drupal as the portal platform – it’s a powerful pairing. The strengths and weaknesses here are more or less the mirror of the all-in-one portal.</p>
<ul>
<li>Your web team may already know the technology. If you use the same technology as your web developers use for your main web site(s) they already know who to handle design and branding.</li>
<li>You have greater control over the User Experience. The assumptions that go into the portal are yours not the ones imposed by the CRM.</li>
<li>You have greater control over security, along with data flow and formats. Since they aren’t built around assumptions you don’t control you have greater control and freedom.</li>
<li>Costs typically grow more slowly. It is less common to have per-user license costs in this context so the cost curve is likely closer to logarithmic.</li>
</ul>
<p>The downsides:</p>
<ul>
<li>You have to handle data synchronization. The two systems means data has to pass back and forth.</li>
<li>You have two different vendors/platforms. When you had one system everything was centralized, now you have two different systems handling constituent data.</li>
<li>This design typically is harder to implement. All those short cuts your CRM provider had in mind for you are gone. Even if you use a purpose built solution it’s going to take more time and effort.</li>
<li>This approach generally requires a developer and/or data architect. To implement this pattern you need someone who understands both platforms – ideally both for setup and support.</li>
</ul>
<h3 id="3-external-constituent-portals-with-data-proxy">3. External Constituent Portals with Data Proxy</h3>
<p>In some situations it makes sense to insert a data proxy, or API layer, between your main CRM and your constituent portal. This creates a layer of abstraction, security, and data augmentation that can benefit a lot of organizations. While this is the most complex of the three main architectures it is one I find is frequently overlooked – in part, I suspect, because no one partner benefits from selling it.</p>
<p><figure>
  <a href="/images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures.jpeg" target="_blank" rel="noopener noreferrer">

    
    
    
    
    

    
    











<noscript>
  <img class="rcf-image" src="/images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures.jpeg" alt="Diagram showing data progressing from the CRM, through an outside data layer and in the process being routed to various cloud resources like an app, portal, or web site." loading="lazy" />
</noscript>

<img class="rcf-image lazyload show-if-js"
     data-srcset="/images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures_hu_6e8b54d43716388f.jpeg 680w, /images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures_hu_1816d098b8620a50.jpeg 850w, /images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures.jpeg 950w"
     data-src="/images/posts/architecture-for-portals/Portal-Data-Architectures-Architectures.jpeg"
     src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAEcAgAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&#43;Tl5ufo6ery8/T19vf4&#43;fr/2gAMAwEAAhEDEQA/APfaKKKACiiigAooooAKKKKACiiigAoopAwJwCKAAkAEntVdrtRyqM3uBS3WdoGcA8E02UypGvkKrCgBFvOfnRkHqashg65U1UtmmkZhPCFHbvU1tw8n1oAnpMj1qG7Zkt3ZPvYqqsEpQE5OR/eoA0cj1orLlSeNNynbjnrmtDzVWJS3UigCSiq/nr/tflTJLvH3UY/hQBboyPWoJJCbZmTrjiqiwTso3fN77sUAaWR60jMFGScVnNBMqEp8p9d2alm3ssbMNy/xCgCUzFziMZ9&#43;1V3h8kPIZDuJzgGngSycJiNP1pXggj2tI2TnqTQBYQb4BvGcioFjnhyFwV7e1WcgJkdMVX8&#43;RhlY/l&#43;tADg07DoB70sERjLbmyzUnmugy6fL7VNHIjruWgBl1zC1RSQNPGuyUpx2qyRkYNQm1VuhZfoaAIihjtmDuWNPaJmEbL2FKlqoHJLfU1YHAxQBDib0WopGmXjYDmrdFAFRkK2jeuKrpazFg4uTtx92tIgEYPSoJLRWHyll&#43;hoAqPb3CsztcnZ/dqaXPkx9dvfFSpaqB8xLfU1HdMQ6x52r6igBn7r/AKa0yT7Pj59/tnpVhTJGMjEifrTXmgk2q6456EUARDzRb852Z/HFWJN722bcjdjirGAUx2xVUwSIfkk2r6YoAktvO8r9/t3e1Ni4kk9M0BJmHzSAfSpY0Cd8k0ASUUUUAFFFFABRRRQAUUUUAFIyhhyAaWigCuYCh3RsR7dqrNK0yvGY/mBxkCtGkCgHgCgCFpDBbgt97pUJDypiSYK3oDUt1EzqpXqpzVf7NbznzHO1&#43;/NADxEyDCS5PoTmpoJTJuDrhlqJLKGOXzd5z7mnxf62T60AWaKKKACiiigAooooAKKKKACiiigAooooAKgeGFvvKKnqJutADVtIwOcn6mpUiCD5acOgp1AH/9k="
     data-sizes="auto"
     width="950" alt="Diagram showing data progressing from the CRM, through an outside data layer and in the process being routed to various cloud resources like an app, portal, or web site."
     loading="lazy" />


</a>

  
  
</figure></p>
<p>This setup certainly isn’t for everyone, but when it’s the right fit it makes a huge difference. It also creates a significant number of iterations – all of those arrows could be one directional or two directional.</p>
<p>An extra data layer makes the most sense when data from your CRM is going to multiple places and/or needs to be augmented by an external data source. For example think about an organization that provides trail maps for hiking or paddling. All that data geocoding those trails does not need to be in your CRM, but you probably want to know which members are interested in which trails so some trail data is needed there. Meanwhile in public you want a great deal more information all linked together. An organization like that may have a portal for members, a web site to find trails for non-members, apps for iPhone and Android, and perhaps a public API for other people to use to build their own web sites with. That’s a lot of API calls all with different data sets, all of which need to be very fast.</p>
<p>Your CRM is designed to be very stable and reliable – it is not designed to be very fast. What’s more, you often have limits on the number of API calls you get in your package (with extra fees charged if you go over). By inserting another layer between your CRM and other services you can bypass these limitations.</p>
<p>There is another added benefit to this design pattern, and that is increased security. By creating an additional layer in your system you are able to create a separation of concerns between the various systems. Each should have access to only the data is absolutely needs from any of the others.</p>
<h2 id="how-to-pick">How to Pick?</h2>
<p>There are lots of considerations that go into selecting the right architecture for your project – which is why that’s getting it’s own post soon.</p>
]]></content:encoded> </item> </channel>
</rss>
