Trial sources
There are two ways to start a Nutritionist Pro trial, and each one creates a Freshsales contact differently. Both write the same two contact fields, and those fields decide which customer journey the contact enters. See Trial follow-up tasks for the journeys.
Online trials
Online trials start at trial.nutritionistpro.com/register-trial. This is the nexgen-free app, which runs the same code as nexgen in the nexgen_v3 repository. On sign-up, the backend creates or updates the Freshsales contact through the Freshsale helper and sets these fields:
- Trial Type (
cf_trial_type) isonline. - Trial Online Product (
cf_trial_products) is the module the prospect picked:Food Label,Diet Analysis,Menu Creation,Diet Analysis and Menu Creation, orAll modules.
The product values are set in crm_choices in nexgen/backend/config/trial.php. Trial Online Product is a Freshsales multiselect field with a fixed list of choices. A value that doesn't match a configured choice exactly makes Freshsales reject the contact, so add any new choice in Freshsales before the app starts sending it.
Every online trial enters the Food Labeling journey, whichever module the prospect picked. Since September 2026 every trial account is granted all three modules in the app regardless of the module picked; the pick still goes to Freshsales.
The trial pages
The trial site shares its login and registration views with the paid app, with a trial-only block in each. What a prospect sees on the trial site:
- The registration heading is "One-month free online trial registration". Under it is a line reading "Looking for the desktop version? See the Nutritionist Pro Desktop trial", linking to nutritionistpro.com/desktop.
- The login heading is "One-month free online trial login". Below the "Resend verification email" link is a "Buy a subscription" link to the shop's packages page. The link uses the environment's own shop setting, so the staging trial links to the staging shop and the production trial to app.nutritionistpro.com/shop/our-packages.
- When a trial has expired, logging in returns the user to the login page with the subscription-expired message rather than opening the app. Before September 2026 this returned a server error, so an expired trial that reports "an error on login" from before then was hitting that bug.
- The registration page loads the Google Tag Manager container and reports into the nexgen-free GA4 property. See Google Ads.
The paid app's login page has none of these. The headings are pinned by Playwright tests in e2e/nexgen-free/registration.spec.ts, so a copy change needs the test updated too.
Desktop trials
Desktop trials start on the nutritionistpro.com WordPress site, using two Gravity Forms forms. You can see them in wp-admin at Forms (https://nutritionistpro.com/wp-admin/admin.php?page=gf_edit_forms):
- Diet Analysis Module (form 2), on the public page nutritionistpro.com/demo-for-diet-analysis, writes Trial Online Product
Diet Analysis. - Menu Creation Module (form 4), on the public page nutritionistpro.com/demo-for-menu-creation, writes Trial Online Product
Menu Creation.
Both forms write Trial Type desktop. The other forms on the site, such as Contact Us, don't create trial contacts.
There isn't a desktop Food Labeling trial form. If a desktop lead ends up with Food Label or an empty Trial Online Product, it matches no segment and gets no follow-up. Every desktop lead before September 14, 2026 has an empty product.
The Freshsales trial snippet
The desktop forms don't send anything to Freshsales themselves. A WPCode PHP snippet named freshsales-trial-lead webhook runs inside WordPress and handles each submission:
- When form 2 or form 4 is submitted, the snippet posts the entry to
https://app.nutritionistpro.com/wordpressTrialLeadon the nexgen backend. - The backend checks a shared secret, then uses the same
Freshsalehelper as online trials to create or update the contact, with Trial Typedesktop. - The snippet writes the backend's response on the Gravity Forms entry as a note. You can see whether each push succeeded in Forms > Entries.
You manage the snippet in wp-admin under Code Snippets (https://nutritionistpro.com/wp-admin/admin.php?page=wpcode-snippet-manager). The version-controlled copy, and the steps for installing and updating it, are in the wordpress/ folder of the nexgen_v3 repository (wordpress/README.md).
A second snippet can replay past form entries into Freshsales. A replayed entry that creates a new contact enters the Diet Analysis or Menu Creation journey right away, so the prospect gets the first trial email and the sales team gets a task. Only replay entries that should get that follow-up. The backfill steps are in the same README.
The snippet reads form fields by field type and by label. If you rename a form field or change a form's ID, the Freshsales hand-off can break without any error on the website. After you edit a trial form or the snippet, submit a test desktop trial. Then check the entry note in Forms > Entries and confirm that the contact appears in Freshsales with Trial Type desktop. If the note shows a failed push, the reason is in the note.
A contact who signs up both ways
A contact has only one Trial Type and one Trial Online Product. If the same email address starts a desktop trial and then an online trial, the online sign-up overwrites the fields on the existing contact. The contact can end up in two journeys: the desktop one from the first sign-up, and the Food Labeling one when the update makes it match the online segment. This is expected.
Change a field value
The segments that start the journeys filter on the exact values listed on this page. Before you change a Trial Type or Trial Online Product value in config/trial.php or in the WordPress snippet, do these steps in the same change:
- Add the new choice to the Trial Online Product field in Freshsales admin, if it's a new product value.
- Update the matching segment conditions. See Trial follow-up tasks.
- After the change is deployed, check the next sign-up as described in Troubleshooting trial tasks. If it didn't enter a journey, compare the value on the contact with the segment condition.