Using GravityMath inside a GravityView Custom Content field

When using the [gravitymath]   shortcode inside a GravityView Custom Content field, you may encounter issues with merge tags being processed in the wrong order. This article explains the problem and provides a workaround.

Understanding the Problem

GravityView processes merge tags in Custom Content fields before shortcodes run. This means any merge tags inside your [gravitymath]   shortcode get replaced by GravityView before GravityMath ever sees them.

Example Scenario: Sales Team Dashboard

Let's say you have two forms:

Form A (ID: 10) - Sales Reps

  • Field 1: Sales Rep Name
  • Field 2: Region
  • Field 3: Email

Form B (ID: 20) - Orders

  • Field 5: Sales Rep Name (dropdown matching reps from Form A)
  • Field 6: Order Total
  • Field 7: Order Date

You create a View using Form A to display your sales team. For each rep, you want to show how many orders they have in Form B.

What you might try (and why it doesn't work)

In a Custom Content field, you add:

Orders: [gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]{Order Total:6:count}[/gravitymath]

Expected result: Each sales rep shows their order count.

Actual result: The count is wrong or empty.

Why? GravityView processes {Order Total:6:count}   first. Since field 6 doesn't exist in Form A (the View's source), it fails. GravityMath never gets to process it.

The Workaround

We need a way to tell GravityView to leave certain merge tags alone so GravityMath can process them. The workaround below uses an alternate syntax (tildes ~~   instead of curly braces {}  ) to mark merge tags that should be handled by GravityMath.

Step 1: Add the helper snippet

Add this code to your site (where to add code):

/**
 * Allows using ~Field:ID~ syntax in GravityMath shortcodes.
 * Prevents GravityView from processing these merge tags prematurely.
 * The snippet converts ~~ to {} right before GravityMath runs.
 */
add_filter( 'gravityview/math/shortcode/before', function ( $formula ) {
    preg_match_all( '/~[^~]*?:(\d+(\.\d+)?|[a-z_]+)(:(.*?))?~/mi', $formula, $merge_tags, PREG_SET_ORDER );

    foreach ( $merge_tags as $merge_tag ) {
        $updated_merge_tag = str_replace( '~', '', $merge_tag[0] );
        $updated_merge_tag = sprintf( '{%s}', $updated_merge_tag );
        $formula = str_replace( $merge_tag[0], $updated_merge_tag, $formula );
    }

    return $formula;
} );

Step 2: Update your shortcode

Wrap merge tags that reference the queried form (Form B) with tildes instead of curly braces:

Before:

Orders: [gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]{Order Total:6:count}[/gravitymath]

After:

Orders: [gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]~Order Total:6:count~[/gravitymath]

Now each sales rep's row correctly shows their order count from Form B.

Which Syntax to Use

Syntax Processed by When to use
{Field:ID}   GravityView (first) The field is from the View's form and you want its current value
~Field:ID~   GravityMath (after snippet runs) The field is from the queried form and GravityMath should process it

In our example:

  • {Sales Rep Name:1}   uses curly braces. This is from Form A (the View's form). We want GravityView to replace it with the current rep's name so it can filter Form B.
  • ~Order Total:6:count~   uses tildes. This is field 6 from Form B (the queried form). We need GravityMath to count it after applying the filter.

More Examples

Counting filtered entries

Count orders for the current sales rep:

[gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]~Order Total:6:count~[/gravitymath]

Summing filtered values

Sum order totals for the current sales rep:

[gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]~Order Total:6:sum~[/gravitymath]

Calculating an average

Average order value for the current sales rep:

[gravitymath scope="form" id="20" filter="filter_5={Sales Rep Name:1}"]~Order Total:6:avg~[/gravitymath]

Troubleshooting

Still not working?

  • Make sure the snippet is active on your site
  • Verify the field IDs match your actual forms
  • Check that the filter field (e.g., Sales Rep Name) has matching values in both forms
  • Remember: use {}   for the View's form fields, ~~   for the queried form's fields

If you're still having trouble, contact our support team and we'll be happy to help you set this up.

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.

Still need help? Contact Us Contact Us