<?xml version="1.0" encoding="UTF-8"?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
    http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
<section xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5.0" 
    xmlns:xl="http://www.w3.org/1999/xlink" 
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xsi:schemaLocation="http://docbook.org/ns/docbook ../../../content/dtd/docbook.xsd"
    xmlns="http://docbook.org/ns/docbook">
        <title>Marketing overview</title>
        <para>
            The overall purpose of the Marketing application is the support to select
            leads from parties obtained from a certain source or marketing
            segment to convert to opportunities by contacting these parties via a
            contact-list related to a marketing campaign.
            (contact-list generation support not yet implemented)
        </para>
        <para>
            The first option of the marketing application is the definition of a
            datasource [DataSource], and connecting or loading party information
            to it [PartyDataSource]. In the party application a data source Id can
            be added to the party.
        </para>
        <para>
            A second input to the marketing application is the Segment group and
            classification which again can be allocated to parties in the party
            component.
        </para>
        <para>
            Now a marketing campaign can be created. A contact list can be created
            using the parties related to a dataSource or marketing segment
            classification and referring back to the marketing campaign
        </para>
        <para>
            Contact lists are currently email mailinglists, the OFBiz system could be
            extended to include the support of calling by telephone and entering
            the results. On the email sent via this lists tracking codes can be
            used to measure the response when the readers of the email mailing
            click on a link where a trackingcode is specified.
            For more info look at the program:
            applications/marketing/src/org/apache/ofbiz/marketing/tracking/TrackingCodeEvents.java
        </para>
        <para>
            Opportunities resulting from these actions can be entered in the SFA
            web application referring back to the marketing campaign.
    </para>
    
    <xi:include href="HELP_MARKETING_main.xml" />
    <xi:include href="HELP_MARKETING_ContactLists.xml" />
    
</section>

