This plugin for WordPress, Ninja Forms CiviCRM, serves as an essential add-on for connecting and updating CiviCRM accounts through the popular Ninja Forms plugin. With the seamless integration provided by this extension, users can easily sync their WordPress websites form submissions with the CiviCRM database.

Plugin Version: 3.0.1
 
WordPress plugin Ninja Forms CiviCRM

Plugin Features

The plugin ensures a smooth and efficient workflow by allowing users to map form fields directly to the relevant fields in CiviCRM. This way, the data collected through the Ninja Forms plugin can be accurately stored and updated in the CiviCRM system without manual intervention. The integration streamlines the process of managing contacts, contributions, memberships, events, and various other aspects of constituent relationship management.

By utilizing this plugin, website administrators can customize their forms to collect specific information from users. It empowers them to create complex and user-friendly forms effortlessly, with the ability to display conditional fields, manage submissions, and handle form validation. These customizable forms can then be connected to CiviCRM, ensuring a seamless transfer of data from the website to the CRM system.

This plugin serves as a valuable tool for organizations and businesses that rely on the combined power of Ninja Forms and CiviCRM. It enables users to leverage the full potential of their online forms by integrating them with the comprehensive CiviCRM platform, maximizing efficiency, and streamlining data management. It eliminates the need for manual data entry, minimizing human error and saving valuable time and resources.

Overall, this plugin for WordPress, Ninja Forms CiviCRM, simplifies the process of connecting and updating CiviCRM accounts through the Ninja Forms plugin. It provides a seamless integration between form submissions on a WordPress website and the CiviCRM database. By automating the transfer of data, this plugin streamlines the management of contacts, contributions, memberships, and events. With its user-friendly interface and customizable form options, it offers a powerful tool for organizations seeking to optimize their constituent relationship management processes.

Specifications:

Release date: 11-10-2020
Last updated: 31-01-2023
Type: Paid
License: GPL 
Subject: Administration for Ninja Forms
Compatibility: W5.x W6.x
Includes: Plugin
Language packs: English
Developer: Ninja Forms

Rating:
4.419512195122 1 1 1 1 1 (205 Votes)

Download by subscription!

You need to log in on the site and purchase a club subscription!

Share with your friends!

 

How to Set Up and Use Ninja Forms CiviCRM

Ninja Forms CiviCRM is not meant to create just another contact form. Its job begins when someone submits the form: data from a familiar WordPress form needs to reach CiviCRM in a useful format, find an existing contact or create a new one, receive the right classifications, and leave a trail your team can use to understand what happened. This guide walks through the process, from checking the connection to building an event signup form that adds people to the right group without creating obvious duplicates.

There is more to this integration than clicking through the interface. Before you start, decide which fields identify a person, which values can be updated, when a visitor should actually be added to a group, and when it is better to save the request for manual review. Those decisions have a greater impact on the quality of your CiviCRM database than the form's appearance.

This guide is for WordPress sites that already use CiviCRM and need a managed way to collect data through Ninja Forms. We will cover installation, connection verification, the Add CiviCRM Contact action, field mapping, duplicate matching, groups, tags, activities, and event IDs. Then we will test the form both as a visitor and as an administrator.

Ninja Forms CiviCRM: how a form submission moves from WordPress to a CiviCRM contact and group
A guide to the data flow: the form collects information, the action maps it to CiviCRM, and you verify the outcome in the contact record.

What happens when someone submits the form

The most useful way to think about Ninja Forms CiviCRM is as a managed handoff between two different data models. On a WordPress page, visitors see fields that make sense to them: name, email address, phone number, city, inquiry topic, consent, or participation preference. In CiviCRM, those values should not simply sit in one string. A contact has a type and possibly a subtype, separate address and communication records, groups, tags, activities, and, depending on the use case, event participation.

The add-on adds the Add CiviCRM Contact action to the Ninja Forms builder. The official documentation describes three basic outcomes for this action: creating a contact, finding and updating a contact, and creating an activity linked to that contact. It also supports mapping core fields, communication details, and addresses; assigning a contact type, groups, and tags; adding notes; and registering someone using an event ID. That means a single form can serve as an event signup, a contact information update, or the first step in an inquiry to your organization.

Keep two separate responsibilities in mind. Ninja Forms handles the visitor's experience: the fields, which ones are required, the confirmation message, and how the form behaves on the page. CiviCRM determines what those values mean in the database. A field labeled "Phone" does not tell CiviCRM whether the number is for work or home. A visitor's interest in news does not automatically mean they should be added to a permanent group. The setup is reliable when each field has a clear purpose before you map it.

Input, rule, state change, and observable outcome

The add-on's core workflow has four parts. Input: a visitor submits a Ninja Forms form. Rule: the configured action reads the selected field values and maps them to CiviCRM fields; if duplicate matching is enabled, it first looks for a match. State change: a contact is created or updated, and an activity, group membership, tag, note, or event participation is added if needed. Observable outcome: CiviCRM shows the expected contact record with the right data, while WordPress and local diagnostics provide information to review if the action did not behave as expected.

This workflow helps prevent a common misunderstanding: a success message proves only that the form's front end responded successfully. It does not replace checking the contact in CiviCRM. For launch, what matters is not a polished thank-you page but one controlled test with a new person and another with an existing contact.

When this works better than a CiviCRM form

CiviCRM has its own public forms, profiles, donation pages, and event registration forms. Those are a good fit when CiviCRM's built-in workflow already meets your needs. Ninja Forms CiviCRM makes sense when your team needs the Ninja Forms builder specifically: the form should fit alongside regular WordPress content, use the site's fields and styling, and be edited in a familiar interface while still sending data to CiviCRM.

Common examples include a "Share new contact details" form, volunteer signup, consultation booking, partner inquiry, participant questionnaire, or newsletter signup with extra questions. In each case, it helps to separate the visitor-facing text and experience from the database structure. Visitors do not need to see internal group names, activity statuses, or classification terms. They fill out a short form, and the administrator gets a structured record.

Who should use this integration, and who should take another approach

Ninja Forms CiviCRM is a good fit for organizations that already use CiviCRM as their working source of contact data and need WordPress as a public entry point for requests. That could include nonprofits, communities, educational projects, clubs, associations, charities, and service organizations. The integration is especially useful when a form needs to do more than email a staff member: it should update a contact record carefully, classify an interest, and preserve the context of the inquiry.

