Flutter Dev

Flutter Dev

1602168660

Provide mobile number verification service to verify users with Flutter

truecaller_sdk

Flutter plugin that uses Truecaller’s Android SDK to provide mobile number verification service to verify Truecaller users.

This plugin currently supports only Android at the moment. v0.0.2 & above will allow you to verify both Truecaller as well as non-Truecaller users on your application. (v0.0.1 only allows you to verify users who have Truecaller Android app on their device and are logged-in). Verification via Truecaller SDK enables you to quickly verify/signup/login your users using their mobile number.

For more details, please refer here

Steps to integrate

1. Update pubspec.yaml:

Include the latest truecaller_sdk in your pubspec.yaml

dependencies:
  ...
  truecaller_sdk: ^0.0.2
  ...

2. Generate App key and add it to AndroidManifest.xml:

  • Register for Truecaller’s developer account, or login to your existing developer account.
  • Refer to the official documentation for generating app key.
  • Open your AndroidManifest.xml under /android module and add a meta-data element to the application element with your app key:
<application>  
...  
<activity>  
.. </activity>

<meta-data android:name="com.truecaller.android.sdk.PartnerKey" android:value="PASTE_YOUR_PARTNER_KEY_HERE"/>  
...  
</application>  

3. Make changes to MainActivity.kt:

  • Head to the MainActivity.kt under /android module
  • SDK requires the use of a FragmentActivity as opposed to Activity, so extend your MainActivity.kt with FlutterFragmentActivity.
  • Override function configureFlutterEngine(flutterEngine: FlutterEngine) in your MainActivity.kt:
class MainActivity: FlutterFragmentActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
    }
}
  • Update launchMode of MainActivity.kt to singleTask in AndroidManifest.xml :
<application>  
...  
<activity android:name=".MainActivity"
          android:launchMode="singleTask">
.. </activity>
...  
</application>  

4. Add required Permissions to AndroidManifest.xml:

Permissions are mandatory only if you are initializing the SDK with TruecallerSdkScope.SDK_OPTION_WITH_OTP in order to verify the non-Truecaller users.

For Android 8 and above :

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>

For Android 7 and below :

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

These permissions are required for the SDK to be able to automatically detect the drop call and complete the verification flow.

To read more about different scenarios for user verifications, click here.

Example 1 (to verify only Truecaller users having Truecaller app on their device)

// This Example is valid for truecaller_sdk 0.0.1 onwards 

//Import package
import 'package:truecaller_sdk/truecaller_sdk.dart';

//Step 1: Initialize the SDK with SDK_OPTION_WITHOUT_OTP
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP);

//Step 2: Check if SDK is usable
bool isUsable = await TruecallerSdk.isUsable;

//Step 3: If isUsable is true, you can call getProfile to show consent screen to verify user's number
isUsable ? TruecallerSdk.getProfile : print("***Not usable***");

//OR you can also replace Step 2 and Step 3 directly with this  
TruecallerSdk.isUsable.then((isUsable) {
 isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});

//Step 4: Be informed about the TruecallerSdk.getProfile callback result(success, failure, verification)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.success:
      print("First Name: ${truecallerSdkCallback.profile.firstName}");
      print("Last Name: ${truecallerSdkCallback.profile.lastName}");
      break;
    case TruecallerSdkCallbackResult.failure:
      print("Error code : ${truecallerSdkCallback.error.code}");
      break;
    case TruecallerSdkCallbackResult.verification:
      print("Verification Required!!");
      break;
    default:
      print("Invalid result");
  }
});

//Step 5: Dispose streamSubscription
@override
void dispose() {
  if (streamSubscription != null) {
    streamSubscription.cancel();
  }
  super.dispose();
}

Example 2 (to verify both Truecaller users (Example 1) and non-Truecaller users via manual verification)

// This Example is valid for truecaller_sdk 0.0.2 onwards 

//Import package
import 'package:truecaller_sdk/truecaller_sdk.dart';

//Step 1: Initialize the SDK with SDK_OPTION_WITH_OTP
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITH_OTP);

