Ascendix TechnologiesOpen/Close Panel

CRM Consulting Services and Commercial Real Estate Software Since 1996

Open Search
  • Services
    • CRM Consulting
    • Dynamics 365 Consulting
    • Salesforce Consulting
    • Salesforce Implementation Services
    • Salesforce AppExchange App Development
    • Salesforce Integration Services
    • Salesforce Customization Services
    • Software Development Outsourcing
    • Ascendix CRM Concierge Service
  • Products
    • Ascendix Search
    • AscendixRE CRM
    • AscendixRE Pricing
    • AscendixRE Capital Markets
    • AscendixRE Land
    • Composer
    • MarketSpace
  • Industries
    • Financial Services
    • Commercial Real Estate
  • About
    • Our Team
    • Meet Our CEO
    • Engagement Models
    • How We Work
    • Ascendix Videos
  • Clients
  • Blog
  • Contact
  • Login

Release Strategies for Salesforce Managed Packages: Our Experience

February 11, 2019

Updated on March 30, 2021 Salesforce managed package release strategies Ascendix Technologies

As a Salesforce partner, we deliver two pre-packaged applications to our customers via Salesforce’s AppExchange – Ascendix Search and AscendixRE.

When one of our applications is installed in a customer’s Salesforce organization, it is installed as a managed package. In this post, we will talk about versioning and how we tackle it.

Table of Contents

  • What is a Managed Package in Salesforce?
  • Salesforce Apps Distribution: Available Options
  • Major Release
  • Patch Release
  • Our Experience
  • Ascendix Technologies: Salesforce App Development Company

What is a Managed Package in Salesforce?

A Salesforce managed package is a collection of application components distributed as a single unit on AppExchange (a Salesforce marketplace), allowing Salesforce app developers to seamlessly distribute updates including new features, improvements, and bug fixes.

Managed packages also provide benefits such as the protection of intellectual property and built-in versioning allowing us to support multiple versions of our application simultaneously.

Salesforce consulting services middle banner

Salesforce Apps Distribution: Available Options

Salesforce offers two ways applications updates can be distributed:

  1. As a major release
  2. As a patch release

Major Release

A major release allows the package publisher to include new components and modify existing components (with restrictions).

This is typically how new features are implemented, but a major release also comes with some disadvantages.

Salesforce managed package major update pros and cons Ascendix Technologies

Disadvantages:

#1 Only Admin can manually install the update

First, a major release cannot be pushed to existing deployments (Registered ISV partners can request Push Major Upgrade functionality by logging a case in the Partner Community.  However, pushing a major upgrade entails a higher degree of risk as it can impact existing functionality in a subscriber’s organization) and instead requires the admin in the target organization to manually install the update.

This is purposeful and prevents a publisher from pushing breaking changes.

 

💡 Still a Salesforce Classic User? Learn Why You Should Hurry Up with Migration to Lightning

 

#2 Each new Major Release = a new branch

Second, with each new major release, a new branch is created.

What this means simply is if there are multiple installed versions of an application, if a bug exists in one it may exist in another requiring additional effort to patch the bug and push updates to each version currently in use.

Patch Release

A patch release allows the package publisher to change the functionality of existing components, but not add or remove any.

This is typically how bugs and other errors (such as those sometimes introduced with Salesforce seasonal updates) are resolved.

Ascendix Technologies Salesforce managed packages patch release pros and cons

However, we have found patches are a convenient way to push out new functionality to our customers without modifying the structure of the package.

One of the main advantages of a patch release is they can automatically be pushed to a customer’s organization upgrading their installation to a new version of your package.

For example, the following changes are allowed:

  1. Adding new methods to Apex controllers
  2. Extend the functionality of a Lightning Component
  3. Add files to an existing static resource
  4. Modify a permission set

What can’t you do in a patch?

  1. Modify the accessor of a class (e.g. change from public to global)
  2. Add a new Apex class
  3. Add a new Lightning Component
  4. Add a new object or field
  5. Add a new static resource
  6. Add a new permission set

Our Experience

At Ascendix we have used this strategy to add new functionality to our managed packages, which reduces how often we need to plan major releases.

This allows us to push improvements to our customers without inconveniencing them.

It also reduces the number of releases we must support concurrently, allowing us to focus more energy on product improvement instead of product maintenance.

Examples of features we have added to our Ascendix Search app via a patch release:

Export to Excel

Ascendix Search Exporting accounts from Salesforce to Excel

Insights

Ascendix Search analyzing Salesforce records with charts

Composer 

Ascendix composer Salesforce report writing app

While these look like new components, they are actually extensions of existing ones.