The add-on can also work for a small team, as long as everyone is willing to define the rules first. You do not need a large CRM department to agree that email is the matching key, an address should be updated only when explicitly provided, a group should be assigned only when consent is given, and every incoming inquiry should create an activity of a specified type. On the other hand, do not start with the add-on if CiviCRM is installed only "for later," the contact model has not been discussed, and the form only needs to send one email to a shared inbox. In that case, the integration can quickly turn uncertainty into records that are difficult to clean up.

Signs this is a good fit

  • CiviCRM already has defined contact types, the necessary groups and tags, and at least one clear duplicate matching rule.
  • The team knows who reviews new inquiries and which fields they need to see in a contact record.
  • The form collects only information that has a business purpose, not every possible field "just in case."
  • You have a safe test address and a way to delete or flag a test record after verification.
  • The WordPress page can display the form without sending visitors to the CiviCRM administration interface.

When to pause before proceeding

If you need complex two-way synchronization between WordPress profiles and contact records, a single form is not the right solution. CiviCRM documents WordPress user and contact synchronization separately, with its own access and matching rules. Do not use a form as a substitute for a planned migration, either: bulk imports, database cleanup, and merging existing duplicates require a separate process and a backup.

Do not promise visitors instant membership approval, access to a restricted event, or another business outcome if the form action only creates a contact and activity. The add-on can record a request, but decisions about admission, payment, document review, or role assignment remain part of your CiviCRM workflow and your team's responsibilities. If a person will need manual review, a straightforward message such as "We received your request and will be in touch" is more accurate.

Map the data before opening the admin panel

Many setup problems start before anyone opens the form builder. An administrator sees a list of fields and starts matching them based on similar names. Instead, first make a short data map on paper or in a working document. For each form field, answer five questions: who enters the value, which CiviCRM field receives it, whether it is safe to update an existing record with it, whether it needs a separate linked record, and how you will verify the outcome.

A basic data map for an inquiry or signup form
Form fieldMeaning in CiviCRMRiskWhat to check after testing
First and last nameCore contact detailsAn incomplete name can make searches and duplicate review harderThe contact record contains the expected values
Email addressA separate communication method for the contactA typo can prevent email-based matchingThe address is saved under the right location type
Phone numberA linked phone number with a line typeIt may be unclear whether the number is for work or personal useThe contact record shows the right phone type
Interest or topicA tag, group, or activity detailsThe contact may be added to the wrong group automaticallyThe expected tag or activity is present, with no unintended assignments
ConsentA condition for adding someone to a groupConsent could be confused with general interestThe group changes only when the specified value is submitted

This map also helps identify unnecessary fields. If you cannot name an outcome you can verify for a question, it probably does not belong in the first version of the form. The fewer unused values sent to CiviCRM, the easier it is to explain why you collect them and the simpler it is to test updates to existing records.

Choose a matching key before mapping text fields

For most public forms, email is the first candidate for matching. The official add-on lets you search by email, name and email, or name and address. These are tradeoffs, not a list where the broadest search is always best. Matching on email alone is convenient for repeat inquiries but risky when people share a corporate inbox. Adding a name reduces the risk of a false match, but makes matching sensitive to how visitors enter their names. Matching on name and address is better suited to forms that collect a standardized, stable address.

Test the rule against two prepared contact records first. One should be an exact match; the other should have a similar name but a different email address. This will show whether the form might update the wrong person.

Use groups, tags, and activities for different purposes

These records look similar only at a glance. A group generally answers, "Which set of contacts does this person belong to?" A tag is useful for flexible labels such as a topic, source, or interest. An activity records the context of an action: an inquiry, call, request, assigned staff member, status, or details. Do not turn every form question into a tag. By the same token, you do not need a new group for every short campaign if a tag or activity would do.

Before you configure anything, write one sentence describing the purpose of each type of record. For example, the "Center News" group means someone has subscribed to that segment, the "Open House" tag means they are interested in a specific campaign, and the "Incoming Inquiry" activity means a staff member needs to follow up. If you cannot describe an item that clearly, hold off on configuring it.

What to check before installing and activating

The official Ninja Forms instructions identify two required components: CiviCRM for WordPress and the Ninja Forms CiviCRM add-on must both be installed and activated. This is a simple but important distinction: the CiviCRM action will not appear in the form builder just because the add-on's files are on the server. Before working on a form, make sure both components are enabled and that you can open their admin areas with an account that has the necessary permissions.

Environment checklist

  1. Open the WordPress admin area. Confirm that CiviCRM appears in the menu and that Ninja Forms opens its form list and builder.
  2. Check that the Ninja Forms CiviCRM add-on is active, not merely uploaded to the file system or available to install.
  3. Prepare a test contact in CiviCRM and note its name, email, groups, and tags before testing.
  4. Create or select a test group, tag, and activity type so you do not clutter working segments.
  5. Check your WordPress permalink settings. CiviCRM documentation warns that the Plain URL structure may be incompatible with some CiviCRM pages; for an integrated site, a standard readable permalink structure is a sensible choice.
  6. If the site uses a firewall or security plugin, have a way to check for blocked requests. CiviCRM documentation specifically notes that Wordfence may interfere after a fresh CiviCRM installation or a new installation of the security plugin.

Do not add a live form to your menu right away. Start with a draft page that your team can access. This is not about secrecy; it lets you test the field mappings separately from real submissions. Once real data starts coming in, you will not have to guess whether a record came from a test or a visitor.

Permissions and responsibilities

The person who configures the form does not necessarily need the same access to CiviCRM data. A site editor might handle the text, fields, and placement, while a CiviCRM administrator manages contact types, duplicate matching rules, and target groups. Dividing the work helps only if the handoff is clear: the editor should be able to report which field and value were submitted, and the administrator should be able to show which contact record received them and what state it is in.

Do not put administrative IDs, access keys, internal staff notes, or values visitors should not choose into a public form. If you need to pass internal context, first see whether you can express it in the action settings, such as by selecting an activity type or assigning a fixed tag or group. Keep the public form clear and focused.

Install the add-on and verify the connection

After installing and activating the components, do not start with a large form. The official documentation points to Ninja Forms > Settings > CiviCRM, where the add-on connects automatically and provides a Verify Connection button. This page can also show CiviCRM data available to the add-on, such as events and tags. Treat it as a diagnostic checkpoint between "all components are enabled" and "the form can actually use CiviCRM data."