//Step 2: Call getProfile to show consent screen to verify user's number
//NOTE: isUsable will always return TRUE when using SDK_OPTION_WITH_OTP, so you can also call
//getProfile directly
TruecallerSdk.isUsable.then((isUsable) {
 isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});

//Step 3: Be informed about the TruecallerSdk.getProfile callback result via [streamCallbackData] stream 
//result could be either of (success, failure, verification)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.success:
    //If Truecaller user and has Truecaller app on his device, you'd directly get the Profile
      print("First Name: ${truecallerSdkCallback.profile.firstName}");
      print("Last Name: ${truecallerSdkCallback.profile.lastName}");
      break;
    case TruecallerSdkCallbackResult.failure:
      print("Error code : ${truecallerSdkCallback.error.code}");
      break;
    case TruecallerSdkCallbackResult.verification:
      //If the callback comes here, it indicates that user has to be manually verified, so follow step 4
      //You'd receive nullable error which can be used to determine user action that led to verification 
      print("Manual Verification Required!! ${snapshot.data.error != null ? snapshot.data.error.code : ""}");
      break;
    default:
      print("Invalid result");
  }
});

//Step 4: Initiate manual verification by asking user for his number
TruecallerSdk.requestVerification(phoneNumber: "PHONE_NUMBER");

//Step 5: Be informed about the TruecallerSdk.requestVerification callback result via [streamCallbackData] stream
//result could be either of (missedCallInitiated, missedCallReceived, otpInitiated, otpReceived, 
//verifiedBefore, verificationComplete, exception)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.missedCallInitiated:
      //Number Verification would happen via Missed call, so you can show a loader till you receive the call
      //You'd also receive ttl (in seconds) that determines time left to complete the user verification
      //Once TTL expires, you need to start from step 4\. So you can either ask the user to input another number
      //or you can also auto-retry the verification on the same number by giving a retry button
      print("${truecallerUserCallback.ttl}");
      break;
    case TruecallerSdkCallbackResult.missedCallReceived:
      //Missed call received and now you can complete the verification as mentioned in step 6a
      break;
    case TruecallerSdkCallbackResult.otpInitiated:
      //Number Verification would happen via OTP
      //You'd also receive ttl (in seconds) that determines time left to complete the user verification
      //Once TTL expires, you need to start from step 4\. So you can either ask the user to input another number
      //or you can also auto-retry the verification on the same number by giving a retry button
      print("${truecallerUserCallback.ttl}");
      break;
    case TruecallerSdkCallbackResult.otpReceived:
      //OTP received and now you can complete the verification as mentioned in step 6b
      //If SMS Retriever hashcode is configured on Truecaller's developer dashboard, get the OTP from callback
      print("${truecallerUserCallback.otp}");
      break;
    case TruecallerSdkCallbackResult.verificationComplete:
      //Number verification has been completed successfully and you can get the accessToken from callback
      print("${truecallerUserCallback.accessToken}");
      break;
    case TruecallerSdkCallbackResult.verifiedBefore:
      //Number has already been verified before, hence no need to verify. Retrieve the Profile data from callback
      print("${truecallerUserCallback.profile.firstName}");
      print("${truecallerUserCallback.profile.lastName}");
      print("${truecallerUserCallback.profile.accessToken}");
      break;
    case TruecallerSdkCallbackResult.exception:
      //Handle the exception
      print("${truecallerUserCallback.exception.code}, ${truecallerUserCallback.exception.message}");
      break;
    default:
      print("Invalid result");
  }
});

//Step 6: Complete user verification
//6a: If Missed call has been received on the same device, call this method with user's name
TruecallerSdk.verifyMissedCall("FIRST_NAME", "LAST_NAME");

//6b: If OTP has been initiated OR received on any device, call this method with the user's name & OTP received
TruecallerSdk.verifyOtp("FIRST_NAME", "LAST_NAME", "OTP");

