← All articles

CRM Integration

Dynamics 365 CRM Lead Capture

Auto-create CRM leads on form submit with UTM tracking, custom entity forms surfaced in Drupal for seamless lead management.

Published February 20, 2024
drupaldynamics-365crmlead-capturemarketing-automationoffice365utm-tracking

Overview

Dynamics 365 CRM integration transforms your Drupal site into a powerful lead generation machine. This solution automatically captures leads from web forms, preserves marketing attribution through UTM parameters, and provides seamless access to CRM data within the Drupal interface.

Features

  • Automatic lead creation from form submissions
  • UTM parameter tracking and attribution
  • Custom CRM entity forms in Drupal
  • Bi-directional data synchronization
  • Lead scoring and qualification
  • Campaign tracking integration
  • Duplicate detection and merging
  • Real-time CRM data access

Technical Details

Technologies: Dynamics 365 Web API, Microsoft Dataverse, Drupal Webform module, Drupal Form API, OAuth 2.0, JavaScript SDK

Requirements:

  • Drupal 9.x or 10.x with Webform module
  • Dynamics 365 Sales or Customer Service
  • Azure AD app registration
  • Dynamics 365 API permissions
  • SSL certificate for production

API Endpoints:

Create lead: POST /api/data/v9.2/leads
Update lead: PATCH /api/data/v9.2/leads({lead-id})
Query leads: GET /api/data/v9.2/leads?$filter=...
Associate entities: POST /api/data/v9.2/leads({lead-id})/leadtoopportunity_association/$ref

Implementation

  1. Configure Azure AD app with Dynamics 365 permissions
  2. Create custom Drupal module for CRM integration
  3. Implement Dynamics 365 Web API client
  4. Create Webform handler for lead capture
  5. Implement UTM parameter tracking
  6. Build field mapping configuration UI
  7. Add lead qualification workflows
  8. Implement duplicate detection logic
  9. Create custom entity form widgets
  10. Add comprehensive error handling and logging
<?php
// Example: Webform handler for Dynamics 365 lead capture
namespace Drupal\dynamics_integration\Plugin\WebformHandler;

use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;

/**
 * @WebformHandler(
 *   id = "dynamics_lead_capture",
 *   label = @Translation("Dynamics 365 Lead Capture"),
 *   category = @Translation("CRM"),
 *   description = @Translation("Captures form submissions as Dynamics 365 leads"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class DynamicsLeadCaptureHandler extends WebformHandlerBase {
  
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    $values = $webform_submission->getData();
    $dynamics_client = \Drupal::service('dynamics_integration.client');
    
    // Extract UTM parameters from session
    $session = \Drupal::request()->getSession();
    $utm_params = $session->get('utm_tracking', []);
    
    // Build lead data
    $lead_data = [
      'firstname' => $values['first_name'],
      'lastname' => $values['last_name'],
      'emailaddress1' => $values['email'],
      'telephone1' => $values['phone'] ?? '',
      'companyname' => $values['company'] ?? '',
      'description' => $values['message'] ?? '',
      // UTM tracking fields
      'cr96c_utm_source' => $utm_params['utm_source'] ?? '',
      'cr96c_utm_medium' => $utm_params['utm_medium'] ?? '',
      'cr96c_utm_campaign' => $utm_params['utm_campaign'] ?? '',
      'cr96c_utm_content' => $utm_params['utm_content'] ?? '',
      // Lead source
      'leadsourcecode' => 3, // Web
      'websiteurl' => \Drupal::request()->getSchemeAndHttpHost(),
    ];
    
    try {
      // Create lead in Dynamics 365
      $lead = $dynamics_client->createLead($lead_data);
      
      // Store CRM ID for reference
      $webform_submission->setElementData('crm_lead_id', $lead['leadid']);
      $webform_submission->save();
      
      \Drupal::logger('dynamics_integration')->info(
        'Created Dynamics 365 lead: @id',
        ['@id' => $lead['leadid']]
      );
      
    } catch (\Exception $e) {
      \Drupal::logger('dynamics_integration')->error(
        'Failed to create Dynamics 365 lead: @message',
        ['@message' => $e->getMessage()]
      );
      // Continue processing - don't fail form submission
    }
  }
}

Use Cases

  • B2B lead generation campaigns
  • Contact form lead qualification
  • Event registration and follow-up
  • Newsletter signup lead nurturing
  • Multi-touch attribution tracking

Benefits

  • Automated lead capture eliminates manual entry
  • Complete marketing attribution data
  • Real-time CRM data synchronization
  • Improved lead response times
  • Better campaign ROI measurement
  • Reduced data entry errors
  • Seamless marketing and sales alignment