Ninja Forms CiviCRM settings in WordPress, with connection verification and action selection
After activation, verify the connection first, then open the builder for the specific form.

How to interpret the connection check

Click Verify Connection and record the outcome before changing any form fields. If the check does not return the expected status, do not try to compensate by reinstalling components or editing files by hand. First check that both components are active, that your account has the right permissions, that the CiviCRM installation is working, and whether any security tools have reported a problem. Then return to the settings page. Recreating the form will not fix a connection problem in the add-on.

If the connection is verified, check one directory you plan to use, such as the list of tags, groups, or events. The goal is not to add every possible classification; it is to confirm that the add-on can see current CiviCRM records. If the value you need is missing, create or check it in CiviCRM first, then verify the connection again. Do not substitute a similar existing tag to work around a missing one.

Create a minimal form for the technical test

Create a new Ninja Forms form with fields for first name, last name, email address, and one topic field. Make the email address required. In the Ninja Forms builder, add fields from the fields tab; select a field to open its key settings. You do not need addresses, file uploads, calculations, or complex conditions for the first check. The priority is to see one clean record in CiviCRM.

Go to the Emails & Actions tab. The official Ninja Forms documentation notes that actions run when a form is submitted, and a new form typically includes a success message, an admin email, and a submission record. Those actions do not replace the CiviCRM integration. Add a new action in the action window and select Add CiviCRM Contact. If the action is missing, revisit the add-on and connection checks instead of substituting an email action at random.

Configure Add CiviCRM Contact without guesswork

The Add CiviCRM Contact action is not a single "send everything" field. It consists of separate settings where you choose a source from the form and a destination in CiviCRM for each type of data. Think of the setup as an agreement. On the left is a value entered by the visitor or already available in the form. On the right is the specific place where CiviCRM will save it. If the destination is unclear, do not create the mapping.

Map the core contact fields

In the core data mapping section, click the merge tag icon, choose a Ninja Forms field, and then select a CiviCRM contact field. The documentation recommends repeating this through (+) Add New for additional pairs. For a starter form, first name, last name, and one useful context field are usually enough, as long as that context field corresponds to an existing field in CiviCRM.

Do not create the same mapping twice "just to be safe." A duplicate mapping does not make the data more reliable, but it does make the outcome harder to troubleshoot. After adding each pair, ask yourself: what happens to the existing contact if the user leaves this field blank? If a blank value should not overwrite existing data, leave that field out of the first version until you understand how it behaves in your setup. Start by testing with both a complete and a partially empty set of data.

Contact type and subtype

The add-on lets you set a contact type and subtype from your CiviCRM setup. This is useful when the form is only for individuals, organizations, or households, or when the subtype has a lasting meaning. But a type should not stand in for an interest. "Webinar attendee" is usually an event, tag, or temporary group, not a permanent contact type. Choose a type that will still be accurate after the campaign ends.

For a first form, it is convenient to use one predefined type if it truly applies to everyone submitting it. If the form is for different categories of people, offer a choice only when visitors can select the right option. Do not show users internal database terminology without explaining it.

Email, phone, messaging app, and website

In CiviCRM, communication methods are configured separately. For email, the add-on lets you choose a form field and a location label, such as Billing or Home. The same approach applies to phone, messaging app, and website details: choose the form value, specify an appropriate label or type, and add another row only when there is a real need.

This level of detail matters because one person can have multiple ways to be reached. Do not turn a simple inquiry form into a lengthy questionnaire. In most cases, it is more sensible to ask for one email address and one phone number, if a phone number is actually needed for a reply. If the phone field is optional, do not make it required by your CiviCRM workflow without a business reason. Test different email and phone types only if your team will actually use them.

Addresses and the two-letter country code requirement

Address data maps to separate address fields, and you can leave fields you do not need blank. The key technical detail in the documentation is that CiviCRM expects a two-letter country code. The standard Ninja Forms Country field stores these codes as its value, so it is safer than a custom list that shows visitors a country's full name but sends different text.

If you use a custom Select field instead of the standard country field, enable developer mode to check the option values. Make sure each internal value is a valid two-letter code, not the visible label. Do not rely on how the form looks on the page. Open the test contact in CiviCRM and confirm that the country is recognized as a country record, rather than saved as an unclear string or left blank.

Ninja Forms CiviCRM field mapping for a contact, email address, address, and country code
Mapping does not transfer the "whole form" at once: each value has a specific destination and a verifiable outcome in CiviCRM.

Duplicate matching rules: protect the database without false updates

The action's advanced settings include the Use Dedupe Rule Group option. It determines how the form handles submitted data before creating a new contact. The default option, Do Not Use Dedupe Rule Group, creates a new contact without looking for a match. Other documented options include matching by name and email, email alone, or name and address. When a match is found, the add-on updates the existing contact instead of creating another one.

This is more than a switch to prevent duplicates. It affects the risk of overwriting data. A rule that is too broad may treat two different people as one; a rule that is too narrow may create multiple records for the same person. CiviCRM documentation explains that deduplication rules define what counts as a duplicate and can be used automatically or manually. Choose a rule based on the quality of your source data, not simply a desire to "remove all duplicates."

Choosing a rule for three common types of forms

Repeat inquiry using a known email address

If the form is for people who usually submit one stable personal email address, matching on Email will often behave as expected: a repeat inquiry updates the existing record. Before launch, though, test it against an actual test contact and check which fields change. If you collect free-text responses, send them to an activity or note rather than using them to replace core contact details.

Registration where a closer match matters

For event registration, starting with Name and Email makes sense if your database uses full names and visitors enter them separately. That adds a second matching criterion. Still, do not treat it as a guarantee: names can be entered in different ways, shortened, or mistyped. After testing, check both a correct match and a similar name with a different email.

A form that collects a full address

Name and Address makes sense only when the address is actually needed and its parts are entered consistently. It is usually excessive for a short signup form. If people enter the entire address on one line, differences in abbreviations and spelling can make matching unreliable. Do not make the form collect addresses just to use one matching option.

After launch, periodically review potential merges in CiviCRM instead of trying to resolve every ambiguous case automatically. CiviCRM documentation warns that merges cannot be undone without specific logging mechanisms and backups. That is a good reason to test the rule on one form before enabling the same automation across every public entry point.

Groups, tags, activities, and events: preserve the context of an inquiry