//Step 7: Dispose streamSubscription
@override
void dispose() {
  if (streamSubscription != null) {
    streamSubscription.cancel();
  }
  super.dispose();
}
NOTE
  • For details on different kinds of errorCodes, refer here.
  • For details on different kinds of exceptions, refer here.
  • For details on Server Side Response Validation, refer here.
  • For sample implementations, head over to example module.

Customization Options

Language

To customise the profile consent screen in any of the supported Indian languages, add the following line before calling TruecallerSdk.getProfile:

/// initialize the SDK and check isUsable first before calling this method
/// Default value is "en" i.e English
TruecallerSdk.setLocale("hi") // this sets the language to Hindi

Dark Theme

You can also set the Dark Theme for consent screen by adding the following line before calling TruecallerSdk.getProfile:

/// initialize the SDK and check isUsable first before calling this method
TruecallerSdk.setDarkTheme 
Note

Dark Theme is not applicable for TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET

Consent screen UI

You can customize the consent screen UI using the options available in class TruecallerSdkScope under scope_options.dart and pass them while initializing the SDK.

  /// [sdkOptions] determines whether you want to use the SDK for verifying - 
  /// 1\. [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] i.e only Truecaller users
  /// 2\. [TruecallerSdkScope.SDK_OPTION_WITH_OTP] i.e both Truecaller and Non-Truecaller users
  ///
  /// NOTE: In truecaller_sdk 0.0.1, only
  /// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] is supported
  /// In truecaller_sdk 0.0.2 and onwards, both
  /// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] and [TruecallerSdkScope.SDK_OPTION_WITH_OTP] are supported
  ///
  /// [consentMode] determines which kind of consent screen you want to show to the user.
  /// [consentTitleOptions] is applicable only for [TruecallerSdkScope.CONSENT_MODE_POPUP]
  /// and [TruecallerSdkScope.CONSENT_MODE_FULLSCREEN] and it sets the title prefix
  /// [footerType] determines the footer button text. You can set it to
  /// [TruecallerSdkScope.FOOTER_TYPE_NONE] if you don't want to show any footer button
  /// There are some customization options applicable only for [TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET]
  /// which are following -
  /// [loginTextPrefix] determines prefix text in login sentence
  /// [loginTextSuffix] determines suffix text in login sentence
  /// [ctaTextPrefix] determines prefix text in login button
  /// [privacyPolicyUrl] to set your own privacy policy url
  /// [termsOfServiceUrl] to set your own terms of service url
  /// [buttonShapeOptions] to set login button shape
  /// [buttonColor] to set login button color
  /// [buttonTextColor] to set login button text color
  static initializeSDK(
          {@required int sdkOptions,
          int consentMode: TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET,
          int consentTitleOptions: TruecallerSdkScope.SDK_CONSENT_TITLE_GET_STARTED,
          int footerType: TruecallerSdkScope.FOOTER_TYPE_SKIP,
          int loginTextPrefix: TruecallerSdkScope.LOGIN_TEXT_PREFIX_TO_GET_STARTED,
          int loginTextSuffix: TruecallerSdkScope.LOGIN_TEXT_SUFFIX_PLEASE_LOGIN,
          int ctaTextPrefix: TruecallerSdkScope.CTA_TEXT_PREFIX_USE,
          String privacyPolicyUrl: "",
          String termsOfServiceUrl: "",
          int buttonShapeOptions: TruecallerSdkScope.BUTTON_SHAPE_ROUNDED,
          int buttonColor,
          int buttonTextColor})

By default, initializeSDK() has default argument values for all the arguments except the sdkOptions which is a required argument, so if you don’t pass any explicit values to the other arguments, this method will initialize the SDK with default values as above.

Note

For list of supported locales and details on different kinds of customizations, refer here

Download Details:

Author: truecaller

Source Code: https://github.com/truecaller/flutter-sdk

#flutter #dart #mobile-apps

What is GEEK

Buddha Community

Provide mobile number verification service to verify users with Flutter

Google's Flutter 1.20 stable announced with new features - Navoki

Flutter Google cross-platform UI framework has released a new version 1.20 stable.