For example, the Composer dialog is embedded within the parent component using an aura:if (#1) conditional tag and a modal dialog (#2) directive:

Salesforce Managed Packages Release Strategies Code Example Ascendix Technologies

We define the user interface for the new feature within the context of the parent container.  Logic is added in a similar way in both the Lightning Component and Apex controller.

This approach works best with components having a specific use as shown in the examples above.

Patch Limitations

For components needing to be displayed multiple times such as within an aura:iteration, this approach wouldn’t be appropriate.

Using a patch can also increase technical debt in your project since the components will become more complex as additional features are added.

Best practices tell us we should keep code simple, readable, and broken up into small, manageable blocks.

To mitigate these risks, with each major release we move features added during patches into new components where they can be separately maintained, keeping our code healthy and clean.

Whether you are planning a major release or a patch, there are many factors to be considered.

When implementing a new feature a major release may not always be required and a patch may be a more appropriate option.

Depending on your requirements, when keeping the limitations in mind you have multiple options.

Ascendix Technologies Salesforce managed package release strategies

Ascendix Technologies: Salesforce App Development Company

If you need assistance with your release strategy, Ascendix may be able to help you come up with a plan keeping your customers happy by reducing the frequency of major releases while still providing them with the latest features you have to offer.

Appexchange app development is one of our key Salesforce consulting services. Having over 150,000 customers worldwide, Salesforce is the right place to access the most advanced and tech-savvy companies. Having our own AppExchange apps, we know all ins and outs of the Salesforce app development from the very idea to passed security review. Contact us to get your own AppExchange app

Ascendix Technologies Salesforce appexchange development banner

Recommended For You:

  • Box for Salesforce Integration Overview [Our…
  • What is Salesforce? Expert Insight on What…
  • Salesforce Salary Trends Overview: Salesforce Admin…

Ascendix Search Blog offshore app development Salesforce

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

About us

  • About Ascendix
  • Our Services
  • Case Studies & Reviews
  • Ascendix Videos

Products

  • Ascendix Search
  • AscendixRE CRM
  • AscendixRE Capital Markets
  • AscendixRE Land
  • Composer

Contact Us

  •   +1 888-346-3276 Ext 2
  •   +1 972-889-8090
  •   Contact Sales
  •   Request Support
  •   Ascendix Corporate Office
    12222 Merit Drive Suite 1760
    Dallas, Texas 75251
  • Facebook
  • LinkedIn
  • Twitter
  • YouTube

© 2021 Ascendix Technologies. All Rights Reserved | Privacy Policy Sitemap

We use cookies on our website. By clicking “Accept”, you consent to the use of ALL the cookies.
Cookie settingsACCEPT
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience. Read our privacy policy.
Necessary
Always Enabled

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

CookieTypeDurationDescription
__cfduid11 monthThe cookie is set by CloudFare. The cookie is used to identify individual clients behind a shared IP address and apply security settings on a per-client basis. It does not correspond to any user ID in the web application and does not store any personally identifiable information.
cookielawinfo-checkbox-advertisement01 yearThis cookie is set by GDPR Cookie Consent plugin. The purpose of this cookie is to check whether or not the user has given their consent to the usage of cookies under the category 'Advertisement'.
cookielawinfo-checkbox-analytics01 yearThis cookie is set by GDPR Cookie Consent plugin. The purpose of this cookie is to check whether or not the user has given the consent to the usage of cookies under the category 'Analytics'.
cookielawinfo-checkbox-necessarypersistent11 monthsThis cookie is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-non-necessarypersistent11 monthsWe use this cookie to store the user consent for the cookies in the category "Non Necessary".
csrftoken011 monthsThis cookie is associated with Django web development platform for python. Used to help protect the website against Cross-Site Request Forgery attacks
iopersistentSessionThis cookie is set by HeyOliver and it preserves user session state across page requests.
pctrk01 yearUsed to count page views by unauthenticated users against license usage.
PHPSESSIDpersistent1 yearThis cookie is native to PHP applications. The cookie is used to store and identify a users' unique session ID for the purpose of managing user session on the website. The cookie is a session cookies and is deleted when all the browser windows are closed.
viewed_cookie_policypersistent11 monthsThe cookie is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Analytics

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.

CookieTypeDurationDescription
__utma02 yearsThis cookie is set by Google Analytics and is used to distinguish users and sessions. The cookie is created when the JavaScript library executes and there are no existing __utma cookies. The cookie is updated every time data is sent to Google Analytics.
__utmb030 minutesThe cookie is set by Google Analytics. The cookie is used to determine new sessions/visits. The cookie is created when the JavaScript library executes and there are no existing __utma cookies. The cookie is updated every time data is sent to Google Analytics.
__utmc0The cookie is set by Google Analytics and is deleted when the user closes the browser. The cookie is not used by ga.js. The cookie is used to enable interoperability with urchin.js which is an older version of Google analytics and used in conjunction with the __utmb cookie to determine new sessions/visits.
__utmt010 minutesThe cookie is set by Google Analytics and is used to throttle the request rate.
__utmz06 monthsThis cookie is set by Google analytics and is used to store the traffic source or campaign through which the visitor reached your site.
_gapersistent2 yearsThis cookie is installed by Google Analytics. It registers a unique ID that is used to generate statistical data on how the visitor uses the website.
_gat_gtag_UA_76342539_1persistent1 minuteGoogle uses this cookie to distinguish users.
_gat_UA-76342539-1persistent1 minuteThis is a pattern type cookie set by Google Analytics, where the pattern element on the name contains the unique identity number of the account or website it relates to. It appears to be a variation of the _gat cookie which is used to limit the amount of data recorded by Google on high traffic volume websites.
_gidpersistent1 dayThis cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the wbsite is doing. The data collected including the number visitors, the source where they have come from, and the pages viisted in an anonymous form.
_uv_id02 yearsThe cookie is set by Slideshare.net. It collects data on the user's visits to the website, such as which pages have been read.
bcookiepersistent2 yearsThis cookie is set by linkedIn. The purpose of the cookie is to enable LinkedIn functionalities on the page.
browser_idpersistent1 yearA unique indentifier for the web browser
bscookie12 yearsUsed by the social networking service, LinkedIn, for tracking the use of embedded services.
cusidpersistent30 minutesThis cookie is set by Clickdimensions and is used to establish and continue a user session with the site. When a user views a page on the site, the script code attempts to update this cookie. If it does not find the cookie, a new one is written and a new session is established. Each time a user visits a different page on the site, this cookie is updated to expire in 30 minutes, thus continuing a single session for as long as user activity continues within 30-minute intervals. This cookie expires when a user pauses on a page on the site for longer than 30 minutes.
cuvid02 yearsThe cookie is set by ClickDimensions. This cookie is typically written to the browser upon the first visit to the site from that web browser. If the cookie has been deleted by the browser operator, and the browser subsequently visits the site, a new __cuid cookie is written with a different visitor unique ID. This cookie is used to determine unique visitors to the site and it is updated with each page view. Additionally, this cookie is provided with a unique ID that the application uses to ensure both the validity and accessibility of the cookie as an extra security measure.
cuvonpersistent30 minutesThis cookie is set by Clikdimensions and is used to signal the last time a visitor viewed a page. It expires in 30 minutes from set/update.  
GPS030 minutesThis cookie is set by Youtube and registers a unique ID for tracking users based on their geographical location
heyo_pPersistentRegisters a unique ID that is used to generate statistical data on how the visitor uses the website.
heyo_ssessionRegisters a unique ID that is used to generate statistical data on how the visitor uses the website.
ho_*-active_quickview_tabPersistentKeeps the current state of the web app and is set by HeyOliver.
ho_*-heyoliver_referrersessionThis cookie is set by HeyOliver and collects information of the user's referrer.
ig_did19 yearsThis cookie is set by Instagram.
li_sugrpersistent2 monthsLinkedIn Insight Tag, when IP address is not in a Designated Country
lisscpersistent1 yearUsed by the social networking service, LinkedIn, for tracking the use of embedded services.
UIDR01 yearThis cookie is set bu scorecardresearch.com. The cookie is used to tracks the users activity across the internet on the browser such as visit timestamp, IP address, and most recently visited webpages. and may the data send to 3rd party for analysis and reporting to help their clients better understand user preferences.
vuid02 yearsThese cookies are used by the Vimeo video player on websites.
YSC1This cookies is set by Youtube and is used to track the views of embedded videos.
Advertisement

Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.

CookieTypeDurationDescription
_fbppersistent2 monthsThis cookie is set by Facebook to deliver advertisement when they are on Facebook or a digital platform powered by Facebook advertising after visiting this website.
fr12 monthsThe cookie is set by Facebook to show relevant advertisments to the users and measure and improve the advertisements. The cookie also tracks the behavior of the user across the web on sites that have Facebook pixel or Facebook social plugin.
IDE12 yearsUsed by Google DoubleClick and stores information about how the user uses the website and any other advertisement before visiting the website. This is used to present users with ads that are relevant to them according to the user profile.
uid01 yearThis cookie is used to measure the number and behavior of the visitors to the website anonymously. The data includes the number of visits, average duration of the visit on the website, pages visited, etc. for the purpose of better understanding user preferences for targeted advertisments.
UserMatchHistorypersistent1 monthThis cookie is set by Linkedin and is used to track visitors so that more relevant ads can be presented based on the visitor's preferences.
VISITOR_INFO1_LIVE15 monthsThis cookie is set by Youtube. Used to track the information of the embedded YouTube videos on a website.
Functional

Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.

CookieTypeDurationDescription
langpersistent1 yearThis cookie is used to store the language preferences of a user to serve up content in that stored language the next time user visit the website.
lidcpersistent1 dayThis cookie is set by LinkedIn and used for routing.
mid09 yearsThe cookie is set by Instagram. The cookie is used to distinguish users and to show relevant content, for better user experience and security.
test_cookiepersistent11 monthsThis cookie is set by doubleclick.net. The purpose of the cookie is to determine if the users' browser supports cookies.
upersistent2 months
Save & Accept