Once a contact has been created or matched, the next question is what CiviCRM should know about them. The add-on can create one activity, add the contact to a group, assign a tag, register the person using an event ID, and add a note to a record. These features work well together, but each should have a clear purpose before you enable it.

Add someone to a group based on a choice, not by default

To add someone to a group, first select the target CiviCRM group. You can then specify a form field and the value that should trigger the addition. For example, if the consent field has an option labeled "Yes," the contact is added to the group only when that option is selected. The documentation also lets you add multiple groups using the blue (+). That is useful for predefined segments, but it does not mean every form should connect to every working group.

Set up the condition so you can test it easily. Submit the form once with the value that allows the addition and once without it. After the first submission, the contact should appear in the test group. After the second, they should not. If the rule is not clear from the form itself, add a plain-language label next to the field so the visitor knows what their choice means.

Use tags for source and topic

You can configure a tag in much the same way: select one in CiviCRM and, if needed, specify a condition field and value. Tags work well for short labels such as "Source: consultation form," "Interest: course," or "Campaign: spring enrollment." They make records easier to find later without confusing them with ongoing group membership. If administrators have trouble explaining the difference between a group and a tag, document a naming rule internally before adding dozens of options.

Use activities as a work queue

The activity creation section links submitted data to an activity in CiviCRM. Choose form fields and an activity type or status from CiviCRM, then add the necessary rows using (+). This is especially useful for inquiries a staff member needs to handle: the contact record shows not only an updated email address but also why the person got in touch.

Do not put the entire inquiry into the contact's name or a tag. If a visitor asks a question, choose the activity type your team already uses for that kind of request and map the topic or comment to the activity details. That lets a coordinator handle the submission as a task without searching for free text across different contact fields.

Use events and notes only for a defined, confirmed workflow

The add-on can add a contact to an event using an event ID. You can enter the ID manually or pass it through a merge tag from a field value. This works when a form is for one specific event and the team knows which ID to use. If visitors choose an event themselves, do not hide the complexity behind an arbitrary text field. First decide how you will obtain and maintain the correct ID.

A note can have a subject and text entered manually or taken from a form field; you can also select the type of record it belongs to. A good use is saving a short comment that does not belong in the permanent profile. A poor use is duplicating every questionnaire field in a note. The clearer the note's purpose, the easier it is for staff to find and the lower the risk of copying sensitive information into several places unnecessarily.

Example workflow: event signup without duplicate contact records

Consider a form for an open workshop run by a community organization. It needs to collect a name, email, phone number, interest in future announcements, and a comment. If the person is not already in CiviCRM, they should become a new contact. If they already exist under the same email, their core details can be updated, and the new signup should be recorded as an activity. If they consent to announcements, they should also be added to the "Event News" group. This is a realistic use case because it tests field mapping, duplicate matching, conditional group membership, and the working context at the same time.

Prepare CiviCRM

  1. Create a test group with a name the team understands: "Event News - Test."
  2. Check whether there is an existing activity type for an incoming signup, or create an approved internal type according to your organization's guidelines.
  3. Select a test contact with a known email address and note its current phone number, groups, and tags.
  4. Make sure the selected contact type describes the people who will actually submit the form, not the name of the campaign.

Add fields in Ninja Forms

In the builder, create separate fields for first name, last name, email address, phone number, consent to announcements, and a large comment box. Require only the fields that are essential to the request. In this example, first name and email address are required. Leave the phone number optional if the team can reply by email. The comment should not block submission if it only helps staff prepare for a conversation.

Use labels people can understand. "Consent: 1" is convenient only for the administrator and makes mapping errors more likely. "I'd like to receive news about future workshops" is clearer. Check both the visible label and the option's internal value in advance: the internal value is what the group condition will use.

Configure the contact action and field mappings

On the Emails & Actions tab, add Add CiviCRM Contact. Map first and last name to the contact's core fields. In the appropriate section, set the email address as a communication method with the right location label. Map the phone number as a phone number, not a free-text note. Specify a contact type only if it is unambiguous for all visitors.

In the advanced section, choose the Email rule for this test setup if email is a reliable key in your database. This is a deliberate limitation of the example, not a universal rule. If different people might share an email address in your organization, stop and choose a more cautious strategy after testing with real but anonymized data.

Add an activity and a conditional group

Add one activity. Select the approved type and status, and map the form comment to the activity field that holds its details. This ensures that a new inquiry is not lost even when the contact already exists. Then, in the group section, choose the test group and set a condition: the consent field must equal the selected value that allows the addition. Unlike an unnoticed bulk addition, this rule is transparent and easy for both visitors and administrators to verify.

If needed, add one source tag, such as "Open Workshop Form." It can help distinguish this source from a phone signup or an import. Do not add several similar tags such as "workshop," "open workshop," and "workshop signup" unless the team can explain the difference.

Ninja Forms CiviCRM example: an event signup creates an activity and adds the contact to a group only when the condition is met
This example shows the difference between a contact record, an inquiry activity, and conditional addition to a segment.

Run two required tests

For the first test, use a new email address and submit the form with consent selected. Open CiviCRM and confirm that a new contact record appears, the email and phone are in the expected places, the activity is visible, and the contact has been added to the test group. Then submit the form using another new email address but without consent. Check that the contact and activity are created, but the group is not assigned.

For the second test, use the email address of a prepared existing contact. Note the original values before submitting. After the test, confirm that no second contact record was created and that only the expected fields changed. Check the activity separately. If you see an unexpected overwrite or duplicate, correct the rule and mappings first, then clean up test records according to your internal guidelines. Do not publish the form on the assumption that you can "sort out the database later."

Publish the form and verify it on the page

Once the CiviCRM action works, you can place the form on a page. Ninja Forms documents three main ways to add a form to a post or page: a shortcode, a Gutenberg block, or the Ninja Forms form inserter. Choose the method your editorial workflow already uses. A block is convenient for a regular page because the editor can see where the form sits; a shortcode may work better for a reusable block. The publishing method does not change how the CiviCRM action works.

The Publish button in the Ninja Forms builder saves the form and, if it is already on the site, makes the changes live. That is not the same as publishing a WordPress page. After saving, open Preview Changes, but do not stop there: the official Ninja Forms documentation explains that your theme controls the appearance of the temporary preview page. After previewing, visit the actual page and check the form in context, including its container, heading, width, and messages.