Flutter is Google’s UI framework to make apps for Android, iOS, Web, Windows, Mac, Linux, and Fuchsia OS. Since the last 2 years, the flutter Framework has already achieved popularity among mobile developers to develop Android and iOS apps. In the last few releases, Flutter also added the support of making web applications and desktop applications.

Last month they introduced the support of the Linux desktop app that can be distributed through Canonical Snap Store(Snapcraft), this enables the developers to publish there Linux desktop app for their users and publish on Snap Store.  If you want to learn how to Publish Flutter Desktop app in Snap Store that here is the tutorial.

Flutter 1.20 Framework is built on Google’s made Dart programming language that is a cross-platform language providing native performance, new UI widgets, and other more features for the developer usage.

Here are the few key points of this release:

Performance improvements for Flutter and Dart

In this release, they have got multiple performance improvements in the Dart language itself. A new improvement is to reduce the app size in the release versions of the app. Another performance improvement is to reduce junk in the display of app animation by using the warm-up phase.

sksl_warm-up

If your app is junk information during the first run then the Skia Shading Language shader provides for pre-compilation as part of your app’s build. This can speed it up by more than 2x.

Added a better support of mouse cursors for web and desktop flutter app,. Now many widgets will show cursor on top of them or you can specify the type of supported cursor you want.

Autofill for mobile text fields

Autofill was already supported in native applications now its been added to the Flutter SDK. Now prefilled information stored by your OS can be used for autofill in the application. This feature will be available soon on the flutter web.

flutter_autofill

A new widget for interaction

InteractiveViewer is a new widget design for common interactions in your app like pan, zoom drag and drop for resizing the widget. Informations on this you can check more on this API documentation where you can try this widget on the DartPad. In this release, drag-drop has more features added like you can know precisely where the drop happened and get the position.

Updated Material Slider, RangeSlider, TimePicker, and DatePicker

In this new release, there are many pre-existing widgets that were updated to match the latest material guidelines, these updates include better interaction with Slider and RangeSliderDatePicker with support for date range and time picker with the new style.

flutter_DatePicker

New pubspec.yaml format

Other than these widget updates there is some update within the project also like in pubspec.yaml file format. If you are a flutter plugin publisher then your old pubspec.yaml  is no longer supported to publish a plugin as the older format does not specify for which platform plugin you are making. All existing plugin will continue to work with flutter apps but you should make a plugin update as soon as possible.

Preview of embedded Dart DevTools in Visual Studio Code

Visual Studio code flutter extension got an update in this release. You get a preview of new features where you can analyze that Dev tools in your coding workspace. Enable this feature in your vs code by _dart.previewEmbeddedDevTools_setting. Dart DevTools menu you can choose your favorite page embed on your code workspace.

Network tracking

The updated the Dev tools comes with the network page that enables network profiling. You can track the timings and other information like status and content type of your** network calls** within your app. You can also monitor gRPC traffic.

Generate type-safe platform channels for platform interop

Pigeon is a command-line tool that will generate types of safe platform channels without adding additional dependencies. With this instead of manually matching method strings on platform channel and serializing arguments, you can invoke native class and pass nonprimitive data objects by directly calling the Dartmethod.

There is still a long list of updates in the new version of Flutter 1.2 that we cannot cover in this blog. You can get more details you can visit the official site to know more. Also, you can subscribe to the Navoki newsletter to get updates on these features and upcoming new updates and lessons. In upcoming new versions, we might see more new features and improvements.

You can get more free Flutter tutorials you can follow these courses:

#dart #developers #flutter #app developed #dart devtools in visual studio code #firebase local emulator suite in flutter #flutter autofill #flutter date picker #flutter desktop linux app build and publish on snapcraft store #flutter pigeon #flutter range slider #flutter slider #flutter time picker #flutter tutorial #flutter widget #google flutter #linux #navoki #pubspec format #setup flutter desktop on windows

Terry  Tremblay

Terry Tremblay

1598396940

What is Flutter and why you should learn it?