Check the form as a visitor

  • Make sure the visible field labels make sense to someone who does not know CiviCRM.
  • Require only fields that are truly necessary, and make the message for a missing value clear.
  • Submit the form with a new address and check for a double click or duplicate message.
  • Review the post-submission message: it should confirm receipt without promising something that requires manual review.
  • Check the form in the site theme and make sure the consent label is still visible and readable.

Check the form as an administrator

Open CiviCRM as soon as the form is submitted. A search should find the new or updated contact using the expected email address. Open the contact record and verify each item on your data map, not just that a record exists: name, email, phone type, address, group, tag, and activity. Then return to Ninja Forms and check the saved submission, if the form has a submission-recording action. New Ninja Forms forms usually have Record Submission enabled; the documentation recommends keeping it on if you want to collect submissions.

Comparing the two sources helps with troubleshooting. If values appear in the Ninja Forms submission but not in CiviCRM, the problem is in the action, mapping, or connection. If the values are already wrong in the saved submission, start by fixing the form field, its value, or its condition. This sequence helps you avoid changing several layers at once.

A form field is not the same as a contact record

An integration becomes fragile when form field names are treated as a ready-made CiviCRM data model. A field is just a way to collect one answer at a particular moment. A contact record lasts much longer: a coordinator may review it, it may be used in segments and interaction histories, and it may shape future conversations. Before adding a question, decide how long the answer should remain useful. A lasting fact about a person may belong in the contact record. The context of one inquiry usually belongs in an activity or note. A temporary interest may be better represented by a tag. Consent needs its own clear rule and should not be replaced by arbitrary text.

For example, "Which topic are you interested in?" could map to different records depending on why you are asking. If staff only need the answer for this conversation, send it to an activity. If it relates to a recurring campaign with a clear time frame, a tag may fit. If the answer gives someone access to an ongoing information segment, you can consider adding them to a group conditionally, after the relevant legal and organizational review. The same question on the form should not automatically be sent to all of these places at once.

A required field cannot fix a bad mapping

Making a field required only addresses a missing value on the page. It does not prove that an email address exists, that a phone number belongs to the submitter, or that you chose the right duplicate matching rule. Require a field only when the form cannot meet its stated purpose without it. For a callback request, a name, a way to reply, and clear consent to data processing, if your process requires it, are usually enough. Do not require an address, date of birth, organization, or phone number just because CiviCRM has a place for that information.

After marking a field as required, check both sides. The visitor should see a clear prompt before submitting the WordPress form, and CiviCRM should receive a value suitable for the selected field. This matters especially for lists. A visitor may see "Select a country," while the action receives the option's internal value. The page and database can each look correct on their own and still disagree at this hidden level.

Keep the form short and preserve context in CiviCRM

A short form does not have to mean a sparse CRM record. If staff need only an email address and a free-text comment to handle an inquiry, do not immediately ask the person for a full address, job title, website, messaging app, and phone number. Staff can request more details later if needed. A single activity with the topic and comment will make the first interaction clear. This reduces input errors, makes people more likely to finish the form, and avoids filling the database with incomplete contact records.

The shorter the form, the more important precise labels become. Do not call a field "Contact details" if it asks specifically for an email address. Do not label a checkbox "Yes" if selecting it adds someone to an information group. Visitors should understand what you are asking, and administrators should be able to tell from the field name what will appear in the saved submission.

Consent, local diagnostics, and data retention

A form that sends contact details to a CRM raises questions about storage and access. According to the official documentation, Ninja Forms CiviCRM stores submission diagnostic data locally to help troubleshoot errors. That information is not sent outside the server, and the Disable Storing Submission Diagnostic Data setting lets you turn off storage. When this setting is green, storage is disabled. This is a useful control, but the decision is not simply "always enable" or "always disable."

Make an informed decision about diagnostics

During initial testing, local diagnostics can help you connect a symptom to a specific submission. They are especially useful when Ninja Forms saved the data but CiviCRM did not show the expected outcome. Once the form is working, review your internal retention policy: what data ends up in the diagnostic record, who can read it, how long it should remain available, and how the team will respond to a request about someone's data. Do not make a legal claim in the public form unless the people responsible have approved it.

Disabling diagnostics may reduce the amount of technical information stored locally, but it can make future problems harder to investigate. Enabling diagnostics does not justify keeping the data indefinitely. A practical compromise is to define a rule: during launch, inspect and retain only what is needed for a controlled test, limit administrative access, and document how test data will be reviewed and cleared. Retention periods and legal grounds depend on your organization and jurisdiction, so they should not be inferred from a technical guide.

Keep consent separate from the technical handoff

If a visitor provides an email address, that may be enough to reply to their inquiry as requested. It does not necessarily mean they consent to being added to an ongoing information segment. Separate those intentions in the form. One clear part of the form collects a way to respond to the current request. Another part, if applicable, lets the visitor opt in to future messages. Only that second answer should control the conditional addition to the relevant group.

This separation also makes troubleshooting easier. If someone contacts support, the contact and activity should appear regardless of their consent to receive information. If they leave the checkbox blank, the absence of a group assignment is expected, not an error. Do not make staff guess from a comment whether someone wants to receive emails. An automated condition is safer when it follows an explicit field.

A safe organizational adjustment without code

This integration does not need an invented PHP snippet or a change to core files. The most useful reversible adjustment is to change the success message and the action's internal name so they reflect the actual workflow. In Ninja Forms, give visitors a neutral message confirming receipt, and use an approved activity type in CiviCRM that your team will recognize. This is based on the documented ability to create an activity and work with its type or status in the CiviCRM action.

The check is simple: submit a test form and confirm that the visitor is not given a false promise and that staff can find a clearly named activity in the contact record. Reverting is just as easy: restore the previous message or activity type in the form settings. This is safer than arbitrary code because it does not require changes to WordPress, Ninja Forms, or CiviCRM files.

How to manage changes after editing the form

A CiviCRM form can break through several small changes rather than one big decision: an editor renames a field, a marketer adds a list option, an administrator changes a tag, or a developer enables a security filter. Each change may seem local, but it can alter a value, condition, or action in the data flow. That is why a simple change-management routine matters after launch.

Change one part of the workflow at a time

If you want to add an "Organization" field, do not also change the duplicate matching rule, contact type, and groups. Add the field first and decide where it belongs. Then submit a test using a new email address. After that, repeat with an existing contact if the field can update a record. You can add a group condition as a separate change. This makes it easier to identify the cause if something goes wrong.

If the form is already receiving traffic, do not use the live page as a test environment. Record the current setup in a clear internal note: fields, mappings, duplicate rule, groups, tags, and activity purpose. Then test the revised version on a separate page. Once it passes, apply one change to the live form and run a quick test on the published page.

Field names are part of the integration contract

You can change the visible field label to make it clearer, but the internal values and mapping should not change without notice. Take extra care with lists and checkboxes. If a group condition expects the value "yes" and an editor changes it to "subscribe" or to a translated label, the visitor may still see the right text while the action stops adding people to the group. A similar issue can occur with the country field: the visible label stays the same, but the internal code changes by accident.

Before editing a list, write down three things: the label shown to the visitor, the internal value used by the condition, and the action that depends on that value. After the change, submit two forms using different options. It takes only a few minutes and can prevent weeks of unnoticed misclassification.

Keep a brief launch log

You do not need a complex project management tool. One internal note with the change date, purpose, affected fields, matching rule, expected outcome, and test contact name is enough. Do not put unnecessary personal data in the log. Its purpose is to make the test reproducible, not to copy submission contents.

When something goes wrong, the log gives you a starting point: was the last change to the page text, field list, CiviCRM action, security rules, or CiviCRM settings? The answer tells you where to look first. Without a log, teams often start deleting and recreating forms at random, which destroys evidence of the cause.

Test matrix: what should happen in each case

One successful test is not enough for an integration that can create and update contacts. Build a small matrix with known expected outcomes. It does not replace your organization's acceptance testing, but it makes the launch verifiable. Run all tests on an approved test page and with data you are allowed to use for this purpose.

A basic Ninja Forms CiviCRM test matrix
TestInputExpected outcome in CiviCRMWhat should not happen
New contactNew email, consent selectedOne contact record, an activity, and test group membership are createdNo second contact or unintended group
New contact without consentA different new email, consent not selectedA contact record and activity are createdNo addition to the information group
MatchEmail address for a contact created in advanceThe expected contact record is updated and a new activity is createdNo duplicate contact record
Similar personSimilar name, different emailA separate contact is created, or the expected matching rule behavior occursThe original contact record is not updated
Address checkAn address that includes a countryThe country is recognized and the address appears in the right placeNo unclear country value saved as plain text
Optional field left blankPhone number or comment omittedThe contact is processed using the core detailsNo unintended loss of important existing data

Write down the expected outcome first

Write down what you expect before submitting the form. "It should work" is not useful; "the test contact should not get a new record, an activity of type X should be created, and group Y should be added only when the value is Z" lets you identify success or failure in seconds. Give each test a number or neutral name in your documentation, but do not put technical notes containing personal data on a public page.

Check for the absence of unwanted outcomes as well as the expected ones. No extra contact, no group assigned without consent, no overwrite of an existing phone number, no accidental communication. This matters especially with automatic matching: an incorrect update may not become obvious until weeks later, when a staff member sees the combined history of two people.

Repeat the existing-contact test after every major change

It is easy to test only new email addresses: they reliably produce a clean new contact record. But Ninja Forms CiviCRM's key feature is that it can find and update a record using deduplication rules. That is why you should repeat the test with a prepared existing contact whenever you change name or email fields, address data, the matching rule, or an action that updates contact details.

Before the test, record the original values: phone, address, groups, tags, and activities. Afterward, compare not only the populated form fields but also the data that should not have changed. If the test reveals an unexpected effect, capture the configuration for your team before manually correcting the contact. Otherwise, you may erase the evidence and make it harder to reproduce the problem.

How this works with standard Ninja Forms actions

The CiviCRM integration does not replace standard form actions. A new Ninja Forms form usually has a success message, an admin email, and submission recording enabled by default. These actions serve different purposes. The message tells the visitor the form was received. The email can notify the responsible team. The submission record helps you compare the entered values with the outcome. The CiviCRM action sends and classifies the data in the CRM.

Do not treat an email as proof of success

An admin email is useful as an immediate notification, but it does not prove that the contact was created correctly in CiviCRM. It may arrive even when the mapping is wrong, land in spam, or fail to arrive because of a separate delivery issue. For the first few days after launch, it is useful to check the email, saved submission, and CiviCRM record together. Later, you can keep only the notification level your team actually needs.

If the email contains personal data, decide in advance who should receive it and what details they need. Do not copy every form field into it out of habit. A standard notification can simply say that a new request came in and direct staff to the approved place to handle it. The CRM should remain the source of structured information, not an attachment to an email thread.

Make sure the success message matches what happened

Since the CiviCRM action can create a contact, update one, or record an activity, the message shown to visitors should be neutral. Do not say "You are registered" if the form only submitted a request. Do not promise that someone has been added to a mailing list if consent still needs to be checked. Good messages are short: "Thanks, we received your request. We'll contact you at the address you provided." They match what happened on the page without making promises that conflict with the internal workflow.

If the form is used for an event with confirmed automatic registration, verify the outcome in CiviCRM before making the message more specific. The technical setup and the message to visitors need to agree; otherwise, one may promise more than the other delivers.

What to consider with your WordPress theme, cache, and security tools

Ninja Forms CiviCRM does not create a new site storefront or replace your WordPress theme. Visitors still see the form within the theme, so its width, field labels, focus behavior, message placement, and error clarity depend on the page styling. After changing a form, check it in the actual page or post template, not just in the builder preview.

Cache and test submissions

Do not assume the cache explains every problem. First find out what is being cached: the page HTML, form scripts, messages, or requests. If an editor just added a field but visitors still see the old form, first refresh the page without cache using the site's standard procedure. If the updated form appears but the data does not reach CiviCRM, go back to the saved submission, action, and connection instead of clearing the cache over and over.

Do not disable the site's entire cache for one form without coordinating with the team. A safer launch routine is to publish the change, clear the specific cache layer your team manages, and run one new-contact test and one matching test. If the problem continues, record the symptom and involve the person responsible for the site's infrastructure.

Security plugins and targeted exceptions

CiviCRM documentation says the Wordfence firewall may interfere after a fresh CiviCRM or Wordfence installation and recommends using learning mode for a limited time. That does not mean you should broadly disable security. A safer approach is to find the specific blocked request or event in the log, agree on a narrow, temporary change with the responsible specialist, run a test, and restore the usual protection right away.

If the form handles sensitive information, debugging and weakening security should especially not become permanent fixes. The goal of the launch is to show that the standard workflow works with reasonable safeguards, not to get a success message at any cost. After changing the security configuration, repeat the test matrix because a successful page response does not reveal every possible side effect.