Flutter is an open-source UI toolkit for mobile developers, so they can use it to build native-looking** Android and iOS** applications from the same code base for both platforms. Flutter is also working to make Flutter apps for Web, PWA (progressive Web-App) and Desktop platform (Windows,macOS,Linux).

flutter-mobile-desktop-web-embedded_min

Flutter was officially released in December 2018. Since then, it has gone a much stronger flutter community.

There has been much increase in flutter developers, flutter packages, youtube tutorials, blogs, flutter examples apps, official and private events, and more. Flutter is now on top software repos based and trending on GitHub.

Flutter meaning?

What is Flutter? this question comes to many new developer’s mind.

humming_bird_dart_flutter

Flutter means flying wings quickly, and lightly but obviously, this doesn’t apply in our SDK.

So Flutter was one of the companies that were acquired by **Google **for around $40 million. That company was based on providing gesture detection and recognition from a standard webcam. But later when the Flutter was going to release in alpha version for developer it’s name was Sky, but since Google already owned Flutter name, so they rename it to Flutter.

Where Flutter is used?

Flutter is used in many startup companies nowadays, and even some MNCs are also adopting Flutter as a mobile development framework. Many top famous companies are using their apps in Flutter. Some of them here are

Dream11

Dream11

NuBank

NuBank

Reflectly app

Reflectly app

Abbey Road Studios

Abbey Road Studios

and many more other apps. Mobile development companies also adopted Flutter as a service for their clients. Even I was one of them who developed flutter apps as a freelancer and later as an IT company for mobile apps.

Flutter as a service

#dart #flutter #uncategorized #flutter framework #flutter jobs #flutter language #flutter meaning #flutter meaning in hindi #google flutter #how does flutter work #what is flutter

Consumer Phone Lists | Buy Mobile Database | B2C Mobile Number Users

We all need a reason to smile right now. Even though it’s neither Christmas nor Halloween, it’s still the time to have fun. April Fool’s Day is coming! So, you’d better start thinking out practical jokes already. The Buy Mobile Database upcoming Laughter day offers businesses the Austria Business Phone List opportunity to generate their online Phone Number List awareness with hoaxes and original mischief. Want to be in the loop this year and pull it off? Various examples of April Fool’s day sale campaigns from globally-known brands are on the table today.

Love it or hate, the 500-year tradition of pulling someone’s leg will carry on. In a business niche as well. But you should Build Phone Number List REALLY walk on eggshells here. Any joke will fall flat if it doesn’t hit a chord with your audience. That’s why I provide you with these comic April Fool’s day marketing ideas many brands have brought. Enjoy! 1. Play the fool wisely Phone Number List April Fool’s Day marketing campaign by HelpCrunch Not every business risks its reputation and mocks itself. If a good Buy Mobile Database sense of humor, self-deprecation, and an excellent imagination are synonymous to you, take the following April Fool’s marketing endeavor into account. We at HelpCrunch know how to cheer you up this April 1st and show ourselves in a more fun light. Our team crafted this rib-tickler, cool, and absolutely one-of-a-kind alternative April Fool’s day homepage. Yes, we can laugh at ourselves in a professional and quick-witted manner

Let me walk you through our main name of the game. Every business strives to be serious-minded and rather formal. Marketing tries to highlight the product or service is unique and just…perfect. But here’s a twist: an ideal product does not exist. That’s Buy Austria Business Phone Numbers List why we made up Phone Number List our mind to tell you about our downsides upfront and honest, exaggerate them, and laugh. We may not be ideal, though we’re sincere and funny. Hopefully, customers will appreciate our sense of humor. We’ve spent 5 years building this platform…It’s still not even close to what we’ve imagined” – this is where the pun is totally intended. The team modified the content throughout the page in keeping with the best April Fools’ day marketing Phone Number List traditions. For instance, the CTA “Start 14-day free trial” is now changed to “Sign up and live dangerously” and the hero section has our team’s witty quotes. This is image title