Contact update forms: fewer fields, more caution

A contact update form may look like an inquiry form, but it carries more risk. An inquiry usually adds new information. In an update form, the visitor may replace a previously verified email address, phone number, or physical address. Combined with duplicate matching, that means a match to the wrong record will change it, not just add information. Do not build an update form on the principle that visitors should see every field available in the CRM.

Decide which data can be overwritten

Make two lists. The first should include information people can genuinely update themselves, such as a preferred email address or phone number. The second should cover information that requires manual review: organizational status, internal classifications, access rights, staff notes, and any data the form should not interpret without a staff member. Do not map the second list to public fields.

Even for simple fields, it is useful to update only what is necessary. If someone changes a phone number, do not make them re-enter their address. Do not use a blank field to overwrite an address, either. First test with a record that already has complete details: fill in just one optional field and confirm that the rest remain untouched. If the outcome differs from what you expect, reduce the number of mappings and investigate the behavior using a test record.

A match does not verify someone's identity

The Email or Name and Email rule can help select an existing contact based on form data, but it is not an identity verification process on its own. Do not use a public form with this rule for actions that change access rights, financial information, sensitive settings, or access to a restricted area. Those actions require a separate, approved authentication and verification workflow; they cannot be safely improvised with ordinary form settings.

For a routine contact information update, show visitors only the fields you are prepared to accept without further review. If more verification is needed, create an activity or save the request for review instead of changing a critical field automatically. This keeps the form convenient while reducing the risk of changing the wrong contact record.

Test with nearly matching data

For an update form, one test with an exact email match is not enough. Create a separate, safe test contact with a similar name but a different email. Try a variation with an extra space, different capitalization where your form allows it, or a slightly different spelling of the name. The goal is not to trick the system but to see the limits of the matching rule. If the outcome does not give you confidence, switch to a stricter process and ask the CiviCRM administrator to review the deduplication rules.

Using events, notes, and activities in one inquiry workflow

An event form can tempt you to combine every add-on feature in one configuration. Someone picks a date, leaves a comment, indicates interest in future events, and may already be in the database. To keep the setup clear, give each item a distinct role: participation belongs to a specific event, an activity records an inquiry or request, a note stores brief context, a group represents ongoing consent to a segment, and a tag helps identify a campaign or source.

The event ID is a technical boundary in the workflow

Ninja Forms documentation confirms that a contact can be added as a participant using an event ID entered manually or passed from a field value through a merge tag. This makes the feature suitable for a stable form for a single event when the team knows the ID in advance. But the ID should not appear to visitors as an unclear number. If people need to choose an event, show them a recognizable name, and have an administrator make sure the internal value corresponds to the right CiviCRM record.

Before publishing, run the two tests again. In the first, use a new contact and check that event participation appears. In the second, use an existing contact with a matching rule and confirm that the data is linked to the right record. For both tests, do not assume anything about statuses you have not explicitly configured. Check exactly what the form and action are supposed to do.

A note should not become a storage bin for the whole form

The note settings let you enter a subject and text manually or use a form value through a merge tag, and select the type of record the note belongs to. This is useful for a short, meaningful comment such as "Call after 6 p.m.," "Interested in accessibility," or "Question about the volunteer role." But there is usually no need to copy the name, email, phone, address, and entire form into a note. Those details already have their own fields, and duplicating them creates additional sources of inconsistency.

If the comment contains a question for a staff member to handle, an activity is often more useful. A note may be a better fit for context that matters to the contact record. Choose one approach and explain it to the team. Using both an activity and a note for the same text makes the history confusing and can turn a technically successful form into an inconvenient CRM workflow.

Make activities easy to verify

An activity is linked to a contact and can receive form data through separate mapping rows. That makes it useful for tracking a work queue: staff can see what happened, the type or status, and the text submitted with the request. A verifiable activity needs an approved type, a clear status, and enough context that staff do not have to open every submission. Avoid internal names like "form 7 result" because they will not mean anything a few months later.

After submission, do more than search for the contact. Open the contact's history and make sure the activity was created once, linked to the right record, and includes enough context to review. If updating a contact creates several identical activities, check whether the form was submitted more than once, duplicate actions are enabled, or the page allows a double click. Fix the cause of the repeated submission instead of only deleting the extra activity.

Hand the form off to the team after the technical launch

A technically correct setup will not be useful if staff do not know what to do with the data. Before handing the form to its process owner, describe the workflow briefly and without jargon: a visitor submits the form, CiviCRM creates or updates a contact according to the matching rule, an activity is created, and the person is added to a specific group if they meet the condition. Also say where to find the outcome and who should decide what to do if the match looks questionable.

Five questions for the process owner

  1. Who reviews a new activity, and how soon should they respond?
  2. Which group represents actual consent, and which is only a working segment?
  3. Which fields can a staff member correct manually, and which require a CiviCRM administrator?
  4. How should the team flag a questionable match from a form submission?
  5. Which single test should be run after a change to the form, theme, security settings, or CiviCRM rules?

These questions do not require a separate platform. They turn the configuration into a maintainable workflow. Without answers, the administrator may be the only person who understands the form, and any staff handoff becomes a risk to the data.

Signs the form is ready to go live

The form is ready when the team can reproduce and explain the outcome, not when every available field has been added. You should have verified the connection on the CiviCRM settings page, a basic field mapping, the behavior for new and existing contacts, conditional group membership, and activity creation. The success message should be clear and should not promise more than the workflow delivers. Someone should be responsible for daily follow-up.

After those checks, you do not need to keep changing the form in search of perfection. Review real outcomes that staff are authorized to see, note recurring cases, and plan changes deliberately. If people repeatedly ask the same additional question, that may be a reason to add a field. If staff never use a tag, remove it from the action. Integration quality improves through feedback from the workflow, not endless additions to the form.

Troubleshooting: symptoms, causes, checks, and safe fixes

Problems with this integration are easier to understand when you follow the data flow: WordPress page - saved submission - Ninja Forms action - CiviCRM contact record. Do not start by deleting plugins or cleaning up contacts in bulk. Reproduce one symptom with one test submission, compare the value at each stage, and change only the setting that explains the discrepancy.

Ninja Forms CiviCRM troubleshooting: check the connection, field mappings, duplicate rule, and contact record
This troubleshooting map helps distinguish page, mapping, duplicate-matching, and record-classification issues.

The CiviCRM action is missing from the form's action list

Symptom: Add CiviCRM Contact does not appear on the Emails & Actions tab. Likely cause: the add-on is inactive, CiviCRM for WordPress is inactive, or the installation has not finished initializing. What to check: confirm that both components are installed and active, then visit Ninja Forms > Settings > CiviCRM. Fix: restore the standard activation process and use Verify Connection before reopening the form. When to roll back: if the action disappeared after the plugin set changed, restore the last compatible set on a staging copy of the site instead of making blind changes on the live site.

The form shows success, but no contact record appears

Symptom: the visitor sees a confirmation message, but CiviCRM has no expected record. Likely cause: a success message confirms the form response but does not prove the contact was created; the issue may be with the connection, action, or mapping. What to check: the status from Verify Connection, the saved Ninja Forms submission, and the add-on's local diagnostic data. The official documentation says the add-on stores submission diagnostics locally and does not send them outside the server; you can disable this storage if needed. Fix: leave diagnostics enabled during the test, correct the specific field mapping or connection, and submit one new test request. When to roll back: if the problem started after a complex change, temporarily return to a minimal name-and-email mapping, confirm the basic workflow, and add the other records one at a time.

Duplicate records appear or the wrong record is updated

Symptom: a repeat submission creates a second contact, or changes someone else's data. Likely cause: matching is disabled, the selected rule is a poor fit, or field values are inconsistent. What to check: the Use Dedupe Rule Group setting, the test email, name, and address, and the actual CiviCRM deduplication rules. Fix: choose a better-fitting documented option and run both tests again: one correct match and one similar but different contact. When to roll back: if the new setting updates questionable records, disable automatic matching for this form and save new inquiries for manual review until the rule has been agreed upon.

The country or address is saved incorrectly

Symptom: the country is not recognized, the address is incomplete, or it appears in the wrong place. Likely cause: a custom list sends a country name instead of a two-letter code, or an address part is mapped to the wrong field. What to check: the internal values of the country field options, not just their visible labels. Fix: use the standard Ninja Forms Country field, or assign a valid two-letter value to each option and test again. When to roll back: if the address is not needed for the workflow yet, temporarily remove its mapping from the action instead of saving invalid data.

The contact is created but not added to the right group

Symptom: the contact record exists, but the test group does not. Likely cause: the condition does not match the consent field's internal value, the wrong group was selected, or the visitor did not choose the required option. What to check: the saved submission and the exact value evaluated by the condition. Fix: match the condition to the option's actual value, then test once with the value that allows the addition and once without it. When to roll back: if you cannot explain the condition to visitors, do not add people to the group automatically; save the request and establish a clear manual process.

Part of the public workflow stopped working after an update

Symptom: the form or a CiviCRM page behaves differently after an update or after security was enabled. Likely cause: an incompatible permalink structure, a security rule that interferes, or a change to another site component. What to check: WordPress permalink settings, the security plugin log, connection status, and a minimal test form. Fix: restore a readable permalink structure, use a security tool's learning mode only for a limited time and according to your own policy, then test again. When to roll back: if the security change opened access too broadly, restore the security rules and agree on a targeted exception with the security administrator instead of leaving protection weakened.

Do not delete duplicates in bulk while investigating the cause. First save an example that reproduces the problem, then use CiviCRM's approved merge and backup process.

Questions to answer before launching the form

Do I need to configure the CiviCRM connection separately?

According to the documentation, the add-on connects automatically after it is installed and activated on a site that has CiviCRM for WordPress. But an automatic connection still needs to be verified. Open Ninja Forms > Settings > CiviCRM and click Verify Connection before configuring the form. This is the first test, not a formality.

Can I connect an existing form to CiviCRM?

Yes. The official documentation says you can connect a new or existing form. Open it, go to Emails & Actions, and add the Add CiviCRM Contact action. Do not enable the integration on a live form without testing it on a separate page, though: its fields, labels, or values may not be suitable for reliable mapping.

Does the action only create new contacts?

No. The documented options include creating a contact, finding and updating an existing contact, and creating an activity linked to the contact. The mode depends on the duplicate matching setting. If you do not use a deduplication rule group, each inquiry creates a new record by default. Before launch, decide whether you need a new contact record or an update to an existing one.

Which email matching option should I choose?

The add-on offers matching by email alone, name and email, name and address, or no matching. The right option depends on your database. Email is often convenient for repeat inquiries, but it is not a good sole key if multiple people actually use the same address. Test any rule against two controlled contact records first. Do not copy the example in this guide without considering your own data.

Why does the country need a two-letter code?

That is the format CiviCRM expects when mapping an address. The standard Ninja Forms Country field already stores two-letter values. If you use a regular list field, check its internal values in developer mode and do not rely only on the text visitors see.

Can I add someone to a group only if they give consent?

Yes. The group settings let you select a group, a form field, and the value that triggers the addition. This is a good way to make the rule explicit and verifiable. Run one test with the value that allows the addition and another without it, then check the contact record.

Where should I look if CiviCRM did not receive the data?

First check the connection, then the saved Ninja Forms submission, and then the CiviCRM contact record. The add-on stores local submission diagnostics that may help troubleshoot errors. You can disable this storage, but during controlled testing it is useful to understand the consequences first. Do not make diagnostic data containing personal information publicly accessible.

Is the add-on suitable for event registration?

The documented feature lets you add a contact to an event using its ID, entered manually or passed from a field through a merge tag. This works for a clearly defined workflow with a verified ID. If registration involves payment, checking capacity, complex pricing, or confirmation, do not promise an outcome on the page unless your configured workflow supports it.

When Ninja Forms CiviCRM is a good choice

Ninja Forms CiviCRM works best when WordPress needs to collect a request in a visitor-friendly way and CiviCRM needs to save it as structured contact data and useful context for the team. Reliability comes from five decisions, not from the number of fields: what counts as a contact, how to find a match, what can be updated, when to add someone to a group, and how the team will verify the outcome.

If you have prepared a test form, verified the connection, mapped each field to a clear purpose, tested both a new and an existing contact, and checked the activity and group in CiviCRM, you can move on to the live page. Use download Ninja Forms CiviCRM to install and run your own test, but do not skip the controlled verification step. It is what makes a site form a reliable entry point to your CRM instead of a source of new mysteries in the database.

By OceanTheme.org Editorial Team

 

You are not logged in to post comments.