If you Phone Number List like the idea and want to implement it with your brand, make sure you know exactly where the sweet spot is. Do as we do. For those who don’t feel like giggling and prefer rather serious air, there is Cell Phone Numebr list the “MAKE ME LAUGH” switch on our off-the-wall home page. Spread the word and celebrate Laughter day with HelpCrunch! 2. Announce a fake product April Fool’s marketing ideas are impossible to imagine Contact Us without the one from McDonald’s. These Phone Number List guys are real tricksters when it comes to this holiday. McDonald’s clearly understands its audience. The fast-food chain presented special “Sauce pots” several years ago. These were mini milkshakes for those who like dipping their fries in something sweet.

#cell #phone #number #list #cold #calling #list #mobile #number #database #mobile #number #list #smscampaignlist #telemarketinglist 

Brain  Crist

Brain Crist

1602147600

Flutter App Development Trends 2020

As the new decade dawns upon us, a slew of technologies has been making a lot of noise to grab the developers’ attention. While native app development is going strong, the trade winds are now blowing towards going cross-platform.

Adobe PhoneGap, React Native, Xamarin and Ionic are all leaving no stone unturned to be the undefeated champion of cross-platform development. Still, Google’s Flutter is all set to take them all on at once.

There are a tonne of resources available online to learn about Flutter, and you can start with this step by step flutter guide.

With reduced code development time, increased time-to-market speed, near-native performance, and a bevy of advantages under its hood, Flutter is set to dominate the market this decade.

Before we take a look at trends making the Flutter race ahead in 2020, let us do a quick recap of what Flutter is, for those who have been living under a rock.

#flutter #flutter-for-mobile-app #flutter-app-development #mobile-app-development #flutter-trends #software-development #advantages-of-flutter-mobile #pros-and-cons-of-flutter

Cell Phone Number List | Mobile Phone Numbers | Buy Mobile Database

Read on to understand the various stages of the sales funnel. Top of the funnel The top of the funnel is where it’s widest. Prospects are just learning about your products or services for the first time. They might land on your site through ads on social media networks, like Facebook and Instagram, or a Google search. Potential buyers aren’t yet ready to make a purchase at this point. They’re still looking for a Buy Mobile Database solution, so your job is to educate and inform. Middle of the funnel The middle of the funnel indicates that prospects are engaging with your brand. Examples include signing up for Contact Us your newsletter or reading through your blog posts. Prospective customers are closer to making a purchase at this stage, but they are still evaluating their options. Your main goal here is to develop further relationships with them.

The bottom of the funnel is where your most qualified prospects are. This is ultimately where you want leads to be, as Phone Number List they have shown the most interest. Prospects are ready to purchase at the given stage, but they might be considering other options on the market. This Buy Belgium Business Phone Numbers List is your opportunity to pull out all the stops and demonstrate the value of your offers. Now let’s look at how you can engage leads at each stage (and the tools you need). Awareness stage The awareness stage is when a prospect first learns about your brand. They may land on your website through an ad, a Google search, a post on social media, etc. The main goal here is to simply raise awareness and collect leads. The best way to engage leads in this stage is to educate your audience. Here are different types of content you can publish to build awareness for your brand. This is image title

Each post you publish gives you an opportunity to capture search engine traffic. Social media posts on Facebook or Twitter are another way you can attract leads. By sharing content about your business, you can increase Consumer Phone Lists brand awareness and establish authority. Infographics include visuals to communicate information on a topic in a concise and engaging manner. These typically compile data and facts from industry research. For the awareness stage, consider such tools as proactive live chat to engage with prospects. For example, if a visitor lands on a blog post or your homepage, you can reach out directly to them and offer help. helpcrunch proactive live chat HelpCrunch proactive chat Another engagement option here is adding triggered popups Contact Us to specific blog posts that invite visitors to download an eBook for free. The awareness stage’s goal is to provide answers and helpful content to the audience. Consider adopting a language tool like Grammarly to double-check your content for grammatical errors before you publish. Note! Don’t be overly aggressive. The last thing you want is to push prospects away. Always focus on providing value instead.

#cell #phone #number #list #cold #calling #list #mobile #number #database #mobile #number #list #smscampaignlist #telemarketinglist